- 云原生
- 后端
- 开发工具
- 微服务
【免费下载链接】operator-sdk
SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.
导读
本文基于 operator-sdk 仓库的 v1.6.1 变更记录(changelog/generated/v1.6.1.md)展开,系统梳理该版本在插件体系、Helm/Ansible Operator 运行时、Makefile 脚手架、run bundle/cleanup命令以及依赖治理等方面的全部改动。读完本文,你将掌握 v1.6.1 引入的新插件用法(如declarative.go/v1、kustomize.common/v1)、私有镜像仓库场景下run bundle的三大新参数、Helm Operator 的uninstall-wait注解机制、cleanup命令的可选删除范围控制,以及各插件模板中的 Makefile 变量(IMAGE_TAG_BASE、BUNDLE_IMG、opm/catalog-build)如何协同工作,并了解这些能力在当前仓库源码中的实际实现位置。
一、版本概览:v1.6.1 的定位
v1.6.1 是 operator-sdk 在 v1.6.0 基础上的一个特性丰富型补丁版本,改动横跨四类:Additions(新增)、Changes(变更)、Deprecations(弃用)与Bug Fixes(缺陷修复)。从变更记录看,本版本的核心主题是:
- 脚手架与插件体系扩展:新增
declarative.go/v1与kustomize.common/v1两个插件,并支持通过插件链(plugin chain)组合使用; - Helm/Ansible Operator 运行时加固:引入组件配置(component config)、leader election 规则、非 root
securityContext、非默认 ServiceAccount 等安全与可观测性改进; - OLM 集成命令能力补全:
run bundle/run bundle-upgrade支持私有仓库 TLS 证书、拉取密钥、自定义 ServiceAccount;cleanup支持细粒度删除选项; - 依赖与镜像治理:Ansible Operator 的 Python 依赖全面升级并改为 pipenv 锁定,
opm与 catalog 构建流程落地到 Makefile。
这些改动多数都能在仓库源码中找到对应实现,后文将逐类展开并给出证据路径。
二、新增特性(Additions)详解
2.1 新插件:declarative.go/v1与kustomize.common/v1
v1.6.1 为 Golang 类 Operator 引入了declarative.go/v1插件,它把 kubernetes-sigs/kubebuilder-declarative-pattern 的声明式模式(declarative pattern)注入到初始化的项目中,使生成的 Operator 具备声明式资源管理能力。典型用法是在create api时通过插件链组合启用:
operator-sdk create api --plugins=go/v3,declarative同时新增的kustomize.common/v1插件负责脚手架出一个通用的、基于kustomize的项目基础结构。这两个插件与仓库内已有的插件体系一脉相承——在 internal/plugins/plugins.go 中定义了插件名的默认限定符后缀DefaultNameQualifier = ".sdk.operatorframework.io",插件短名(如go、helm、ansible、manifests、scorecard)会拼接该后缀成为完整限定名,插件链即由这些插件名组成。当前仓库 internal/plugins 目录下已经维护了helm/v1、manifests/v2、scorecard/v2等插件子目录,每个插件目录下都有init.go、api.go、plugin.go三个核心文件,分别对应init、create api子命令的脚手架逻辑与插件声明。
2.2 Helm/Ansible Operator:组件配置与 leader election
v1.6.1 允许ansible/v1与helm/v1两种 Operator 类型通过component config(组件配置)方式配置ansible-operator与helm-operator运行时,同时为二者新增了leader election(领导者选举)规则。这意味着生成的 Operator 在默认模板中即具备高可用部署所需的选举 RBAC 配置,而不再需要手工补充。
2.3 新增alpha config-gen(kustomize 插件)
版本新增了alpha config-gen命令,它是一个用于为 kubebuilder 风格项目定制配置的 kustomize 插件。需要注意:该功能处于alpha 阶段,后续版本可能发生破坏性变更,生产使用需谨慎评估。相关脚手架入口位于 internal/cmd/operator-sdk/alpha/config3alphato3 附近(同属 alpha 命令族)。
2.4 Makefilehelp目标
helm/v1与ansible/v1插件的脚手架模板新增了 Makefilehelp目标,让开发者可以通过make help快速查看项目可用的构建、测试、部署等目标列表,提升脚手架项目的自文档化程度。
2.5 非 root 运行:manager Deployment 的securityContext
ansible/v1、helm/v1插件的 manager Deployment 模板新增了securityContext,明确禁止以 root 用户运行容器,这是对 Operator 部署安全基线的重要加强,也呼应了当时 Kubernetes 社区对 pod security 的普遍要求。
2.6run bundle/run bundle-upgrade的私有仓库三件套
面向私有镜像仓库场景,v1.6.1 为run bundle与run bundle-upgrade两个命令新增了三个可选参数:
| 参数 | 作用 |
|---|---|
--ca-secret-name | 指定集群内的证书 Secret,配置 registry Pod 使用 TLS 连接私有 registry |
--pull-secret-name | 指定集群内的 docker config Secret,用于从私有 registry 拉取 bundle 镜像 |
--service-account | 将 registry 相关对象绑定到非默认 ServiceAccount |
这三个参数共同解决了“私有 registry 上运行 bundle”的完整链路:证书建立 TLS 信任、docker config 提供拉取凭证、ServiceAccount 提供运行身份。命令入口位于 internal/cmd/operator-sdk/run/bundle/cmd.go,其用法说明中指出:bundle <bundle-image>的单一参数必须包含完整 registry 路径,若使用 docker.io 镜像需显式写出docker.io(/<namespace>)?/<bundle-image-name>:<tag>;SQLite index 镜像需集群可拉取,而 File-Based Catalog(FBC)index 则在本地拉取。
2.7 Helm Operator:uninstall-wait注解
对 Helm 类 Operator,v1.6.1 新增注解helm.sdk.operatorframework.io/uninstall-wait: "true"。其语义是:在移除自定义资源的 finalizer 之前,等待所有被管理的资源全部删除完毕,从而避免 CR 删除后仍有残留资源。
这一机制在当前仓库的 Helm 控制器中有完整的实现证据。在 internal/helm/controller/reconcile.go 中定义了一组注解常量:
uninstallFinalizer = "helm.sdk.operatorframework.io/uninstall-release" // Deprecated: use uninstallFinalizer. This will be removed in operator-sdk v2.0.0. uninstallFinalizerLegacy = "uninstall-helm-release" helmUpgradeForceAnnotation = "helm.sdk.operatorframework.io/upgrade-force" helmRollbackForceAnnotation = "helm.sdk.operatorframework.io/rollback-force" helmUninstallWaitAnnotation = "helm.sdk.operatorframework.io/uninstall-wait" helmReconcilePeriodAnnotation = "helm.sdk.operatorframework.io/reconcile-period"在 reconcile.go 的 Reconcile 流程 中,当 CR 带有删除时间戳(DeletionTimestamp)时,控制器会先执行manager.UninstallRelease()卸载 Helm release;随后读取wait := hasAnnotation(helmUninstallWaitAnnotation, o):
- 若
wait为 false,立即将DeployedRelease置空并把ConditionDeployed状态置为StatusFalse,随后移除 finalizer; - 若
wait为 true,则状态被置为"Waiting until all resources are deleted.",并调用manager.CleanupRelease(status.DeployedRelease.Manifest)检查已部署清单中的资源是否全部删除,只有全部删除后才移除 finalizer(见 reconcile.go#L176-L201)。
配套测试 internal/helm/controller/reconcile_test.go 对uninstall-wait行为有对应验证,可对照阅读。
2.8opm与catalog-buildMakefile 目标
go/v2、go/v3、ansible/v1、helm/v1四类插件脚手架统一新增了两个 Makefile 目标:
opm:按需下载opm(operator package manager)二进制;catalog-build:从零或基于已有 catalog 构建 Operator catalog 镜像。
该逻辑实现在 internal/plugins/manifests/v2/init.go 中,其中固定了下载的 opm 版本:
// Version of `opm` to download and use for building index images. // This version's release artifacts *must* contain a binary for multiple arches; certain releases do not. const opmVersion = "v1.55.0"脚手架初始化时(init.go#L60-L89)会根据projutil.PluginChainToOperatorType判断 Operator 类型(Go 或非 Go),分别向 Makefile 前置注入 bundle 变量并追加 SDK、bundle、catalog 相关 recipe 片段。
2.9cleanup命令的新增可选标志
cleanup命令新增--delete-all、--delete-crds、--delete-operator-groups三个可选标志,用于控制卸载范围。其实现位于 internal/olm/operator/uninstall.go:
func (u *Uninstall) BindFlags(fs *pflag.FlagSet) { fs.BoolVar(&u.DeleteCRDs, "delete-crds", false, "If set to true, owned CRDs and CRs will be deleted") fs.BoolVar(&u.DeleteAll, "delete-all", true, "If set to true, all other delete options will be enabled") fs.BoolVar(&u.DeleteOperatorGroups, "delete-operator-groups", false, "If set to true, operator groups will be deleted") }从源码可以看到--delete-all默认值为true,即默认行为会连带启用 CRD 与 OperatorGroup 的删除;在Run方法中(uninstall.go#L72-L76)DeleteAll会强制将另两个开关置为 true。删除顺序有明确注释约束(uninstall.go#L140-L147):
- 先删 Subscription,防止清理期间再次安装或升级;
- 再删 CustomResourceDefinitions,给 Operator 机会处理带 finalizer 的 CR;
- 删除 ClusterServiceVersion(OLM 为所有命名空间资源打 ownerRef、为集群级资源打 owner label,删除后触发 GC);
- 最后删 CatalogSource。
deleteObjects支持阻塞等待删除(waitForDelete为 true 时轮询直到对象消失,uninstall.go#L222-L233)。命令入口在 internal/cmd/operator-sdk/cleanup/cmd.go,该命令会隐藏对run才有意义的--service-account标志。
2.10 非默认 ServiceAccount
ansible/v1、helm/v1插件的脚手架改为创建 controller-manager 绑定的非默认 ServiceAccount,与上游 kubebuilder 的实践保持一致,避免直接使用defaultServiceAccount 带来的权限面过宽问题。
三、变更(Changes)详解
3.1 Ansible Operator 依赖升级与锁定
v1.6.1 对 Ansible Operator 的 Python 依赖做了系统性的升级与锁定,具体包括:
- Python 包升级:
- openshift:0.11.2 → 0.12.0
- kubernetes:11.0.0 → 12.0.1
- ansible-runner:1.4.6 → 1.4.7
- ansible:2.9.15 → 2.9.19
- Ansible collections 升级(
requirements.yml):community.kubernetes 1.1.1 → 1.2.1、operator_sdk.util 0.1.0 → 0.2.0; - pin 策略:通过 ansible-galaxy 安装的作为主依赖的 collections 被 pin 到指定版本,防止难以追踪的隐性 bug;
- pipenv 接管:Docker 镜像中的 Python 包安装改为由 pipenv 托管的
Pipfile与Pipfile.lock完成,主依赖与其子依赖全部锁版,避免相互冲突的(子)依赖被安装; - 安全修复:
ansible-operator-base与ansible-operator镜像中的 urllib3 升级到 1.26.4,修复已知安全问题。
这一系列改动的核心诉求是可复现构建:无论何时构建 Ansible Operator 镜像,依赖树都是确定且经过测试的。
3.2 manager auth proxy patch 显式化--health-probe-bind-address
helm/v1与ansible/v1的 manager auth proxy patch 中显式设置了--health-probe-bind-address,使健康检查端口的绑定地址在模板中明确可见、可配置,而不是依赖运行时的隐式默认值。
3.3 Makefile 变量重构:IMAGE_TAG_BASE与BUNDLE_IMG
go/v2、go/v3、ansible/v1、helm/v1脚手架中的BUNDLE_IMG变量被重构,并新增IMAGE_TAG_BASE,目标是一行命令即可完成 bundle 与 catalog 镜像的构建。在 internal/plugins/manifests/v2/init.go 的模板片段中可以找到两者的定义方式:
# IMAGE_TAG_BASE defines the docker.io namespace and part of the image name for remote images. # For example, running 'make bundle-build bundle-push catalog-build catalog-push' will build and push both IMAGE_TAG_BASE ?= <domain>/<project-name> # BUNDLE_IMG defines the image:tag used for the bundle. # You can use it as an arg. (E.g make bundle-build BUNDLE_IMG=<some-registry>/<project-name-bundle>:<tag>) BUNDLE_IMG ?= $(IMAGE_TAG_BASE)-bundle:v$(VERSION)进一步,catalog 相关变量(init.go#L301-L318)如下:
# A comma-separated list of bundle images (e.g. make catalog-build BUNDLE_IMGS=example.com/operator-bundle:v0.1.0,example.com/operator-bundle:v0.2.0). BUNDLE_IMGS ?= $(BUNDLE_IMG) # The image tag given to the resulting catalog image (e.g. make catalog-build CATALOG_IMG=example.com/operator-catalog:v0.2.0). CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION) # Build a catalog image by adding bundle images to an empty catalog using the operator package manager tool, 'opm'. # This recipe invokes 'opm' in 'semver' bundle add mode. catalog-build: opm $(OPM) index add --container-tool $(CONTAINER_TOOL) --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT)由此可以看出完整的镜像命名约定:<domain>/<project>-bundle:v<version>为 bundle 镜像,<domain>/<project>-catalog:v<version>为 catalog 镜像。opm目标会优先复用$(LOCALBIN)/opm,若本地没有且 PATH 中也不存在opm,则通过 curl 从 operator-registry 的 GitHub release 按OS/ARCH下载指定版本(此处为 v1.55.0)。
四、弃用(Deprecations)
ansible/v1与helm/v1插件脚手架中的两个运行时标志被弃用,以对齐上游约定:
| 弃用标志 | 替代标志 |
|---|---|
--enable-leader-election | --leader-elect |
--metrics-addr | --metrics-bind-address |
弃用意味着旧标志在兼容期内仍可用,但新项目脚手架将默认生成新标志;升级存量项目时建议同步迁移,为后续主版本移除旧标志做准备。
五、缺陷修复(Bug Fixes)
5.1go/v3:webhook 清单生成时机
修复了go/v3插件在init时即生成 webhook 清单的问题,改为仅在运行create webhook时在config/下生成清单,避免初始化项目中残留多余的 webhook 配置。
5.2manifests/v2:cert-manager 卷剔除
manifests/v2插件新增一个config/manifestskustomize patch,用于从generate <bundle|packagemanifests>产出的清单中移除 cert-manager 的 volume 与 volumeMount,防止 bundle/package manifests 携带与 OLM 交付无关的本地开发配置。
5.3 Helm Operator:kind: List处理
修复了 Helm Operator 遇到kind: List时尝试对 List 对象本身设置 watch 而导致失败的问题。现在控制器会为 List 中的各个对象分别创建 watch,保证包含 List 的 chart 也能被正确协调。
5.4 PrometheusServiceMonitor指标端点
go/v2、go/v3、ansible/v1、helm/v1脚手架生成的 PrometheusServiceMonitor指标端点此前未被正确配置为可被抓取(scrape),本版本修复了端点配置,确保监控指标能够被 Prometheus 正常采集。
5.5 Ansible Operator:自定义资源输入变量默认标记为 unsafe
Ansible Operator 现在默认将来自自定义资源的输入变量标记为 unsafe,防止恶意或意外构造的 CR 内容触发模板注入等安全问题;开发者若确需原样传入可显式关闭该行为。
六、升级与使用建议
综合 v1.6.1 的改动,从使用角度给出以下建议:
- 插件链用法:新项目初始化时可组合
--plugins=go/v3,declarative或叠加kustomize.common/v1,按需获得声明式模式与 kustomize 基础结构;alpha 命令config-gen仅限试验场景。 - 私有 registry 运行 bundle:优先组合使用
--ca-secret-name、--pull-secret-name、--service-account三个参数,覆盖 TLS 信任、拉取凭证与运行身份三个环节。 - Helm Operator 优雅卸载:在 CR 上设置
helm.sdk.operatorframework.io/uninstall-wait: "true"注解可保证卸载 release 时等待所有资源删除后再移除 finalizer;与之配套的helm.sdk.operatorframework.io/uninstall-releasefinalizer 由控制器自动管理。 - cleanup 细粒度控制:
cleanup <operatorPackageName>默认--delete-all=true;若只想删除 Subscription/CSV/CatalogSource 而保留 CRD 与 OperatorGroup,请显式设置--delete-all=false --delete-crds=false --delete-operator-groups=false。 - 镜像构建流水线:升级后应改用
IMAGE_TAG_BASE作为镜像命名基准,通过make bundle-build bundle-push catalog-build catalog-push一条龙完成 bundle 与 catalog 的构建推送;catalog-build依赖opm目标自动下载 opm v1.55.0,也可以预先将opm放入 PATH 以复用。 - 依赖治理:Ansible Operator 项目请同步升级
requirements.yml中的 collections,并确保 Dockerfile 使用 pipenv 管理的Pipfile/Pipfile.lock,保证镜像构建的可复现性。 - 标志迁移:将
--enable-leader-election迁移为--leader-elect、--metrics-addr迁移为--metrics-bind-address,避免后续主版本移除旧标志后无法运行。
七、总结
v1.6.1 是一次典型的“能力补全 + 安全加固 + 依赖治理”版本:插件体系向声明式模式与 kustomize 基础结构扩展,Helm/Ansible Operator 在安全性(非 root、非默认 SA、unsafe 变量)与运维性(组件配置、leader election、健康探针地址)上全面增强,OLM 集成命令补齐私有仓库全链路能力,Makefile 脚手架则通过IMAGE_TAG_BASE/BUNDLE_IMG/opm/catalog-build打通了 bundle 与 catalog 的一行式构建。上述每一项改动都能在 internal/helm/controller/reconcile.go、internal/olm/operator/uninstall.go、internal/plugins/manifests/v2/init.go 等源码文件中找到对应实现,读者可对照 changelog 逐项验证,作为理解 operator-sdk 演进脉络与内部实现的入口。
- 云原生
- 后端
- 开发工具
- 微服务
【免费下载链接】operator-sdk
SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.
相关推荐
operator-sdk v1.4.0 版本解析:健康探针、插件体系与 Helm/Ansible 运营增强
operator sdk v1.4.0 版本解析:健康探针、插件体系与 Helm/Ansible 运营增强 v1.4.0 是 Operator SDK 在 He
云原生后端开发工具微服务Operator SDK v1.31.0 版本解析:Ansible 2.15 迁移、Helm Secret Informer 与 OLM 稳定性修复
Operator SDK v1.31.0 版本解析:Ansible 2.15 迁移、Helm Secret Informer 与 OLM 稳定性修复 本篇文章基
云原生后端开发工具微服务Operator SDK v1.35.0 变更解析:Ansible Operator 插件升级与 Helm Operator RBAC 脚手架修复
Operator SDK v1.35.0 变更解析:Ansible Operator 插件升级与 Helm Operator RBAC 脚手架修复 Operat
云原生后端开发工具微服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考