k8s RBAC-(授权) API资源查看及解释
查看 Kubernetes 的 API 有多种方法,包括使用命令行工具 kubectl
、查看 Kubernetes 官方文档或直接查询 API 服务器。以下是详细步骤:
1. 使用 kubectl api-resources
列出当前 Kubernetes 集群支持的所有 API 资源。
[root@master-1 ~]# kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 true Binding componentstatuses cs v1 false ComponentStatus configmaps cm v1 true ConfigMap endpoints ep v1 true Endpoints events ev v1 true Event limitranges limits v1 true LimitRange namespaces ns v1 false Namespace nodes no v1 false Node persistentvolumeclaims pvc v1 true PersistentVolumeClaim persistentvolumes pv v1 false PersistentVolume pods po v1 true Pod podtemplates v1 true PodTemplate replicationcontrollers rc v1 true ReplicationController resourcequotas quota v1 true ResourceQuota secrets v1 true Secret serviceaccounts sa v1 true ServiceAccount services svc v1 true Service mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition apiservices apiregistration.k8s.io/v1 false APIService controllerrevisions apps/v1 true ControllerRevision daemonsets ds apps/v1 true DaemonSet deployments deploy apps/v1 true Deployment replicasets rs apps/v1 true ReplicaSet statefulsets sts apps/v1 true StatefulSet tokenreviews authentication.k8s.io/v1 false TokenReview localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview horizontalpodautoscalers hpa autoscaling/v1 true HorizontalPodAutoscaler cronjobs cj batch/v1beta1 true CronJob jobs batch/v1 true Job certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest leases coordination.k8s.io/v1 true Lease bgpconfigurations crd.projectcalico.org/v1 false BGPConfiguration bgppeers crd.projectcalico.org/v1 false BGPPeer blockaffinities crd.projectcalico.org/v1 false BlockAffinity clusterinformations crd.projectcalico.org/v1 false ClusterInformation felixconfigurations crd.projectcalico.org/v1 false FelixConfiguration globalnetworkpolicies crd.projectcalico.org/v1 false GlobalNetworkPolicy globalnetworksets crd.projectcalico.org/v1 false GlobalNetworkSet hostendpoints crd.projectcalico.org/v1 false HostEndpoint ipamblocks crd.projectcalico.org/v1 false IPAMBlock ipamconfigs crd.projectcalico.org/v1 false IPAMConfig ipamhandles crd.projectcalico.org/v1 false IPAMHandle ippools crd.projectcalico.org/v1 false IPPool kubecontrollersconfigurations crd.projectcalico.org/v1 false KubeControllersConfiguration networkpolicies crd.projectcalico.org/v1 true NetworkPolicy networksets crd.projectcalico.org/v1 true NetworkSet endpointslices discovery.k8s.io/v1beta1 true EndpointSlice events ev events.k8s.io/v1 true Event ingresses ing extensions/v1beta1 true Ingress flowschemas flowcontrol.apiserver.k8s.io/v1beta1 false FlowSchema prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1beta1 false PriorityLevelConfiguration nodes metrics.k8s.io/v1beta1 false NodeMetrics pods metrics.k8s.io/v1beta1 true PodMetrics ingressclasses networking.k8s.io/v1 false IngressClass ingresses ing networking.k8s.io/v1 true Ingress networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy runtimeclasses node.k8s.io/v1 false RuntimeClass poddisruptionbudgets pdb policy/v1beta1 true PodDisruptionBudget podsecuritypolicies psp policy/v1beta1 false PodSecurityPolicy clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding clusterroles rbac.authorization.k8s.io/v1 false ClusterRole rolebindings rbac.authorization.k8s.io/v1 true RoleBinding roles rbac.authorization.k8s.io/v1 true Role priorityclasses pc scheduling.k8s.io/v1 false PriorityClass csidrivers storage.k8s.io/v1 false CSIDriver csinodes storage.k8s.io/v1 false CSINode storageclasses sc storage.k8s.io/v1 false StorageClass volumeattachments storage.k8s.io/v1 false VolumeAttachment
- NAME: 资源名称。
- SHORTNAMES: 缩写形式(如
po
是pods
的缩写)。 - APIVERSION: 对应资源的 API 版本(如
v1
,apps/v1
)。 - NAMESPACED: 是否是命名空间范围的资源。
- KIND: 资源类型。
2. 使用 kubectl api-versions
列出 Kubernetes 集群中支持的所有 API 版本:
kubectl api-versions
输出示例:
admissionregistration.k8s.io/v1 apiextensions.k8s.io/v1 apps/v1 authentication.k8s.io/v1 authorization.k8s.io/v1 autoscaling/v1 batch/v1 core/v1 ...
3. 使用 kubectl get --raw
直接与 API Server 通信获取详细信息:
kubectl get --raw / | jq
输出是一个 JSON 格式的响应,其中包含所有可用的 API 组和路径。
示例:
{ "kind": "APIGroupList", "groups": [ { "name": "apps", "versions": [ { "groupVersion": "apps/v1", "version": "v1" } ], ... } ] }
查看具体 API 组的资源:
获取某个 API 组(如 apps/v1
)的资源信息:
kubectl get --raw /apis/apps/v1 | jq
输出示例
[root@master-1 metrics-server]# kubectl get --raw /apis/metrics.k8s.io/v1beta1 | jq { "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "metrics.k8s.io/v1beta1", "resources": [ { "name": "nodes", "singularName": "", "namespaced": false, "kind": "NodeMetrics", "verbs": [ "get", "list" ] }, { "name": "pods", "singularName": "", "namespaced": true, "kind": "PodMetrics", "verbs": [ "get", "list" ] } ] }
rbac
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: metrics-server rbac.authorization.k8s.io/aggregate-to-admin: "true" rbac.authorization.k8s.io/aggregate-to-edit: "true" rbac.authorization.k8s.io/aggregate-to-view: "true" name: system:aggregated-metrics-reader rules: - apiGroups: - metrics.k8s.io resources: - pods - nodes verbs: - get - list - watch
疑问点:
1. "/apis/metrics.k8s.io", "/apis/metrics.k8s.io/v1beta1", 为什么在rules: - apiGroups: - metrics.k8s.io 可以省略写/apis/与版本号?
- apiGroups:
- metrics.k8s.io
解释:
在 Kubernetes RBAC 配置中,apiGroups
字段使用的是 逻辑 API 组名称,而不是 URL 路径。这是因为:
-
apiGroups
代表 API 组名称
例如,metrics.k8s.io
是一个 API 组的名称,而不是它的路径。Kubernetes 会根据这个名称自动匹配到实际的路径,例如/apis/metrics.k8s.io
或/apis/metrics.k8s.io/v1beta1
。 -
路径由 Kubernetes 内部映射处理
Kubernetes 会将逻辑 API 组名称解析到具体的 URL 路径。核心 API 的路径(如/api/v1
)和扩展 API 的路径(如/apis/metrics.k8s.io
)是由 Kubernetes 内部决定的,你只需要提供apiGroups
字段中的 API 组名称即可。
为什么可以省略 /apis/
?
/apis/
是所有扩展 API 的基础路径,但在apiGroups
中你只需提供组名称,如metrics.k8s.io
,Kubernetes 会自动补全路径。- 如果是核心 API 组(如
/api/v1
),则用空字符串""
表示。
2. apiGroups: [""]为空是什么意思?
在 Kubernetes RBAC (基于角色的访问控制) 中,apiGroups: [""]
表示该规则适用于 Kubernetes 核心 API 组 (Core API Group)。这是一个特殊的情况,因为核心 API 组的资源没有显式的 API 组名称。
详细解释
- 核心 API 组
-
核心 API 组包含 Kubernetes 中最基本的资源,例如:
pods
services
nodes
endpoints
configmaps
secrets
-
这些资源通过 Kubernetes 主 API 服务器的
/api/v1
端点暴露出来。 -
因为核心 API 组没有显式名称,所以在 RBAC 配置中使用空字符串
[""]
表示。
-
- 非核心 API 组
- 非核心资源属于特定的 API 组。例如:
apps/v1
(Deployment、StatefulSet 等)rbac.authorization.k8s.io/v1
(Role、ClusterRole 等)batch/v1
(Job、CronJob 等)- 这些 API 组需要显式指定在
apiGroups
字段中。 - 通配符 (
"*"
) 表示允许访问所有 API 组的资源。
- 非核心资源属于特定的 API 组。例如:
5. 使用 kubectl explain
查看资源及其字段的详细信息:
kubectl explain <RESOURCE>
例如,查看 Pod 的结构:
kubectl explain pod
查看字段的详细信息:
kubectl explain pod.spec
总结
- 快速查询 API 资源:
kubectl api-resources
和kubectl api-versions
。 - 详细资源信息:
kubectl explain
。 - 深入查询 API:
kubectl get --raw
和直接访问 API Server。
核心API组包含的资源 (V1.20.15)
/apis/v1 resouces: bindings componentstatuses configmaps endpoints events limitranges namespaces namespaces/finalize namespaces/status nodes nodes/proxy nodes/status persistentvolumeclaims persistentvolumeclaims/status persistentvolumes persistentvolumes/status pods pods/attach pods/binding pods/eviction pods/exec pods/log pods/portforward pods/proxy pods/status podtemplates replicationcontrollers replicationcontrollers/scale replicationcontrollers/status resourcequotas resourcequotas/status secrets serviceaccounts serviceaccounts/token services services/proxy services/status
其他API组包含资源
batch job extensions ingress networking.k8s.io ingressclasses ingress NetworkPolicy /apis/policy/v1beta1 poddisruptionbudgets PodSecurityPolicy /apis/rbac.authorization.k8s.io/v1 roles rolebindings clusterroles clusterrolebindings /apis/storage.k8s.io/v1 csidrivers csinodes storageclasses volumeattachments volumeattachments/status /apis/autoscaling/v1 horizontalpodautoscalers horizontalpodautoscalers/status /apis/autoscaling/v2beta1 horizontalpodautoscalers horizontalpodautoscalers/status /apis/autoscaling/v2beta2 horizontalpodautoscalers horizontalpodautoscalers/status