- 云原生
- 后端
- 开发工具
- 微服务
【免费下载链接】operator-sdk
SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.
operator-sdkv1.0.0 是该项目首个主版本发布,它带来了项目结构整体重写与大量破坏性 CLI 变更,与之前所有次要版本不兼容(Go 项目除外,Go 项目自 v0.19.0 起已切换到新布局)。本文以官方升级文档 v1.0.0 迁移指南 为主线,逐项拆解被移除/重命名的子命令、pkg/库的去向、PROJECT文件升级到 "3-alpha" 的具体操作,并结合当前仓库源码给出可验证的实现细节,帮助你完成从旧版 SDK 到 v1.0.0 的平滑迁移。
迁移前必读:按项目类型选择专属迁移指南
v1.0.0 的破坏性变更因项目类型而异,官方建议先阅读对应类型的迁移指南,再回到本文处理通用变更:
- Go 项目:Go 项目迁移指南
- Ansible 项目:Ansible 项目迁移指南
- Helm 项目:Helm 项目迁移指南
- Go 项目布局在更早的 v0.19.0 已先行切换,见 v0.19.0 迁移说明
CLI 变更:被移除的子命令与替代方案
v1.0.0 对 CLI 进行了大刀阔斧的重写:脚手架命令全面对齐 Kubebuilder 命名,构建/打包类操作从 CLI 移到 Makefile target。官方给出了完整的命令对照表,全部需要逐一替换:
| 被移除的命令 | 替代用法 | 变更原因 |
|---|---|---|
operator-sdk new | operator-sdk init | 脚手架命名对齐 Kubebuilder |
operator-sdk add api | operator-sdk create api | 同上 |
operator-sdk add controller | operator-sdk create api | API 与 Controller 合并创建 |
operator-sdk add crd | operator-sdk create api | CRD 由 API 定义生成 |
operator-sdk build | make docker-build | 构建逻辑迁移到 Makefile |
operator-sdk bundle create | make bundle | 打包逻辑迁移到 Makefile |
operator-sdk generate k8s | make generate | 代码生成迁移到 Makefile |
operator-sdk generate crds | make manifests | 清单生成迁移到 Makefile |
operator-sdk generate csv | operator-sdk generate kustomize manifests | CSV 改由 kustomize 管道生成 |
operator-sdk migrate | 无迁移路径 | 混合型 operator 不再支持 |
operator-sdk print-deps | 无替代 | 直接移除 |
operator-sdk run local | make run | 本地运行迁移到 Makefile |
operator-sdk test | controller-runtime 的 envtest 框架 | 测试框架标准化 |
这些变更在仓库的当前实现中得到印证:internal/cmd/operator-sdk目录下已不存在new、add、build、migrate等子命令,取而代之的是init/create(由 Kubebuilder 侧插件提供)、generate、bundle、run、cleanup、olm、scorecard等一组与上表一致的命令族。
库变更:pkg/ 包的去向与替换写法
v1.0.0 将pkg/下的子包要么移除、要么迁移到了独立的operator-lib仓库。你需要更新 Go import 路径,并改写部分调用。
被移除的包
| 包 | 处理方式 |
|---|---|
pkg/k8sutil | 移除;迁移到 Kubebuilder 风格布局后不再需要 |
pkg/kube-metrics | 移除;改用InstrumentedEnqueueRequestForObjecthandler |
pkg/metrics | 移除;同上 |
pkg/ready | 移除;改用 controller-runtime 的 readyz server |
pkg/tls | 移除;改用 cert-manager 管理 TLS 证书 |
迁移到 operator-lib 的包
1. 注解触发的 watch handler:EnqueueRequestForAnnotation迁移到github.com/operator-framework/operator-lib/handler。
2. 生成变更谓词:GenerationChangedPredicate被重构迁移,需改写成组合谓词:
import ( crpredicate "sigs.k8s.io/controller-runtime/pkg/predicate" libpredicate "github.com/operator-framework/operator-lib/predicate" ) ... crpredicate.Or( crpredicate.GenerationChangedPredicate{}, libpredicate.NoGenerationPredicate{}, )3. 领导选举(leader-for-life):pkg/leader迁移到github.com/operator-framework/operator-lib/leader。
4. 状态条件库:pkg/status(含状态条件 helper)迁移到github.com/operator-framework/operator-lib/status。
5. 指标相关:移除addMetrics调用,改在设置 controller-runtime watch 时使用InstrumentedEnqueueRequestForObject(同样从github.com/operator-framework/operator-lib/handler导入)。
6. 就绪探针:改用 controller-runtime 的 readyz server,通过manager.AddReadyzCheck注册自定义 handler,例如挂载healthz.Ping检查器。
项目布局升级:从 version "2" 迁移到 "3-alpha"
v1.0.0 的默认 Go 插件不再为旧项目写入 OLM、scorecard 相关文件,也不再写入plugins字段。要恢复这些能力,需将PROJECT文件升级到 project version "3-alpha"。对旧版(version "2")项目,直接在PROJECT文件中补充以下内容:
version: "3-alpha" # Updated from "2" projectName: <output of "$(basename $(pwd))"> layout: go.kubebuilder.io/v2 plugins: go.sdk.operatorframework.io/v2-alpha: {}projectName取当前目录的 base name(例如项目目录名为memcached-operator,则值为memcached-operator)。
当前仓库中的PROJECT文件已演进到 version "3" 格式,可以作为对照参考,例如 testdata/go/v4/memcached-operator/PROJECT 中同时存在layout: go.kubebuilder.io/v4、manifests.sdk.operatorframework.io/v2与scorecard.sdk.operatorframework.io/v2插件,以及projectName: memcached-operator字段——这正是 "3-alpha" 迁移目标格式的后续演进形态。
为 samples 目录添加脚手架标记
升级到 "3-alpha" 后,需在config/samples/kustomization.yaml中加入+kubebuilder:scaffold:manifestskustomizesamples标记,使后续脚手架能自动维护 samples 资源列表:
resources: - cache_v1alpha1_memcached.yaml #+kubebuilder:scaffold:manifestskustomizesamples更新 Makefile 的 bundle 目标以注入镜像 tag
为了支持make bundle IMG=<tag>将镜像 tag 写入 CSV,需要在 Makefile 的bundle目标中添加一行kustomize edit set image:
bundle: ... operator-sdk generate kustomize manifests -q cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) # Add this line ...这样执行make bundle IMG=quay.io/example/operator:1.0.0时,生成的 CSV 中 controller 镜像会被替换为指定 tag。
operator-sdk cleanup:简化为一层命令
operator-sdk cleanup packagemanifests已移除,统一为operator-sdk cleanup <packageName>。<packageName>可从 packagemanifests 目录根部的*.package.yaml文件中找到,通常就是项目名。
当前仓库源码证实了这一形态:internal/cmd/operator-sdk/cleanup/cmd.go 中命令定义为Use: "cleanup <operatorPackageName>",Args: cobra.ExactArgs(1),且内部通过operator.NewUninstall(cfg)清理 OLM 部署的 operator,包名直接作为参数传入。
OLM 命令与 run packagemanifests 的系列变更
移除olm install的--olm-namespace标志
该标志已被移除,因为 GitHub 上发布的 OLM manifests 将 namespace 值硬编码为olm,因此该命令只能将 OLM 安装到olmnamespace。当前实现可见 internal/cmd/operator-sdk/olm/install.go,命令仅保留--version标志用于指定 OLM 资源版本。
run packagemanifests的四处改动
- 默认安装模式从
OwnNamespace改为AllNamespaces:默认情况下所有 operator 都以集群范围运行并 watch 所有 namespace。若你依赖旧的默认OwnNamespace行为,必须显式指定--install-mode=OwnNamespace。 --include-paths标志移除:不再通过该标志创建额外资源,改为在调用前先执行kubectl apply -f <paths>。--operator-version改名为--version,--operator-namespace改名为--namespace,--olm-namespace移除(该命令不再需要 OLM namespace)。- 参数
<packagemanifests-root-dir>缺省为./packagemanifests,可传项目下的 packagemanifests 根目录。
从当前源码 internal/cmd/operator-sdk/run/packagemanifests/packagemanifests.go 可以看到,该命令已标记为Deprecated,提示 packagemanifests 格式将在 operator-sdk v2.0.0 移除,建议使用operator-sdk pkgman-to-bundle迁移到 bundle 格式——说明 v1.0.0 的这批 CLI 改名是通往 bundle 时代的过渡步骤。
日志与启动方式的变更
Ansible / Helm operator 的日志标志
两个 operator 已改用 controller-runtime 的 zap 包定义日志标志:
--zap-sample、--zap-time-encoding已移除(controller-runtime flagset 中不存在)。--zap-level更名为--zap-log-level,需全局替换。
核心逻辑迁移到<ansible-operator|helm-operator> run子命令
若直接使用ansible-operator/helm-operator二进制,需改为调用ansible-operator run和helm-operator run(例如 Makefile 的make run目标)。若使用基础镜像且未覆盖 entrypoint,则无需改动——基础镜像已默认调用run子命令。当前仓库结构与此一致:internal/cmd/helm-operator/run/cmd.go 即为 helm-operator 的 run 子命令实现。
pkg/log/zap不再公开
迁移到上游 controller-runtime 实现sigs.k8s.io/controller-runtime/pkg/log/zap(其Options.BindFlags可绑定日志标志)。
默认指标端口变更
Ansible / Helm operator 的默认指标端口不再是:8383。要继续使用 8383 端口,需在启动时显式指定--metrics-bind-address=:8383。当前 Helm operator 的 flags 实现(internal/helm/flags/flag.go)默认值为:8080,并提供--metrics-bind-address标志(--metrics-addr已标记废弃),可供对照。
注解域名的迁移:.operator-sdk.io→.sdk.operatorframework.io
插件键与注解中的旧域名后缀统一更换,涉及PROJECT文件、示例 CR 文件以及线上集群中的 CR:
PROJECT文件中:go.operator-sdk.io→go.sdk.operatorframework.io(在 Kubebuilder 风格项目中)。- 自定义资源注解:
ansible.operator-sdk/*→ansible.sdk.operatorframework.io/*,helm.operator-sdk/*→helm.sdk.operatorframework.io/*。
| 位置 | 旧注解 | 新注解 |
|---|---|---|
PROJECT文件 | go.operator-sdk.io | go.sdk.operatorframework.io |
| 自定义资源 | ansible.operator-sdk/reconcile-period | ansible.sdk.operatorframework.io/reconcile-period |
| 自定义资源 | ansible.operator-sdk/max-runner-artifacts | ansible.sdk.operatorframework.io/max-runner-artifacts |
| 自定义资源 | ansible.operator-sdk/verbosity | ansible.sdk.operatorframework.io/verbosity |
| 自定义资源 | helm.operator-sdk/upgrade-force | helm.sdk.operatorframework.io/upgrade-force |
对线上集群中已存在的 Ansible / Helm CR,按三步滚动迁移:
- 先给所有使用旧注解的 CR追加新等价注解(新旧并存);
- 升级 operator;
- 升级完成后,再移除CR 上的旧注解。
当前仓库源码已全部采用新域名,例如 internal/helm/controller/reconcile.go 中定义了helm.sdk.operatorframework.io/upgrade-force、helm.sdk.operatorframework.io/reconcile-period、helm.sdk.operatorframework.io/uninstall-release等注解常量,internal/helm/controller/reconcile_test.go 中还有针对upgrade-force取值的测试用例(True/False/1/0/invalid等),可用于验证你的迁移是否正确。
Ansible / Helm operator 的并发与元数据变更
max-workers 改名
- 标志
--max-workers更名为--max-concurrent-reconciles,功能完全一致,只是对齐 controller-runtime 术语。当前实现见 internal/helm/flags/flag.go 第 66-70 行,默认值为runtime.NumCPU()。 - 环境变量
WORKERS_<Kind>_<Group>废弃,改用MAX_CONCURRENT_RECONCILES_<Kind>_<Group>。
Ansiblemeta变量改名
Ansible 内容中的meta变量不再可用,需引用ansible_operator_meta。也可在watches.yaml中用vars关键字把新变量映射回meta:
- version: v1alpha1 group: test.example.com kind: Example role: test vars: meta: '{{ ansible_operator_meta }}'指标体系迁移到 Kubebuilder 风格
- 端口
:8686上的 kube-state-metrics 风格指标被替换为注册在 controller-runtime 指标注册表中的resource_created_at指标。 - 运行时创建的 metrics
Service/ServiceMonitor改为部署期 kustomize manifests 生成。
仓库的端到端测试证实了该指标的存在:test/e2e/helm/cluster_test.go 第 271-272 行断言 operator 指标包含resource_created_at指标(格式为resource_created_at_seconds{group=..., ...}),可作为该指标用法的实测参考。
混合型 operator 不再支持
v1.0.0 起,基于 Ansible 或 Helm 的 operator Go 库不再提供继续使用的迁移路径,Ansible / Helm 混合型 operator 用例不受支持。如果项目此前依赖这类混合架构,需要按纯 Ansible 或纯 Helm 方向重构。
scorecard 相关变更
- 配置格式更新:scorecard 配置文件需迁移到新格式,详见 scorecard 配置文档。
- 命令更名:
operator-sdk alpha scorecard改为operator-sdk scorecard;若已在用operator-sdk scorecard,则需迁移到新版 scorecard(见 scorecard 文档)。 - 输出格式变更:解析 scorecard 输出的脚本需适配
v1alpha3.TestList格式,详见 json 格式 与 text 格式 说明。 - API 导入路径变更:scorecard v1alpha3 API 迁移到独立仓库,import 路径更新为:
import "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"其余零散破坏性变更清单
version包不再公开:无法再 importversion包,请通过operator-sdk version命令获取版本。当前实现见 internal/cmd/operator-sdk/cli/version.go,输出格式为operator-sdk version: %q, commit: %q, kubernetes version: %q, go version: %q, GOOS: %q, GOARCH: %q(版本值由 internal/version/version.go 中的ldflags注入)。- 移除
--operator-name标志:generate bundle/generate packagemanifests不再接受该标志,需确保PROJECT文件中设置了projectName键;若未设置,则使用当前工作目录的 base name。 s390x镜像不再自动构建:若某版本需要s390x镜像,需在 operator-sdk 项目中提 issue,由维护者手动构建推送。run packagemanifests的--update-crds更名为--update-objects:更名是为了涵盖所有可写入包目录的对象(如 Roles)。
迁移检查清单
完成 v1.0.0 迁移后,建议按以下清单逐项核对:
- 所有
operator-sdk new/add/build/bundle create等旧命令已替换为init/create api/make目标; PROJECT文件已升级到 "3-alpha" 并写入plugins.go.sdk.operatorframework.io/v2-alpha与projectName;config/samples/kustomization.yaml已加入+kubebuilder:scaffold:manifestskustomizesamples标记;pkg/下的 import 已切换到operator-lib、controller-runtime或operator-framework/api;cleanup packagemanifests已改为cleanup <packageName>;run packagemanifests的标志(--version、--namespace、--install-mode)已按新命名调整,额外资源改用kubectl apply -f;- 注解域名已从
.operator-sdk.io迁移到.sdk.operatorframework.io(含线上 CR 的三步滚动流程); --max-workers→--max-concurrent-reconciles,meta→ansible_operator_meta;- scorecard 命令、配置与输出解析已迁移到新格式;
- 日志标志(
--zap-log-level)与指标端口(--metrics-bind-address)已按新规范配置。
- 云原生
- 后端
- 开发工具
- 微服务
【免费下载链接】operator-sdk
SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.
相关推荐
Operator SDK v0.18.0 升级指南:依赖版本、CRD v1 迁移与破坏性变更应对
Operator SDK v0.18.0 升级指南:依赖版本、CRD v1 迁移与破坏性变更应对 Operator SDK v0.18.0 是一次包含多项破坏性
云原生后端开发工具微服务PHPWord 1.0.0 升级迁移指南:破坏性变更全解析与替代 API 对照
PHPWord 1.0.0 升级迁移指南:破坏性变更全解析与替代 API 对照 PHPWord 1.0.0(2022 11 15 发布)是 0.18.3 之后的
后端Pydantic V2 迁移完全指南:从 V1 升级的破坏性变更、API 对照与实战迁移方案
Pydantic V2 迁移完全指南:从 V1 升级的破坏性变更、API 对照与实战迁移方案 Pydantic V2 在保留“基于 Python 类型注解做数据
后端序列化
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考