尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Karmada ClusterOverridePolicy 端到端测试覆盖解析:从命名空间标签覆写到 image 覆写

Karmada ClusterOverridePolicy 端到端测试覆盖解析:从命名空间标签覆写到 image 覆写 Karmada ClusterOverridePolicy 端到端测试覆盖解析从命名空间标签覆写到 image 覆写【免费下载链接】karmadaOpen, Multi-Cloud, Multi-Cluster Kubernetes Orchestration项目地址: https://gitcode.com/GitHub_Trending/ka/karmada本篇技术指南基于 Karmada 仓库中的test/e2e/suites/base/coverage_docs/clusteroverridepolicy_test.md覆盖分析文档结合 clusteroverridepolicy_test.go 端到端测试源码、override_types.go API 类型定义及 CRD 清单系统讲解 ClusterOverridePolicy 的两大核心 e2e 场景命名空间标签覆写Plaintext Overrider与nil resourceSelectors 下的镜像覆写Image Overrider。读完本文你将掌握 ClusterOverridePolicy 的 API 结构、各 Overrider 类型的语义与执行顺序、e2e 测试的组织方式与断言思路并能在自己的多集群环境中复现与扩展这些测试场景。一、背景Karmada e2e 测试与覆盖文档体系Karmada 在test/e2e/suites/base/下按功能模块组织端到端测试每个测试文件对应一个coverage_docs/下的覆盖分析文档。覆盖文档采用测试用例 → E2E Describe 文本 → 注释的表格形式用于沉淀每个功能点的测试意图与验收标准方便后续维护者在修改行为时快速定位测试断言的依据。其中 clusteroverridepolicy_test.md 对应测试文件 clusteroverridepolicy_test.go覆盖了 ClusterOverridePolicy 的两类场景测试组测试用例E2E Describe 文本验收点The basic ClusterOverridePolicy testing验证 ClusterOverridePolicy 是否更新命名空间标签值Namespace labelOverride testing成员集群中命名空间出现自定义标签The ClusterOverridePolicy with nil resourceSelectors testing验证 nil resourceSelector 的 ClusterOverridePolicy 是否更新 Deployment 镜像值deployment imageOverride testing成员集群中 Deployment 镜像被改写为目标 registry 镜像这两条用例恰好代表了 ClusterOverridePolicy 最典型的两种用法通过plaintext覆写任意字段本例为/metadata/labels与通过imageOverrider覆写镜像的 registry 组件同时第二条用例专门验证了resourceSelectors为 nil 时的全局匹配语义。二、ClusterOverridePolicy 的 API 模型集群级覆写策略在深入测试之前先建立 ClusterOverridePolicy 的 API 心智模型。根据 override_types.go 与 CRD 清单ClusterOverridePolicy 属于policy.karmada.io/v1alpha1组集群作用域scope: Cluster短名为cop其Spec复用OverrideSpec结构。OverrideSpec的核心字段如下字段类型说明resourceSelectors[]ResourceSelector限制该覆写策略作用的资源范围nil 表示匹配所有资源这正是测试场景二验证的语义overrideRules[]RuleWithCluster针对目标集群的覆写规则集合RuleWithCluster内含targetCluster与overriderstargetCluster*ClusterAffinity已废弃v1.0 起请改用overrideRulesoverridersOverriders已废弃v1.0 起请改用overrideRulesOverrideSpec中与本文两条测试用例直接相关的Overriders支持七类覆写器且当同时存在多种覆写器时按固定顺序依次应用见 override_types.goimageOverrider—— 镜像覆写commandOverrider—— 容器 command 覆写argsOverrider—— 容器 args 覆写labelsOverrider—— 工作负载标签覆写annotationsOverrider—— 工作负载注解覆写fieldOverrider—— 任意资源结构化字段JSON/YAML覆写plaintext—— 基于 path/operator/value 的通用明文覆写所有覆写器的operator均在add、remove、replace三个取值内OverriderOpAdd/Remove/Replace见 override_types.go由 CRD 中enum约束校验。三、测试基础设施Ginkgo/Gomega 与公共框架两条测试用例都基于 Ginkgo v2github.com/onsi/ginkgo/v2与 Gomega 断言库编写并复用了test/e2e/framework与test/helper两个公共包。策略构造test/helper/policy.go中的 NewClusterOverridePolicyByOverrideRules 根据策略名、resourceSelectors、overrideRules构造ClusterOverridePolicy对象。策略创建/删除clusteroverridepolicy.go 中的CreateClusterOverridePolicy/RemoveClusterOverridePolicy通过 Karmada clientset 的PolicyV1alpha1().ClusterOverridePolicies()接口完成 CRUD并用gomega.Expect(err).ShouldNot(gomega.HaveOccurred())断言操作成功。集群客户端framework.GetClusterClient(clusterName)获取成员集群的客户端用于在成员集群侧校验覆写结果。这种控制面构造策略 → 等待资源分发 → 成员集群校验字段的三段式结构是 Karmada e2e 测试验证覆写功能的通用模式。四、场景一The basic ClusterOverridePolicy testing —— 命名空间标签覆写4.1 测试目标与准备该场景由ginkgo.Describe(The basic ClusterOverridePolicy testing)定义核心目的是验证ClusterOverridePolicy 能否在命名空间传播到成员集群后为其打上自定义标签。用例文本为Namespace labelOverride testing。测试准备阶段BeforeEach构造了一个随机命名空间与对应的 ClusterOverridePolicyclusteroverridepolicy_test.go命名空间名cop-test-ns-随机串自定义标签helloworldresourceSelectors精确匹配apiVersion: v1, kind: Namespace, name: ns名overrideRules[0].targetCluster通过ClusterAffinity.ClusterNames指定全部成员集群overriders.plaintextpath: /metadata/labelsoperator: addvalue: {hello: world}对应的 YAML 语义等价于apiVersion: policy.karmada.io/v1alpha1 kind: ClusterOverridePolicy metadata: name: cop-test-ns-random spec: resourceSelectors: - apiVersion: v1 kind: Namespace name: cop-test-ns-random overrideRules: - targetCluster: clusterNames: [member1, member2] # 依据测试环境实际成员集群 overriders: plaintext: - path: /metadata/labels operator: add value: {hello: world}4.2 生命周期管理与断言逻辑测试在第二个BeforeEach中按顺序完成资源创建并通过ginkgo.DeferCleanup注册清理动作clusteroverridepolicy_test.goframework.CreateClusterOverridePolicy创建策略framework.CreateNamespace在 Karmada 控制面创建命名空间触发传播清理时依次删除策略、删除命名空间并WaitNamespaceDisappearOnClusters等待成员集群上命名空间消失核心断言位于It(Namespace labelOverride testing)clusteroverridepolicy_test.go遍历所有成员集群用gomega.Eventually轮询等待集群中的命名空间出现且其Labels[hello]的值为world时判定通过。v, ok : clusterNs.Labels[customLabelKey] // customLabelKey hello if ok v customLabelVal { // customLabelVal world return true, nil }这里有两个值得注意的实现细节断言使用EventuallypollTimeout/pollInterval轮询因为命名空间的传播与覆写是异步过程必须等待控制面将改写后的对象同步到成员集群覆写发生在传播链路中因此成员集群上看到的已经是携带helloworld标签的命名空间验证了 ClusterOverridePolicy 在资源分发前的改写能力。五、场景二The ClusterOverridePolicy with nil resourceSelectors testing —— 镜像覆写5.1 测试目标验证 nil resourceSelectors 的全局匹配语义该场景使用framework.SerialDescribe串行执行定义用例文本为deployment imageOverride testing。其核心验证点是当 ClusterOverridePolicy 的resourceSelectors为nil时策略会匹配并作用于所有资源参见 override_types.go 中ResourceSelectors的注释 nil means matching all resources。这是 ClusterOverridePolicy 与 OverridePolicy命名空间级在无需精确指定资源时的重要能力一个集群级的全局覆写策略可以统一改写所有成员集群上的某种字段。5.2 测试准备Deployment PropagationPolicy ClusterOverridePolicyBeforeEachclusteroverridepolicy_test.go中构造了三类对象Deploymenttesthelper.NewDeployment使用deploymentNamePrefix 随机串命名PropagationPolicytesthelper.NewPropagationPolicyresourceSelectors精确匹配该 Deploymentplacement.clusterAffinity.clusterNames指向全部成员集群——保证 Deployment 会被传播ClusterOverridePolicyNewClusterOverridePolicyByOverrideRules(clusterOverridePolicyName, nil, ...)第一个参数之外的resourceSelectors显式传niloverrideRules中配置imageOverriderOverriders: policyv1alpha1.Overriders{ ImageOverrider: []policyv1alpha1.ImageOverrider{ { Predicate: policyv1alpha1.ImagePredicate{ Path: /spec/template/spec/containers/0/image, }, Component: Registry, Operator: policyv1alpha1.OverriderOpReplace, Value: fictional.registry.us, }, }, },对应的 YAML 语义apiVersion: policy.karmada.io/v1alpha1 kind: ClusterOverridePolicy metadata: name: deployment-name spec: # resourceSelectors 省略nil匹配所有资源 overrideRules: - targetCluster: clusterNames: [member1, member2] overriders: imageOverrider: - predicate: path: /spec/template/spec/containers/0/image component: Registry operator: replace value: fictional.registry.us5.3 ImageOverrider 字段语义结合 override_types.go 与 CRD 中imageOverrider的 schemacharts/karmada/_crds/bases/policy/policy.karmada.io_clusteroverridepolicies.yaml本用例使用的字段含义如下字段取值含义predicate.path/spec/template/spec/containers/0/image指明要改写哪个镜像字段若 predicate 为 nil系统会对 Pod/ReplicaSet/Deployment/StatefulSet/DaemonSet/Job 自动探测镜像路径componentRegistry镜像名按[registry/]repository[:tag]拆分为三部分此处只替换 registry 部分Registry/Repository/Tag三选一operatorreplace替换操作add/remove/replacevaluefictional.registry.us新的 registry 值add/replace时必填remove时忽略5.4 测试执行与断言镜像被改写为fictional.registry.us/nginx:1.19.0测试主体clusteroverridepolicy_test.go分为三步先创建 PropagationPolicy 与 Deployment用WaitDeploymentPresentOnClustersFitWith确认 Deployment 已分发到所有成员集群此刻镜像仍为原始值再创建 ClusterOverridePolicy观察覆写生效用WaitDeploymentPresentOnClustersFitWith轮询成员集群断言容器镜像等于fictional.registry.us/nginx:1.19.0func(deployment *appsv1.Deployment) bool { return deployment.Spec.Template.Spec.Containers[0].Image fictional.registry.us/nginx:1.19.0 }该断言同时验证了两件事覆写已传播到成员集群且只替换了 registry 组件repositorynginx与 tag1.19.0保持原样。测试末尾调用RemoveClusterOverridePolicy删除策略恢复集群状态。从源码结构可以推断该用例刻意先分发后建策略是为了证明ClusterOverridePolicy 对已分发资源同样具备事后覆写能力——策略的创建会触发对既有 ResourceBinding 的重新应用这与先有策略后传播的场景一形成了互补覆盖。六、如何运行与扩展这两类 e2e 用例6.1 运行前提与命令这两条用例属于test/e2e/suites/base下的基础功能测试运行前需准备Karmada 控制面含 kube-apiserver、controller-manager、至少一个已接入的成员集群、KUBECONFIG指向控制面。仓库提供的部署脚本可参考 local-up-karmada.sh 与 run-e2e.sh。聚焦本文件的运行方式依赖测试环境变量请以 run-e2e.sh 实际参数为准# 聚焦 ClusterOverridePolicy 相关用例示例具体 flag 以仓库脚本为准 go test ./test/e2e/ -ginkgo.focusClusterOverridePolicy -timeout 30m6.2 扩展建议基于现有测试骨架可以低成本扩展更多覆盖点覆写器矩阵仿照场景一为同一命名空间分别添加labelsOverrider、annotationsOverrider、fieldOverrider验证覆写器的叠加执行顺序image → command → args → labels → annotations → field → plaintexttargetCluster 过滤将overrideRules[].targetCluster.clusterNames改为仅指定部分成员集群断言仅目标集群被覆写、其余集群保持原值operator 变体将场景一的operator: add换成replace/remove验证标签更新的三种语义remove 镜像组件将imageOverrider.operator换为remove、component换为Tag验证镜像 tag 被剔除后的结果。七、小结通过 clusteroverridepolicy_test.md 这份覆盖文档我们梳理出 Karmada ClusterOverridePolicy 的两条核心 e2e 验收路径基础场景Namespace labelOverride testing通过plaintextoverrider 以add操作符为传播后的命名空间注入helloworld标签验证字段级通用覆写链路nil resourceSelectors 场景deployment imageOverride testing通过imageOverrider以replace操作符全局改写 Deployment 镜像的 registry 组件验证nil 匹配所有资源 已分发资源事后覆写语义。两条用例共同印证了 ClusterOverridePolicy 的核心设计集群级、可面向全部成员集群、可作用于任意资源的统一覆写能力。其类型定义位于 override_types.goCRD 全量 schema 位于 charts/karmada/_crds/bases/policy/policy.karmada.io_clusteroverridepolicies.yaml测试代码与公共框架分别在 clusteroverridepolicy_test.go 与 test/e2e/framework 中可作为后续扩展覆写测试或排查覆写行为的第一手参考。【免费下载链接】karmadaOpen, Multi-Cloud, Multi-Cluster Kubernetes Orchestration项目地址: https://gitcode.com/GitHub_Trending/ka/karmada创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表