4. kubectl get 与版本显示:如何查看当前集群中存储对象的存储版本、使用 kubectl get crd 查看 CRD 版本
在 Kubernetes 集群运维中,确认存储对象的存储版本(storage version)是校准版本漂移的第一步。存储版本决定了对象在 etcd 中持久化的序列化格式,而 CRD(Custom Resource Definition)的版本则决定了自定义资源的 API 可用性。本节将系统讲解如何通过 kubectl get 命令族获取这两类关键版本信息。
4.1 查看内置资源的存储版本
对于 Deployment、ConfigMap、Secret 等内置资源,Kubernetes 在 API 发现信息中标注了每个资源的首选版本(preferred version)和存储版本。使用以下命令可以快速查看集群中所有 API 资源的版本信息:
# 查看所有 API 资源及其版本(含存储版本标记)
kubectl api-resources --verbs=list -o wide | grep -E 'STORAGEVERSION|true'
# 查看特定资源(如 Deployment)的存储版本
kubectl api-resources --api-group=apps -o wide | grep deployment
输出示例:
| NAME | SHORTNAMES | APIVERSION | NAMESPACED | KIND | STORAGEVERSION |
|---|---|---|---|---|---|
| deployments | deploy | apps/v1 | true | Deployment | apps/v1 |
| statefulsets | sts | apps/v1 | true | StatefulSet | apps/v1 |
关键判断: STORAGEVERSION 列显示的是该资源在 etcd 中实际存储的版本。如果该版本与集群中启用的 API 版本不一致,即存在版本漂移风险。
4.2 查看 CRD 的版本定义
CRD 的版本信息存储在 CRD 对象本身的 spec.versions 字段中。每个版本可以标记为 served: true/false(是否在 API 中提供)和 storage: true/false(是否为存储版本)。
# 列出所有 CRD 及其版本概况
kubectl get crd -o wide
# 查看特定 CRD 的详细版本定义
kubectl get crd <crd-name> -o yaml | grep -A 10 'versions:'
CRD 版本定义示例(YAML 片段):
spec:
versions:
- name: v1alpha1
served: true
storage: false
schema:
openAPIV3Schema:
type: object
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
版本漂移检查点: 确保只有一个版本标记为
storage: true。如果出现多个 storage 版本或 storage 版本已被弃用(served: false),则必须通过版本迁移校准。
4.3 查看 CRD 自定义资源的实际存储版本
对于 CRD 创建的自定义资源实例,其存储版本可以通过资源对象的 apiVersion 字段确认。但更可靠的方式是直接查看 etcd 中的原始数据:
# 查看自定义资源实例的 apiVersion(反映其存储版本)
kubectl get <custom-resource> <instance-name> -o json | jq '.apiVersion'
# 批量检查所有实例的存储版本分布
kubectl get <custom-resource> -A -o json | jq '.items[].apiVersion' | sort | uniq -c | sort -rn
输出示例:
47 "example.com/v1"
3 "example.com/v1alpha1"
版本漂移信号: 如果发现仍有实例使用旧版本(如 v1alpha1),而 CRD 的存储版本已升级到 v1,则这些实例在下次更新时会自动转换,但在读取时可能触发兼容性问题。建议在发布窗口内完成迁移。
4.4 存储版本查看流程总览
以下 SVG 图展示了从集群层面到资源实例层面的版本查看路径:
4.5 版本查看命令速查表
| 目标 | 命令 | 输出关键字段 |
|---|---|---|
| 内置资源存储版本 | kubectl api-resources -o wide |
STORAGEVERSION |
| CRD 版本定义 | kubectl get crd <name> -o yaml |
spec.versions[].storage |
| CRD 资源实例版本 | kubectl get <cr> -A -o json |
.apiVersion |
| 集群 API 版本总览 | kubectl api-versions |
版本列表 |
最佳实践: 在每次发布窗口节点排空前,执行上述命令生成版本基线快照。将快照与预期版本清单比对,即可快速定位存储版本漂移的资源和实例。