文章

Kubernetes API资源的查看和使用

在使用Kubernetes的时候,因为有太多的资源、太多的版本、太多的组了,这些都非常容易产生混淆。如果我们通过 YAML 文件定义过 Deployment 这样的资源清单文件的话,那么你应该会看到apiVersion: apps/v1beta2apiVersion: apps/v1等等这样的信息,那么我们到底应该使用哪一个呢?哪一个才是正确的呢?如何检查Kubernetes集群支持哪些?其实我们使用kubectl工具就可以来解决我们的这些疑惑。

当前我使用的Kubernetes的版本是1.18.8

API Resources

通过以下的命令来获取Kubernetes集群支持的所有 API 资源:

 $ kubectl api-resources -o wide
 NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND                             VERBS
 bindings                                                                      true         Binding                          [create]
 componentstatuses                 cs                                          false        ComponentStatus                  [get list]
 configmaps                        cm                                          true         ConfigMap                        [create delete deletecollection get list patch update watch]
 endpoints                         ep                                          true         Endpoints                        [create delete deletecollection get list patch update watch]
 events                            ev                                          true         Event                            [create delete deletecollection get list patch update watch]
 limitranges                       limits                                      true         LimitRange                       [create delete deletecollection get list patch update watch]
 namespaces                        ns                                          false        Namespace                        [create delete get list patch update watch]
 nodes                             no                                          false        Node                             [create delete deletecollection get list patch update watch]
 persistentvolumeclaims            pvc                                         true         PersistentVolumeClaim            [create delete deletecollection get list patch update watch]
 persistentvolumes                 pv                                          false        PersistentVolume                 [create delete deletecollection get list patch update watch]
 pods                              po                                          true         Pod                              [create delete deletecollection get list patch update watch]
 podtemplates                                                                  true         PodTemplate                      [create delete deletecollection get list patch update watch]
 replicationcontrollers            rc                                          true         ReplicationController            [create delete deletecollection get list patch update watch]
 resourcequotas                    quota                                       true         ResourceQuota                    [create delete deletecollection get list patch update watch]
 secrets                                                                       true         Secret                           [create delete deletecollection get list patch update watch]
 serviceaccounts                   sa                                          true         ServiceAccount                   [create delete deletecollection get list patch update watch]
 services                          svc                                         true         Service                          [create delete get list patch update watch]
 mutatingwebhookconfigurations                  admissionregistration.k8s.io   false        MutatingWebhookConfiguration     [create delete deletecollection get list patch update watch]
 validatingwebhookconfigurations                admissionregistration.k8s.io   false        ValidatingWebhookConfiguration   [create delete deletecollection get list patch update watch]
 customresourcedefinitions         crd,crds     apiextensions.k8s.io           false        CustomResourceDefinition         [create delete deletecollection get list patch update watch]
 apiservices                                    apiregistration.k8s.io         false        APIService                       [create delete deletecollection get list patch update watch]
 controllerrevisions                            apps                           true         ControllerRevision               [create delete deletecollection get list patch update watch]
 daemonsets                        ds           apps                           true         DaemonSet                        [create delete deletecollection get list patch update watch]
 deployments                       deploy       apps                           true         Deployment                       [create delete deletecollection get list patch update watch]
 replicasets                       rs           apps                           true         ReplicaSet                       [create delete deletecollection get list patch update watch]
 statefulsets                      sts          apps                           true         StatefulSet                      [create delete deletecollection get list patch update watch]
 tokenreviews                                   authentication.k8s.io          false        TokenReview                      [create]
 localsubjectaccessreviews                      authorization.k8s.io           true         LocalSubjectAccessReview         [create]
 selfsubjectaccessreviews                       authorization.k8s.io           false        SelfSubjectAccessReview          [create]
 selfsubjectrulesreviews                        authorization.k8s.io           false        SelfSubjectRulesReview           [create]
 subjectaccessreviews                           authorization.k8s.io           false        SubjectAccessReview              [create]
 horizontalpodautoscalers          hpa          autoscaling                    true         HorizontalPodAutoscaler          [create delete deletecollection get list patch update watch]
 cronjobs                          cj           batch                          true         CronJob                          [create delete deletecollection get list patch update watch]
 jobs                                           batch                          true         Job                              [create delete deletecollection get list patch update watch]
 certificatesigningrequests        csr          certificates.k8s.io            false        CertificateSigningRequest        [create delete deletecollection get list patch update watch]
 leases                                         coordination.k8s.io            true         Lease                            [create delete deletecollection get list patch update watch]
 endpointslices                                 discovery.k8s.io               true         EndpointSlice                    [create delete deletecollection get list patch update watch]
 events                            ev           events.k8s.io                  true         Event                            [create delete deletecollection get list patch update watch]
 ingresses                         ing          extensions                     true         Ingress                          [create delete deletecollection get list patch update watch]
 ingressclasses                                 networking.k8s.io              false        IngressClass                     [create delete deletecollection get list patch update watch]
 ingresses                         ing          networking.k8s.io              true         Ingress                          [create delete deletecollection get list patch update watch]
 networkpolicies                   netpol       networking.k8s.io              true         NetworkPolicy                    [create delete deletecollection get list patch update watch]
 runtimeclasses                                 node.k8s.io                    false        RuntimeClass                     [create delete deletecollection get list patch update watch]
 poddisruptionbudgets              pdb          policy                         true         PodDisruptionBudget              [create delete deletecollection get list patch update watch]
 podsecuritypolicies               psp          policy                         false        PodSecurityPolicy                [create delete deletecollection get list patch update watch]
 clusterrolebindings                            rbac.authorization.k8s.io      false        ClusterRoleBinding               [create delete deletecollection get list patch update watch]
 clusterroles                                   rbac.authorization.k8s.io      false        ClusterRole                      [create delete deletecollection get list patch update watch]
 rolebindings                                   rbac.authorization.k8s.io      true         RoleBinding                      [create delete deletecollection get list patch update watch]
 roles                                          rbac.authorization.k8s.io      true         Role                             [create delete deletecollection get list patch update watch]
 priorityclasses                   pc           scheduling.k8s.io              false        PriorityClass                    [create delete deletecollection get list patch update watch]
 csidrivers                                     storage.k8s.io                 false        CSIDriver                        [create delete deletecollection get list patch update watch]
 csinodes                                       storage.k8s.io                 false        CSINode                          [create delete deletecollection get list patch update watch]
 storageclasses                    sc           storage.k8s.io                 false        StorageClass                     [create delete deletecollection get list patch update watch]
 volumeattachments                              storage.k8s.io                 false        VolumeAttachment                 [create delete deletecollection get list patch update watch]
 ​

