ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Operator SDK v1.5.0 升级指南:PROJECT 配置 3-alpha 稳定化、controller-runtime 升级与安全加固

Operator SDK v1.5.0 升级指南:PROJECT 配置 3-alpha 稳定化、controller-runtime 升级与安全加固 云原生后端开发工具微服务【免费下载链接】operator-sdkSDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.项目地址https://gitcode.com/gh_mirrors/op/operator-sdk点击查看免费下载Operator SDK v1.5.0 是一系列「稳定性里程碑」式升级的组合它把沿用已久的PROJECT配置文件版本3-alpha正式稳定为3同时为 Go 语言 Operator 引入非默认controller-managerServiceAccount、将 controller-runtime 提升到 v0.7.2并为 Ansible/Helm Operator 修正了存活/就绪探针路径的命名错误。本文以官方升级文档 v1.5.0.md 为主线结合当前仓库中config-3alpha-to-3命令的完整源码实现、单元测试用例与测试数据中的脚手架样例逐项讲解每一项升级的动机、操作步骤与底层原理帮助你将存量 Operator 项目平滑升级到 v1.5.0 及之后的新脚手架规范。升级前须知v1.5.0 的兼容性定位在动手之前先明确升级的整体策略。根据 upgrading-sdk-version 索引页 的说明Operator SDK 自 1.0.0 之后的次版本即 1.y向后兼容且严格增量backwards compatible and strictly additive。也就是说只有当你希望使用新特性时才需要用新版 Operator SDK 重新脚手架re-scaffold项目如果不需要新特性对于 Helm 或 Ansible Operator通常只需升级 Operator 镜像依赖并重新构建镜像即可。v1.5.0 之所以被官方标记为「破坏性」breaking升级唯一的原因是PROJECT配置文件此前默认以3-alpha版本生成虽然该版本在定义上属于 alpha 不稳定状态但它被operator-sdk命令默认使用因此需要提供明确的迁移路径。其余变更controller-runtime 升级、ServiceAccount 加固、探针路径修正均属于可以按需跟进的安全性与正确性改进。Go Operator将 PROJECT 配置迁移到稳定版 3为什么必须迁移3-alpha 已停止支持PROJECT文件是项目的配置核心它记录了项目脚手架所需的所有元数据domain、layout、resources、version等。在 v1.5.0 之前脚手架默认生成version: 3-alpha的配置v1.5.0 将这一配置版本正式稳定为 3version键的值并包含一组足以完整描述项目的配置字段。这一稳定的动机在于让PROJECT配置达到成熟稳定状态未来工具与辅助程序可以基于稳定的配置格式更方便地把项目升级到更高版本相关上游讨论见 kubebuilder 的 PR kubernetes-sigs/kubebuilder#1916。而从 v1.5.0 起3-alpha版本不再被operator-sdk支持——这一点在源码中有直接体现cmd.go 中定义了RootPersistentPreRun钩子只要在项目根目录读取到PROJECT且其version为3-alphaCLI 就会在每次命令执行前打印警告Config version 3-alpha has been stabilized as 3, and 3-alpha is no longer supported. Run operator-sdk alpha config-3alpha-to-3 to upgrade your PROJECT config file to version 3换言之迁移不是可选项而是继续使用operator-sdk命令的前提条件。一键迁移operator-sdk alpha config-3alpha-to-3官方提供了专门的迁移命令operator-sdk alpha config-3alpha-to-3。官方文档给出的完整流程如下$ cat PROJECT version: 3-alpha resources: - crdVersion: v1 ... $ operator-sdk alpha config-3alpha-to-3 Your PROJECT config file has been converted from version 3-alpha to 3. Please make sure all config data is correct. $ cat PROJECT version: 3 resources: - api: crdVersion: v1 ...从源码看该命令的实现非常直接cmd.go读取项目根目录下的PROJECT文件读取失败会提示config-3alpha-to-3 must be run from project root即必须在项目根目录执行通过getConfigVersion解析version字段若当前版本不是3-alpha则打印「not convertible at version x」并直接返回不会对文件做任何改动调用核心转换函数convertConfig3AlphaTo3生成新配置写回PROJECT权限 0666打印成功提示并提醒「请确认所有配置数据正确」。迁移命令做了什么源码实现解析convertConfig3AlphaTo3convert_config_3-alpha_to_3.go的转换逻辑可以拆解为几步① 版本号改写。通过正则version:[ ]*(?:)?3-alpha(?:)?将version: 3-alpha替换为带引号的version: 3versionRe.ReplaceAll。② 识别项目类型。读取layout字段以go.kubebuilder.io/前缀判断是否为 Go 项目。若是 Go 项目会进一步读取go.mod以获取 module pathgetModulePath用于在后续生成resources[*].path时拼接完整的包路径。③ 逐资源重组。对于每个资源条目命令会把原先平铺的字段重新组织为 v3 的嵌套结构group、version、kind直接保留存在crdVersion时生成api.crdVersion子结构存在webhookVersion时生成webhooks.webhookVersion子结构对 Go 项目按multigroup标志计算 API 路径多组项目为api/group/version单组项目为api/version再拼接 module path 得到path当资源没有crdVersion但group命中coreGroups映射表convert_config_3-alpha_to_3.go覆盖apps、batch、rbac.authorization、storage等 Kubernetes 内置组时会按「核心类型」处理设置domain: k8s.io与path: k8s.io/api/...。④ 模板化输出并原位替换。转换后的resources段由一份注释详尽的模板tmpl见 convert_config_3-alpha_to_3.go生成扫描器只替换resources:起始到下一个顶级键之间的区域保留PROJECT其余部分的注释与顺序。⑤ 无法自动转换处留下 TODO 注释。这是官方文档强调的「leave comments with directions where automatic conversion is not possible」的具体体现模板中会生成如下注释行# TODO(user): Uncomment the below line if this resources CRD is namespace scoped, else delete it. # namespaced: true # TODO(user): Uncomment the below line if this resource implements a controller, else delete it. # controller: true # TODO(user): Uncomment the below line if this resources webhook implements a conversion webhook, else delete it. # conversion: true这些注释由你根据项目实际情况决定是否启用是迁移后必须人工核对的重点。自动转换覆盖不到的「注释式」迁移点单元测试 convert_config_3-alpha_to_3_test.go 用四组用例no resources、basic、complex、no domain锁定了转换行为其中basicConfigExp展示了最典型的输出形态domain: example.com layout: ansible.sdk.operatorframework.io/v1 projectName: memcached-operator resources: - api: crdVersion: v1 # TODO(user): Uncomment the below line if this resources CRD is namespace scoped, else delete it. # namespaced: true # TODO(user): Uncomment the below line if this resource implements a controller, else delete it. # controller: true domain: example.com group: cache kind: Memcached version: v1alpha1 version: 3可以看到迁移后需要人工确认的点包括CRD 是否 namespace 作用域namespaced、资源是否实现了 controllercontroller、webhook 是否实现了 conversion/defaulting/validation。作为对照当前版本脚手架的PROJECT样例如 testdata/go/v4/memcached-operator/PROJECT中version: 3、嵌套的api.crdVersion、controller、webhooks等字段已是完整形态可以作为你迁移后配置的参考基准。迁移后的验证迁移完成后建议做以下检查cat PROJECT确认version: 3带引号且resources为嵌套结构运行任意operator-sdk命令如operator-sdk version确认不再出现3-alpha的警告提示检查模板生成的每条TODO(user)注释按项目实际启用或删除对应字段若项目包含多组multigroup资源核对path是否按api/group/version正确生成。(go/v3) 升级 controller-runtime 到 v0.7.2对于 Go 语言 Operatorgo/v3 插件脚手架v1.5.0 要求将 controller-runtime 升级到 v0.7.2。操作方式就是在项目根目录的go.mod中修改依赖版本sigs.k8s.io/controller-runtime v0.7.2具体做法通常是在项目根目录执行go get sigs.k8s.io/controller-runtimev0.7.2或手动编辑go.mod后运行go mod tidy然后重新编译并运行测试确认依赖树中 controller-runtime 的传递依赖均与 v0.7.2 兼容。此版本对应 Kubernetes 1.19 时代的 controller-runtime 稳定分支后续再升级时建议参照各版本官方升级指引逐级跟进。(go/v3) 为项目添加 controller-manager ServiceAccount动机共享命名空间下的安全加固v1.5.0 起operator-sdk init脚手架会默认生成一个非默认的controller-managerServiceAccount目的是提升部署在共享命名空间shared namespaces中 Operator 的安全性——不再使用命名空间默认的defaultServiceAccount避免与其他工作负载共享同一身份。如果你的项目是在 v1.5.0 之前初始化的需要手动补齐这一改动。四步迁移操作官方文档给出的完整操作如下# 第一步创建 ServiceAccount。 cat EOF config/rbac/service_account.yaml apiVersion: v1 kind: ServiceAccount metadata: name: controller-manager namespace: system EOF # 第二步将其加入 RBAC 资源清单。 echo - service_account.yaml config/rbac/kustomization.yaml # 第三步更新所有引用该 Operator ServiceAccount 的 RoleBinding / ClusterRoleBinding 的 subjects。 find config/rbac -name *_binding.yaml -exec sed -i -E s/ name: default/ name: controller-manager/g {} \; # 第四步在 manager Deployment 的 spec.template.spec 中补充 serviceAccountName。 sed -i -E s/([ ])(terminationGracePeriodSeconds:)/\1serviceAccountName: controller-manager\n\1\2/g config/manager/manager.yaml四个步骤的含义分别为创建资源文件新增config/rbac/service_account.yamlServiceAccount 名为controller-manager命名空间为system注册到 Kustomize在config/rbac/kustomization.yaml的resources列表中加入service_account.yaml否则kustomize build不会渲染该资源改绑定主体把所有 RBAC 绑定文件*_binding.yaml中subjects里的name: default批量替换为name: controller-manager确保角色权限授予到新的 ServiceAccount关联到工作负载在 Deployment 的 Pod 模板规格中设置serviceAccountName: controller-manager使 Manager 容器以该身份运行。预期变更 diff迁移完成后各文件应呈现如下差异摘录自官方文档# config/manager/manager.yaml requests: cpu: 100m memory: 20Mi serviceAccountName: controller-manager terminationGracePeriodSeconds: 10 # config/rbac/auth_proxy_role_binding.yaml name: proxy-role subjects: - kind: ServiceAccount - name: default name: controller-manager namespace: system # config/rbac/kustomization.yaml resources: - service_account.yaml - role.yaml - role_binding.yaml - leader_election_role.yaml # config/rbac/leader_election_role_binding.yaml name: leader-election-role subjects: - kind: ServiceAccount - name: default name: controller-manager namespace: system # config/rbac/role_binding.yaml name: manager-role subjects: - kind: ServiceAccount - name: default name: controller-manager namespace: system # config/rbac/service_account.yaml apiVersion: v1 kind: ServiceAccount metadata: name: controller-manager namespace: system当前脚手架中的落点当前仓库的测试数据可以作为这项改动的「完成态」参照在 testdata/helm/memcached-operator/config/rbac/service_account.yaml 中controller-managerServiceAccount 已是标准脚手架产物testdata/helm/memcached-operator/config/rbac/role_binding.yaml 的subjects也指向name: controller-managertestdata/helm/memcached-operator/config/manager/manager.yaml 中serviceAccountName: controller-manager与terminationGracePeriodSeconds: 10相邻出现正是文档中sed命令所要达成的最终布局testdata/helm/memcached-operator/config/rbac/kustomization.yaml 的resources列表首位即为service_account.yaml。迁移后可用kustomize build config/default校验渲染结果中三者是否一一对应。(ansible/v1, helm/v1) 交换存活/就绪探针路径对于 Ansibleansible/v1与 Helmhelm/v1插件脚手架的项目v1.5.0 修正了config/manager/manager.yaml中探针端点命名错误的问题此前的脚手架把livenessProbe与readinessProbe的 HTTP 路径写反了——虽然这一错位不会影响探针实际行为因为 Manager 内部同时暴露了/healthz与/readyz但语义上不正确需要交换两个探针的path。修正后的配置应为livenessProbe: httpGet: path: /healthz port: 6789 initialDelaySeconds: 15 periodSeconds: 20 readinessProbe: httpGet: path: /readyz port: 6789 initialDelaySeconds: 5 periodSeconds: 10即存活探针指向/healthz就绪探针指向/readyz两者均探测 6789 端口v1.5.0 时期 Manager 健康探针的默认监听端口。在当前版本脚手架的样例testdata/helm/memcached-operator/config/manager/manager.yaml中livenessProbe已正确对应path: /healthz、readinessProbe正确对应path: /readyz探测端口已随脚手架演进为 8081与--health-probe-bind-address:8081参数一致路径命名错误在后续版本中已被彻底修正可作为验证参照。升级完成后的检查清单完成 v1.5.0 的逐项升级后建议按以下清单做一次回归验证PROJECT 配置version为3无3-alpha残留resources结构符合嵌套规范所有TODO(user)注释已处理依赖版本go.mod中sigs.k8s.io/controller-runtime为v0.7.2go mod tidy后编译、单测通过RBAC 一致性config/rbac/kustomization.yaml包含service_account.yaml所有*_binding.yaml的 subjects 均指向controller-managerconfig/manager/manager.yaml中serviceAccountName与terminationGracePeriodSeconds并存探针配置livenessProbe→/healthzreadinessProbe→/readyz最终渲染kustomize build config/default输出中Deployment 引用的是controller-managerServiceAccount且与各 RoleBinding/ClusterRoleBinding 的 subjects 一一对应。这套升级路径覆盖了 Operator SDK 从 v1.4.x 走向 v1.5.x 的全部破坏性变更与安全加固要点是后续版本v1.6升级的基础完成 v1.5.0 迁移后项目即处于稳定 PROJECT v3 配置与新版安全脚手架的基线之上。赞分享云原生后端开发工具微服务【免费下载链接】operator-sdkSDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.项目地址https://gitcode.com/gh_mirrors/op/operator-sdk点击查看免费下载相关推荐Operator SDK v1.41.0 升级指南Go 1.24、golangci-lint v2 与 controller-runtime v0.21 全量变更解析Operator SDK v1.41.0 升级指南Go 1.24、golangci lint v2 与 controller runtime v0.21 全量云原生后端开发工具微服务operator-sdk alpha 子命令完全指南PROJECT 配置迁移与不稳定功能的使用规范operator sdk alpha 子命令完全指南PROJECT 配置迁移与不稳定功能的使用规范 导读 operator sdk alpha 是 opera云原生后端开发工具微服务operator-sdk alpha config-3alpha-to-3PROJECT 配置文件从 3-alpha 到 3 的自动迁移指南operator sdk alpha config 3alpha to 3PROJECT 配置文件从 3 alpha 到 3 的自动迁移指南 operator云原生后端开发工具微服务上一篇Cocos Engine 第三方能力接入指南JSB 绑定、多端适配与排障一次说清下一篇QQ截图独立版免费截图、文字识别与录屏快速上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表