Kubernetes - 如何知道最新支持的 API 版本

Kubernetes - How to know latest supported API version

在给定 k8s 集群版本的情况下,是否有 table 可以告诉我应该使用哪一组 API 版本? Kubernetes 文档总是假设我总是有一个很好的、最新的集群(在撰写本文时为 1.12),但平台提供商并不总是生活在这个前沿,所以它很快就会变得令人沮丧。

更好的是,有没有 kubectl 命令我可以 运行 让我集群告诉我每种资源类型及其支持的最新 API 版本?

那将是 kubectl explain <resource> 命令。例如 pods:

$ kubectl explain pod
KIND:     Pod
VERSION:  v1   <==  API version

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion   <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

...

与部署类似:

$ kubectl explain deploy
KIND:     Deployment
VERSION:  extensions/v1beta1 <== API Version

DESCRIPTION:
     DEPRECATED - This group version of Deployment is deprecated by
     apps/v1beta2/Deployment. See the release notes for more information.
     Deployment enables declarative updates for Pods and ReplicaSets.

FIELDS:
   apiVersion   <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources
...

此外,这里是 v1.12 API reference 例如。

要获取所有资源类型及其最新支持版本的列表,运行以下内容:

for kind in `kubectl api-resources | tail +2 | awk '{ print  }'`; do kubectl explain $kind; done | grep -e "KIND:" -e "VERSION:"

它应该产生类似

的输出
KIND:     Binding
VERSION:  v1
KIND:     ComponentStatus
VERSION:  v1
KIND:     ConfigMap
VERSION:  v1
KIND:     Endpoints
VERSION:  v1
KIND:     Event
VERSION:  v1
...

正如@Rico 提到的,它们的关键在于 kubectl explain 命令。这可能有点脆弱,因为它取决于打印输出的格式,但它适用于 kubernetes 1.9.6

此外,可以从此处找到的 kubernetes API 文档(每个版本都有链接)以较低效率的方式收集信息 - https://kubernetes.io/docs/reference/#api-reference

我认为 kubectl api-versions 是一个更简单的选择:

 kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
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
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

对于 kubernetes-1。17.x(与上面发布的格式不同)

for i in `kubectl api-resources | grep -v KIND | awk '{print $NF}'`;do kubectl explain ${i} | grep -e "KIND:" -e "VERSION:"; echo '----'; done

每种类型将显示 api

如果您要将集群升级到给定的 Kubernetes 版本,您可以使用工具 - kubepug 作为升级前检查,以找出该版本的变化。 Link - https://github.com/rikatz/kubepug

您可以使用 Move2Kube 并在上下文中对 Kubernetes 集群执行 move2kube collect 以获得集群支持的所有类型版本。它按照从最新到最旧的顺序给出了一个种类支持的所有版本的有序列表。

它将为您提供以下信息:

apiVersion: move2kube.konveyor.io/v1alpha1
kind: ClusterMetadata
metadata:
  name: IBM-IKS
