機雷がなんだ! 全速前進!

SEというかプログラマというか、日々のエンジニア生活の中で体験したことなどを中心に書き残しています。

k8s でコアAPIか否かを確認する方法(kubectl api-resources)

k8s で以下の ClusterRoles などを定義する際に、対象リソースのAPI Groupが何か確認したい場合があります。(以下★★★のところ)

例(ClusterRoleのマニフェスト)

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: storage-admin
rules:
- apiGroups: [""]
  resources: ["persistentvolumes"]
  verbs: ["get", "watch", "list", "create", "delete"]
- apiGroups: ["storage.k8s.io"] ← ★★★これを知りたい★★★
  resources: ["storageclasses"]
  verbs: ["get", "watch", "list", "create", "delete"]

そんな時は、以下のコマンドでサクッと確認できます。

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
validatingadmissionpolicies                      admissionregistration.k8s.io/v1     false        ValidatingAdmissionPolicy
validatingadmissionpolicybindings                admissionregistration.k8s.io/v1     false        ValidatingAdmissionPolicyBinding
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
selfsubjectreviews                               authentication.k8s.io/v1            false        SelfSubjectReview
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/v2                      true         HorizontalPodAutoscaler
cronjobs                            cj           batch/v1                            true         CronJob
jobs                                             batch/v1                            true         Job
certificatesigningrequests          csr          certificates.k8s.io/v1              false        CertificateSigningRequest
leases                                           coordination.k8s.io/v1              true         Lease
endpointslices                                   discovery.k8s.io/v1                 true         EndpointSlice
events                              ev           events.k8s.io/v1                    true         Event
flowschemas                                      flowcontrol.apiserver.k8s.io/v1     false        FlowSchema
prioritylevelconfigurations                      flowcontrol.apiserver.k8s.io/v1     false        PriorityLevelConfiguration
gatewayclasses                      gc           gateway.networking.k8s.io/v1        false        GatewayClass
gateways                            gtw          gateway.networking.k8s.io/v1        true         Gateway
grpcroutes                                       gateway.networking.k8s.io/v1        true         GRPCRoute
httproutes                                       gateway.networking.k8s.io/v1        true         HTTPRoute
referencegrants                     refgrant     gateway.networking.k8s.io/v1beta1   true         ReferenceGrant
helmchartconfigs                                 helm.cattle.io/v1                   true         HelmChartConfig
helmcharts                                       helm.cattle.io/v1                   true         HelmChart
accesscontrolpolicies                            hub.traefik.io/v1alpha1             false        AccessControlPolicy
aiservices                                       hub.traefik.io/v1alpha1             true         AIService
apiaccesses                                      hub.traefik.io/v1alpha1             true         APIAccess
apibundles                                       hub.traefik.io/v1alpha1             true         APIBundle
apicatalogitems                                  hub.traefik.io/v1alpha1             true         APICatalogItem
apiplans                                         hub.traefik.io/v1alpha1             true         APIPlan
apiportals                                       hub.traefik.io/v1alpha1             true         APIPortal
apiratelimits                                    hub.traefik.io/v1alpha1             true         APIRateLimit
apis                                             hub.traefik.io/v1alpha1             true         API
apiversions                                      hub.traefik.io/v1alpha1             true         APIVersion
managedsubscriptions                             hub.traefik.io/v1alpha1             true         ManagedSubscription
addons                                           k3s.cattle.io/v1                    true         Addon
etcdsnapshotfiles                                k3s.cattle.io/v1                    false        ETCDSnapshotFile
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
ipaddresses                         ip           networking.k8s.io/v1                false        IPAddress
networkpolicies                     netpol       networking.k8s.io/v1                true         NetworkPolicy
servicecidrs                                     networking.k8s.io/v1                false        ServiceCIDR
runtimeclasses                                   node.k8s.io/v1                      false        RuntimeClass
poddisruptionbudgets                pdb          policy/v1                           true         PodDisruptionBudget
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
deviceclasses                                    resource.k8s.io/v1                  false        DeviceClass
resourceclaims                                   resource.k8s.io/v1                  true         ResourceClaim
resourceclaimtemplates                           resource.k8s.io/v1                  true         ResourceClaimTemplate
resourceslices                                   resource.k8s.io/v1                  false        ResourceSlice
priorityclasses                     pc           scheduling.k8s.io/v1                false        PriorityClass
csidrivers                                       storage.k8s.io/v1                   false        CSIDriver
csinodes                                         storage.k8s.io/v1                   false        CSINode
csistoragecapacities                             storage.k8s.io/v1                   true         CSIStorageCapacity
storageclasses                      sc           storage.k8s.io/v1                   false        StorageClass
volumeattachments                                storage.k8s.io/v1                   false        VolumeAttachment
volumeattributesclasses             vac          storage.k8s.io/v1                   false        VolumeAttributesClass
ingressroutes                                    traefik.io/v1alpha1                 true         IngressRoute
ingressroutetcps                                 traefik.io/v1alpha1                 true         IngressRouteTCP
ingressrouteudps                                 traefik.io/v1alpha1                 true         IngressRouteUDP
middlewares                                      traefik.io/v1alpha1                 true         Middleware
middlewaretcps                                   traefik.io/v1alpha1                 true         MiddlewareTCP
serverstransports                                traefik.io/v1alpha1                 true         ServersTransport
serverstransporttcps                             traefik.io/v1alpha1                 true         ServersTransportTCP
tlsoptions                                       traefik.io/v1alpha1                 true         TLSOption
tlsstores                                        traefik.io/v1alpha1                 true         TLSStore
traefikservices                                  traefik.io/v1alpha1                 true         TraefikService

これらの項目(列)のうち APIVERSION を確認するだけです。

ざっと表にまとめると以下のような感じです。

APIVERSION の例 API Group(apigroup) コアAPI? 説明
v1 (空=core API) YES Pod / Service など。
apiGroups: [""] を使う
apps/v1 apps NO Deployment / DaemonSet など
batch/v1 batch NO Job / CronJob など
storage.k8s.io/v1 storage.k8s.io NO StorageClass / CSI Driver など
rbac.authorization.k8s.io/v1 rbac.authorization.k8s.io NO ClusterRole / ClusterRoleBinding など
apiextensions.k8s.io/v1 apiextensions.k8s.io NO CustomResourceDefinition (CRD)
networking.k8s.io/v1 networking.k8s.io NO Ingress / NetworkPolicy など

つまり、

  • APIVERSION が v1 だけ → コア API
    → RBAC では apiGroups: [""]

  • APIVERSION が <group名>/v1 の形式 → 非コア API
    → RBAC では apiGroups: ["<group名>"]

ということです。

一度知ってしまえば簡単ですね。

補足

kubectl のバージョン で kubectl api-resources の結果が以下のように異なります。

1.26 以前の場合(古い)

NAME   SHORTNAMES   APIGROUP       APIVERSION   …

1.27以降の場合(今回)

NAME   SHORTNAMES   APIVERSION     …