以上可以看到:

  • SHORTNAMES - 资源名称的简写,比如 deployments 简写就是 deploy,我们可以将这些快捷方式与kubectl一起使用

  • APIGROUP - 我们可以查看官方文档以了解更多信息,但简而言之,您将在yaml文件中使用它像apiVersion:<APIGROUP>/v1

  • KIND - 资源名称

  • VERBS - 可用的方法,在您想要定义ClusterRole RBAC规则时也很有用

您还可以选择获取特定 API 组的 API 资源,例如:

 $ kubectl api-resources --api-group apps -o wide
 NAME                  SHORTNAMES   APIGROUP   NAMESPACED   KIND                 VERBS
 controllerrevisions                apps       true         ControllerRevision   [create delete deletecollection get list patch update watch]
 daemonsets            ds           apps       true         DaemonSet            [create delete deletecollection get list patch update watch]
 deployments           deploy       apps       true         Deployment           [create delete deletecollection get list patch update watch]
 replicasets           rs           apps       true         ReplicaSet           [create delete deletecollection get list patch update watch]
 statefulsets          sts          apps       true         StatefulSet          [create delete deletecollection get list patch update watch]

Kubectl Explain

可以使用kubectl explain命令来获取有关的资源详细信息:

 $ kubectl explain deployment.spec
 KIND:     Deployment
 VERSION:  apps/v1
 ​
 RESOURCE: spec <Object>
 ​
 DESCRIPTION:
      Specification of the desired behavior of the Deployment.
 ​
      DeploymentSpec is the specification of the desired behavior of the
      Deployment.
 ​
 FIELDS:
    minReadySeconds  <integer>
      Minimum number of seconds for which a newly created pod should be ready
      without any of its container crashing, for it to be considered available.
      Defaults to 0 (pod will be considered available as soon as it is ready)
 ​
    paused <boolean>
      Indicates that the deployment is paused.
 ​
    progressDeadlineSeconds  <integer>
      The maximum time in seconds for a deployment to make progress before it is
      considered to be failed. The deployment controller will continue to process
      failed deployments and a condition with a ProgressDeadlineExceeded reason
      will be surfaced in the deployment status. Note that progress will not be
      estimated during the time a deployment is paused. Defaults to 600s.
 ​
    replicas <integer>
      Number of desired pods. This is a pointer to distinguish between explicit
      zero and not specified. Defaults to 1.
 ​
    revisionHistoryLimit <integer>
      The number of old ReplicaSets to retain to allow rollback. This is a
      pointer to distinguish between explicit zero and not specified. Defaults to
      10.
 ​
    selector <Object> -required-
      Label selector for pods. Existing ReplicaSets whose pods are selected by
      this will be the ones affected by this deployment. It must match the pod
      template's labels.
 ​
    strategy <Object>
      The deployment strategy to use to replace existing pods with new ones.
 ​
    template <Object> -required-
      Template describes the pods that will be created.