spec:
  storageClasses:
    - default
    - ibmc-block-bronze
    - ibmc-block-custom
    - ibmc-block-gold
    - ibmc-block-retain-bronze
    - ibmc-block-retain-custom
    - ibmc-block-retain-gold
    - ibmc-block-retain-silver
    - ibmc-block-silver
    - ibmc-file-bronze
    - ibmc-file-bronze-gid
    - ibmc-file-custom
    - ibmc-file-gold
    - ibmc-file-gold-gid
    - ibmc-file-retain-bronze
    - ibmc-file-retain-custom
    - ibmc-file-retain-gold
    - ibmc-file-retain-silver
    - ibmc-file-silver
    - ibmc-file-silver-gid
  apiKindVersionMap:
    APIService:
      - apiregistration.k8s.io/v1
    BGPConfiguration:
      - crd.projectcalico.org/v1
    BGPPeer:
      - crd.projectcalico.org/v1
    Binding:
      - v1
    BlockAffinity:
      - crd.projectcalico.org/v1
    CSIDriver:
      - storage.k8s.io/v1
      - storage.k8s.io/v1beta1
    CSINode:
      - storage.k8s.io/v1
      - storage.k8s.io/v1beta1
    CatalogSource:
      - operators.coreos.com/v1alpha1
    CertificateSigningRequest:
      - certificates.k8s.io/v1beta1
    ClusterInformation:
      - crd.projectcalico.org/v1
    ClusterRole:
      - rbac.authorization.k8s.io/v1
      - rbac.authorization.k8s.io/v1beta1
    ClusterRoleBinding:
      - rbac.authorization.k8s.io/v1
      - rbac.authorization.k8s.io/v1beta1
    ClusterServiceVersion:
      - operators.coreos.com/v1alpha1
    ComponentStatus:
      - v1
    ConfigMap:
      - v1
    ControllerRevision:
      - apps/v1
    CronJob:
      - batch/v1beta1
      - batch/v2alpha1
    CustomResourceDefinition:
      - apiextensions.k8s.io/v1
    DaemonSet:
      - apps/v1
    Deployment:
      - apps/v1
    EndpointSlice:
      - discovery.k8s.io/v1beta1
    Endpoints:
      - v1
    Event:
      - events.k8s.io/v1beta1
      - v1
    FelixConfiguration:
      - crd.projectcalico.org/v1
    GlobalNetworkPolicy:
      - crd.projectcalico.org/v1
    GlobalNetworkSet:
      - crd.projectcalico.org/v1
    HorizontalPodAutoscaler:
      - autoscaling/v1
      - autoscaling/v2beta1
      - autoscaling/v2beta2
    HostEndpoint:
      - crd.projectcalico.org/v1
    IPAMBlock:
      - crd.projectcalico.org/v1
    IPAMConfig:
      - crd.projectcalico.org/v1
    IPAMHandle:
      - crd.projectcalico.org/v1
    IPPool:
      - crd.projectcalico.org/v1
    Ingress:
      - networking.k8s.io/v1
      - networking.k8s.io/v1beta1
      - extensions/v1beta1
    IngressClass:
      - networking.k8s.io/v1
      - networking.k8s.io/v1beta1
    InstallPlan:
      - operators.coreos.com/v1alpha1
    Job:
      - batch/v1
    KubeControllersConfiguration:
      - crd.projectcalico.org/v1
    Lease:
      - coordination.k8s.io/v1beta1
      - coordination.k8s.io/v1
    LimitRange:
      - v1
    LocalSubjectAccessReview:
      - authorization.k8s.io/v1
      - authorization.k8s.io/v1beta1
    MutatingWebhookConfiguration:
      - admissionregistration.k8s.io/v1beta1
      - admissionregistration.k8s.io/v1
    Namespace:
      - v1
    NetworkPolicy:
      - networking.k8s.io/v1
    NetworkSet:
      - crd.projectcalico.org/v1
    Node:
      - v1
    Operator:
      - operators.coreos.com/v1
    OperatorGroup:
      - operators.coreos.com/v1
    PersistentVolume:
      - v1
    PersistentVolumeClaim:
      - v1
    Pod:
      - v1
    PodDisruptionBudget:
      - policy/v1beta1
    PodSecurityPolicy:
      - policy/v1beta1
    PodTemplate:
      - v1
    PriorityClass:
      - scheduling.k8s.io/v1beta1
      - scheduling.k8s.io/v1
    RBACSync:
      - ibm.com/v1alpha1
    ReplicaSet:
      - apps/v1
    ReplicationController:
      - v1
    ResourceQuota:
      - v1
    Role:
      - rbac.authorization.k8s.io/v1
      - rbac.authorization.k8s.io/v1beta1
    RoleBinding:
      - rbac.authorization.k8s.io/v1
      - rbac.authorization.k8s.io/v1beta1
    Secret:
      - v1
    SelfSubjectAccessReview:
      - authorization.k8s.io/v1
      - authorization.k8s.io/v1beta1
    SelfSubjectRulesReview:
      - authorization.k8s.io/v1
      - authorization.k8s.io/v1beta1
    Service:
      - v1
    ServiceAccount:
      - v1
    StatefulSet:
      - apps/v1
    StorageClass:
      - storage.k8s.io/v1
      - storage.k8s.io/v1beta1
    SubjectAccessReview:
      - authorization.k8s.io/v1
      - authorization.k8s.io/v1beta1
    Subscription:
      - operators.coreos.com/v1alpha1
    TokenReview:
      - authentication.k8s.io/v1
      - authentication.k8s.io/v1beta1
    ValidatingWebhookConfiguration:
      - admissionregistration.k8s.io/v1beta1
      - admissionregistration.k8s.io/v1
    VolumeAttachment:
      - storage.k8s.io/v1
      - storage.k8s.io/v1beta1