【k8s深入理解之 Scheme 补充-6】理解资源外部版本之间的优先级

代码

go 复制代码
// 路径 mod/k8s.io/kubernetes@v1.29.0/pkg/apis/apps/install/install.go
// Package install installs the apps API group, making it available as
// an option to all of the API encoding/decoding machinery.
package install

import (
	"k8s.io/apimachinery/pkg/runtime"
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
	"k8s.io/kubernetes/pkg/api/legacyscheme"
	"k8s.io/kubernetes/pkg/apis/apps"
	"k8s.io/kubernetes/pkg/apis/apps/v1"
	"k8s.io/kubernetes/pkg/apis/apps/v1beta1"
	"k8s.io/kubernetes/pkg/apis/apps/v1beta2"
)

func init() {
	Install(legacyscheme.Scheme)
}

// Install registers the API group and adds types to a scheme
func Install(scheme *runtime.Scheme) {
	utilruntime.Must(apps.AddToScheme(scheme))
	utilruntime.Must(v1beta1.AddToScheme(scheme))
	utilruntime.Must(v1beta2.AddToScheme(scheme))
	utilruntime.Must(v1.AddToScheme(scheme))
	utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta2.SchemeGroupVersion, v1beta1.SchemeGroupVersion))
}

附录1 | observedVersions 记录注册顺序,versionPriority 记录优先级

observedVersionsversionPriority 的区别及作用

observedVersionsversionPriority 都是 Kubernetes Scheme 中用于管理 API 版本的字段,但它们有不同的用途和行为:

  1. observedVersions :
    • observedVersions 是一个记录已注册版本顺序的列表。它用于追踪哪些版本已经注册到 Scheme 中,并按注册的顺序维护一个列表。
    • 该字段的主要作用是记录版本的 注册顺序 。它帮助 Kubernetes 确定在执行版本转换(如 ConvertToVersion)时,应该按哪个顺序处理不同版本的类型。
    • 顺序observedVersions 确实有顺序,它的顺序是根据 API 版本注册的顺序来确定的。这意味着版本的顺序反映了它们在 Scheme 中被注册的时间先后。
  2. versionPriority :
    • versionPriority 是一个映射(map),记录每个组(Group)内的 API 版本的优先级顺序。它帮助 Kubernetes 确定在面对多个版本时,应该优先使用哪个版本。
    • 这个字段的作用是 管理版本的优先级 ,例如,当客户端或其他系统发起请求时,versionPriority 可以用于选择优先使用的版本。
    • 该字段的值是一个切片,表示版本的优先级顺序,优先级高的版本会排在前面,优先级低的版本排在后面。

observedVersionsversionPriority 的关系

  • observedVersions 记录了版本的注册顺序,并不直接涉及版本的优先级。它只关心版本是否已被注册以及注册的顺序。
  • versionPriority 则专注于版本之间的优先级关系,帮助确定在面对多个版本时,应该优先使用哪个版本。它是一个优先级映射,与版本的注册顺序无关。

举例说明

假设有如下的版本和优先级:

  • 注册的版本顺序为:v1, v2beta1, v1beta1
  • versionPriority 设定的优先级为:v2beta1 > v1 > v1beta1
observedVersions 示例

observedVersions 中,记录的是版本的注册顺序。比如:

go 复制代码
observedVersions := []schema.GroupVersion{
    {Group: "apps", Version: "v1"},
    {Group: "apps", Version: "v2beta1"},
    {Group: "apps", Version: "v1beta1"},
}
  • 这表示版本 v1 被最早注册,v2beta1 其次,v1beta1 是最后注册的。
  • 它仅仅记录了版本注册的顺序。
versionPriority 示例

versionPriority 中,记录的是版本的优先级顺序。例如:

go 复制代码
versionPriority := map[string][]string{
    "apps": {"v2beta1", "v1", "v1beta1"},
}
  • 这表示对于 apps 组,优先使用版本 v2beta1,其次是 v1,最后是 v1beta1
  • 这里的顺序反映了优先级,而非注册顺序。

哪个记录优先级?

  • versionPriority 是专门用来记录版本的 优先级 的。它定义了当有多个版本可用时,应该优先使用哪个版本。
  • observedVersions 只是记录了版本的 注册顺序,没有涉及优先级。

结论

  • observedVersions 有顺序,它记录了 API 版本被注册到 Scheme 中的先后顺序。
  • versionPriority 记录了版本的优先级,决定了在面对多个版本时哪个版本应该被优先选择。
  • 优先级versionPriority 管理,而 顺序observedVersions 管理。
相关推荐
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS2 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun2 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)2 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang2 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿3 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl3 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21