kubectl explain命令非常有用,特别是在我们不知道该如何编写YAML文件的时候,就可以使用改命令来帮助我们获得更多提示信息。

需要注意的是explain命令可能会显示旧的group/version,我们可以通过--api-version参数显示设置它,比如: 请注意,explain可能会显示旧组/版本,但您可以使用–api-version显式设置它,例如:

 $ kubectl explain deployment.spec --api-version apps/v1

API Versions

使用下面的命令来获取集群支持的所有 API 版本:

 $ kubectl api-versions
 admissionregistration.k8s.io/v1
 admissionregistration.k8s.io/v1beta1
 apiextensions.k8s.io/v1
 apiextensions.k8s.io/v1beta1
 apiregistration.k8s.io/v1
 apiregistration.k8s.io/v1beta1
 apps/v1
 authentication.k8s.io/v1
 authentication.k8s.io/v1beta1
 authorization.k8s.io/v1
 authorization.k8s.io/v1beta1
 autoscaling/v1
 autoscaling/v2beta1
 autoscaling/v2beta2
 batch/v1
 batch/v1beta1
 certificates.k8s.io/v1beta1
 coordination.k8s.io/v1
 coordination.k8s.io/v1beta1
 discovery.k8s.io/v1beta1
 events.k8s.io/v1beta1
 extensions/v1beta1
 networking.k8s.io/v1
 networking.k8s.io/v1beta1
 node.k8s.io/v1beta1
 policy/v1beta1
 rbac.authorization.k8s.io/v1
 rbac.authorization.k8s.io/v1beta1
 scheduling.k8s.io/v1
 scheduling.k8s.io/v1beta1
 storage.k8s.io/v1
 storage.k8s.io/v1beta1
 v1

输出结果是以group/version的方式呈现的,可以通过查看此页面了解更多有关Kubernetes中 API 版本控制的信息。

可以通过kubectl get <API_RESOURCE_NAME>.<API_VERSION>.<API_GROUP>来查看特定的group/version是否可以用于某些资源:

 $ kubectl get deployments.v1.apps -n kube-system
 NAME      READY   UP-TO-DATE   AVAILABLE   AGE
 coredns   2/2     2            2           52m

如果资源不存在指定的group/version组合或者资源根本不存在,我们将会收到错误信息:

 $ kubectl get deployments.v1beta.apps -n kube-system
 error: the server doesn't have a resource type "deployments"

总结

本文将帮助您了解 Kubernetes YAML 文件中的kindapiVersion这两个内容,在不同Kubernetes版本这两个字段会有所变更。

License:  CC BY 4.0