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

发布于:2024-11-29 ⋅ 阅读:(36) ⋅ 点赞:(0)

代码

// 路径 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 中,记录的是版本的注册顺序。比如:

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

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

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

哪个记录优先级?

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

结论

  • observedVersions 有顺序,它记录了 API 版本被注册到 Scheme 中的先后顺序。
  • versionPriority 记录了版本的优先级,决定了在面对多个版本时哪个版本应该被优先选择。
  • 优先级versionPriority 管理,而 顺序observedVersions 管理。