【k8s深入理解之 Scheme 补充-6】理解资源外部版本之间的优先级
代码
// 路径 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 记录优先级
observedVersions
和 versionPriority
的区别及作用
observedVersions
和 versionPriority
都是 Kubernetes Scheme
中用于管理 API 版本的字段,但它们有不同的用途和行为:
observedVersions
:observedVersions
是一个记录已注册版本顺序的列表。它用于追踪哪些版本已经注册到Scheme
中,并按注册的顺序维护一个列表。- 该字段的主要作用是记录版本的 注册顺序。它帮助 Kubernetes 确定在执行版本转换(如
ConvertToVersion
)时,应该按哪个顺序处理不同版本的类型。 - 顺序:
observedVersions
确实有顺序,它的顺序是根据 API 版本注册的顺序来确定的。这意味着版本的顺序反映了它们在Scheme
中被注册的时间先后。
versionPriority
:versionPriority
是一个映射(map),记录每个组(Group)内的 API 版本的优先级顺序。它帮助 Kubernetes 确定在面对多个版本时,应该优先使用哪个版本。- 这个字段的作用是 管理版本的优先级,例如,当客户端或其他系统发起请求时,
versionPriority
可以用于选择优先使用的版本。 - 该字段的值是一个切片,表示版本的优先级顺序,优先级高的版本会排在前面,优先级低的版本排在后面。
observedVersions
和 versionPriority
的关系
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
管理。