- 云原生
- 后端
- 开发工具
- 微服务
【免费下载链接】operator-sdk
SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.
本指南基于 Operator SDK v1.23.0 的官方发布记录(changelog/generated/v1.23.0.md)编写,系统梳理该版本新增的 Alpha 级插件体系、bundle 可选校验器、scorecard 存储机制改进,以及若干关键 Bug 修复与破坏性变更。读完本文,你将掌握 v1.23.0 中每个新增能力的实际用法、适用场景与底层实现,能够在升级和日常开发中做出准确的取舍。
版本定位与升级概览
Operator SDK v1.23.0 是一个功能密集的里程碑版本:一方面引入了一批面向 Golang 项目的 Alpha 级插件(deploy-image/v1-alpha、grafana/v1-alpha、go/v4-alpha),另一方面在 bundle 校验、scorecard 测试、OLM 集成等既有能力上做了大量增强与修复。整体上,该版本延续了"多语言、多布局插件体系"的发展方向,同时开始为 Apple Silicon(darwin/arm64)生态做准备。
从源码结构看,SDK 的插件体系由 internal/plugins/plugins.go 中的DefaultNameQualifier(".sdk.operatorframework.io")统一定义命名后缀,所有官方插件均通过该后缀完成全限定命名,v1.23.0 新增的 deploy-image、grafana 插件即遵循此约定。值得注意的是,本仓库当前internal/plugins目录下仍以 helm、manifests、scorecard 等既有插件为主,deploy-image 与 grafana 插件尚未随该版本分支保留在仓库中,读者若要在本地复现 v1.23.0 的新插件行为,应以该版本对应的 Release 产物为准。
新增插件体系:让 Golang 项目快速管理 Operand 与 Grafana
deploy-image/v1-alpha:一键生成"部署镜像"的 Operator 脚手架
v1.23.0 最亮眼的新增能力是为 Golang 项目提供deploy-image/v1-alpha插件,它负责脚手架生成部署并管理一个 Operand(镜像)所需的全部代码——包括 CRD、Controller、RBAC 等。其设计目标是让开发者不需要了解 controller-runtime 的底层细节,只需声明镜像及其运行方式,即可得到一个可工作的 Operator 骨架。
官方给出的最小可复现命令如下:
operator-sdk --group=example.com --version=v1alpha1 --kind=Memcached \ --image=memcached:1.6.15-alpine \ --image-container-command="memcached,-m=64,modern,-v" \ --image-container-port="11211" \ --run-as-user="1001" \ --plugins="deploy-image/v1-alpha"各参数含义与取值建议:
| 参数 | 说明 | 示例值 |
|---|---|---|
--group | API 的 group 名 | example.com |
--version | API 版本 | v1alpha1 |
--kind | 自定义资源的 Kind 名 | Memcached |
--image | 要部署的 Operand 镜像 | memcached:1.6.15-alpine |
--image-container-command | 容器启动命令,逗号分隔的参数列表会被转换为容器 command/args | memcached,-m=64,modern,-v |
--image-container-port | 容器暴露的端口 | 11211 |
--run-as-user | 容器运行的用户 UID | 1001 |
--plugins | 指定使用的插件 | deploy-image/v1-alpha |
需要注意:--image-container-command中以逗号分隔的每一段会分别作为容器的 command 与 args 生成,因此传入时需仔细核对逗号位置,避免生成错误的启动命令。
此外,该插件在 v1.23.0 中进一步支持生成 SDK bundle 清单(对应 PR #5997),意味着用该插件创建的 Operator 可以无缝衔接make bundle流程,直接产出符合 OLM 规范的 bundle 目录,缩短从脚手架到可发布 Operator 的距离。
grafana/v1-alpha:面向所有语言生成 Grafana Dashboard
与 deploy-image 插件同期引入的grafana/v1-alpha插件则适用于所有语言的项目(Golang、Ansible、Helm 皆可),其作用是帮助生成 Grafana 仪表盘。使用方式是在已有项目上执行:
operator-sdk edit --plugins=grafana.kubebuilder.io/v1-alpha该命令会在现有 Operator 项目中追加 Grafana Dashboard 相关资源。注意此处插件名带有kubebuilder.io域名后缀,与 SDK 默认的.sdk.operatorframework.io不同——这反映了该插件由 Kubebuilder 生态孵化、SDK 复用的跨项目协作背景,也提醒用户在使用--plugins参数时需以插件实际的全限定名或别名为准。
go/v4-alpha 与 Apple Silicon 支持
v1.23.0 还新增了go/v4-alpha插件,为 Golang 项目加入 Apple Silicon(darwin/arm64)支持;同时ansible/v1、helm/v1插件也获得了同样的 Apple Silicon 支持(对应 PR #5965)。这一批变更使得在 M1/M2 系列 Mac 上本地开发 Operator 不再需要 Rosetta 模拟,工具链下载与二进制执行均以原生 arm64 方式进行。
从版本定义源码可以确认,SDK 内部通过Version、ImageVersion等变量控制各插件生成样本时引用的二进制与镜像版本,Apple Silicon 支持正是通过更新各插件所依赖工具(如 kustomize)的构建产物来实现的。
bundle 校验增强:multiarch 校验器与 good-practices 迁移
新增(Alpha)multiarch 可选校验器
v1.23.0 为operator-sdk bundle validate新增了一个 Alpha 阶段的可选校验器multiarch,用于帮助确认 bundle 是否满足多架构支持的判据。其触发方式是通过--select-optional标签选择器指定:
operator-sdk bundle validate ./bundle --select-optional name=multiarch在 internal/cmd/operator-sdk/bundle/validate/optional.go 的optionalValidators列表中可以看到该校验器的注册信息:
{ Validator: apivalidation.MultipleArchitectsValidator, name: "multiarch", labels: map[string]string{ nameKey: "multiarch", }, desc: "(Alpha) Multiple Architectures bundle validation. ...", },需要特别强调的是该命令在 CLI 帮助(internal/cmd/operator-sdk/bundle/validate/cmd.go)中给出的前置条件:
IMPORTANT: To use this option it is required to have access to pull the images defined on the CSV.
也就是说,multiarch 校验器会实际去拉取并检查 CSV 中声明的镜像清单(manifest list),确认其包含预期的多架构条目。因此运行时必须能访问镜像仓库。若需指定容器工具(默认 docker),可通过--optional-values传入:
operator-sdk bundle validate ./bundle --select-optional name=multiarch \ --optional-values=container-tools=dockercontainer-tools的合法取值为[docker, podman, none];未指定时默认使用 docker 检查镜像。
bundle 名称校验迁移至 good-practices 校验器
同版本还将原先默认执行的bundle 名称(name)校验迁移到了good-practices可选校验器之下。这意味着:
- 旧行为:名称合法性是默认校验的一部分;
- 新行为:必须显式启用 good-practices 才会进行名称校验:
operator-sdk bundle validate ./bundle --select-optional name=good-practices从 optional.go 的注册表可以看到good-practices校验器描述为"对 operator-framework 解决方案下 bundle 的准则与建议进行校验"。对于发布到 OperatorHub 等公共目录的 Operator 作者,建议将该校验器纳入常规 CI。
可选校验器的通用机制
在 v1.23.0 中,bundle validate的可选校验器机制保持一贯的标签选择器设计(源码见 optional.go):
--list-optional列出全部可选校验器及其标签:operator-sdk bundle validate --list-optional--select-optional suite=operatorframework一次性启用整套校验器;--select-optional name=<校验器名>精确启用单个校验器;--optional-values=k8s-version=1.22向校验器传递附加参数(如目标 K8s 版本)。
选择器匹配逻辑由 optional.go 的run方法实现:只有当sel.Matches(labels.Set(v.labels))命中时,对应校验器才会被追加执行,未命中任何校验器时命令会提前失败并提示 "selector does not match any validator labels"。
scorecard 测试:SCORECARD_STORAGE 环境变量
v1.23.0 为 scorecard 测试容器引入了一个实用改进:由config.yaml定义的测试容器现在可以通过读取环境变量SCORECARD_STORAGE获取config.yaml中定义的存储路径(对应 PR #5829)。
从底层实现(internal/scorecard/storage.go)可以看到完整的数据流:
- scorecard 在创建测试 Pod 时调用
addStorageToPod,为 Pod 挂载名为scorecard-storage的 emptyDir 卷; - 同时向测试容器注入环境变量:
mountPathEnv := v1.EnvVar{ Name: "SCORECARD_STORAGE", Value: mountPath, } podDef.Spec.Containers[0].Env = append(podDef.Spec.Containers[0].Env, mountPathEnv) - 测试结束后,scorecard 通过
scorecard-gathersidecar 容器执行tar cf - <mountPath>收集输出,再由untarAll解包到本地的测试输出目录。
因此,自定义 scorecard 测试在编写时可以这样利用该变量(以 shell 测试为例):
# 将测试产物写入 scorecard 存储路径 echo "test output" > "$SCORECARD_STORAGE/result.txt"之后 scorecard 会自动将该路径下的内容收集并归入测试输出。v1.23.0 还顺带修复了 scorecard 测试输出与存储 mountPath 强耦合的问题(PR #5714),进一步解耦了输出目录与存储挂载点。
OLM 版本支持与 run bundle(-upgrade) 修复
支持的 OLM 版本更新
v1.23.0 将支持的 OLM 版本更新为0.20.0、0.21.2、0.22.0,同时放弃了对 OLM 0.19.1 的安装支持(对应 PR #6000)。升级前请确认目标集群上 OLM 的版本,若仍在使用 0.19.1,需要先升级 OLM 再迁移 Operator SDK。
run bundle / bundle-upgrade 子命令的多项修复
该版本集中修复了operator-sdk run bundle与operator-sdk run bundle-upgrade子命令的多个问题:
- 兼容 Kubernetes < 1.19 与 OpenShift(PR #5973):修复了这两个子命令在较老 K8s 版本及 OpenShift 等厂商发行版上无法工作的问题;
- InstallPlan 自动批准失败(PR #5901):修复 bundle-upgrade 过程中
InstallPlan偶尔未被批准、导致升级卡住的问题; - FBC 生成优化(PR #5891):bundle-upgrade 现在只为 bundle 生成额外的 File-Based Catalog(FBC)内容,而不再渲染整个 index 再把 bundle 追加进去,显著减少渲染工作量与出错面;
- 传输层标志支持(PR #5921):
--skip-tls-verify与--use-http标志在 run bundle(-upgrade) 中真正生效,便于在内网 HTTP 仓库或自签名 TLS 环境下操作。
依赖升级与破坏性变更清单
v1.23.0 涉及一批依赖升级与破坏性变更,升级前需逐项评估:
| 组件 | 变更内容 | 影响面 |
|---|---|---|
| kube-rbac-proxy | gcr.io/kubebuilder/kube-rbac-proxy由 v0.11.0 升至 v0.12.0(随后在 go/v3、ansible/v1、helm/v1 中进一步升至 v0.13.0) | 新生成项目的 metrics 代理镜像更新 |
| controller-tools | go/v3 插件中由 0.9.0 升至 0.9.2 | 生成 CRD 等资源时的工具链行为 |
| controller-runtime / k8s 依赖 | controller-runtime v0.12.1 → v0.12.2,Kubernetes 依赖 v0.24.0 → v0.24.2 | go/v3 项目的基础库升级 |
| kustomize(破坏性) | ansible/v1、helm/v1 项目由 kustomize v3.8.7 升级至v4.5.5 | 破坏性变更:kustomize v4 在命令行参数、kustomization.yaml结构(如resources/bases字段合并)上存在差异,旧项目升级后需重新生成或调整 manifests |
| OLM 支持范围 | 更新为 0.20.0、0.21.2、0.22.0 | 移除对 0.19.1 的安装支持 |
| 布局弃用 | go/v2 提供的 "Kubebuilder 2.x" 旧布局正式弃用 | 自 2021 年 4 月起默认布局已为 go/v3 |
关于旧布局弃用的自查方法
v1.23.0 正式弃用 go/v2 插件对应的 legacy 布局。请检查项目的PROJECT文件,确认布局标识是否为go.kubebuilder.io/v3:
# PROJECT 文件中应包含类似行 layout: - go.kubebuilder.io/v3若仍为go.kubebuilder.io/v2,建议参照官方 Golang 迁移指南升级项目布局。此外,v1.23.0 还移除了单独调用kustomize/v1插件的能力——如果需要在其他插件基础上继续开发插件,官方建议直接使用 Kubebuilder 作为基座,而不是以 SDK 的 kustomize 插件为模板。
其他行为调整与工程化改进
- Hybrid Helm(hybrid.helm/v1-alpha):Dockerfile 中的 Go 版本提升至 1.18(PR #5772);
- Makefile 目标:修复了目标重复下载已存在二进制的问题(PR #5965),本地重复执行 make 类命令时不再无谓地重新下载工具;
- generate kustomize manifests:
operator-sdk generate kustomize manifests现在会尊重用户在config/manifests中做出的手工修改(PR #5960),避免重新生成时覆盖用户改动。
升级建议与实操要点
- 先检查布局:升级到 v1.23.0 前,先确认
PROJECT文件中的 layout 为go.kubebuilder.io/v3,避免停留在已弃用的 v2 布局; - 评估 kustomize 破坏性变更:ansible/helm 项目需在测试环境验证 kustomize v4 对现有
kustomization.yaml的兼容性,必要时重新生成 manifests; - 验证 OLM 兼容性:确认集群 OLM 版本落在 0.20.0/0.21.2/0.22.0 范围内;
- 新项目尝鲜新插件:新建 Golang 项目时可试用
deploy-image/v1-alpha快速生成 Operand 管理脚手架;已有项目可用operator-sdk edit --plugins=grafana.kubebuilder.io/v1-alpha补充 Grafana 面板; - 多架构发布前校验:发布支持多架构的 Operator 前,执行
operator-sdk bundle validate ./bundle --select-optional name=multiarch,并确保 CI 环境可拉取 CSV 中的镜像(可通过--optional-values=container-tools=podman指定容器工具)。
以上变更均可在本仓库对应源码与文档中进一步核实:可选校验器实现见 internal/cmd/operator-sdk/bundle/validate/optional.go 与 internal/cmd/operator-sdk/bundle/validate/cmd.go,scorecard 存储机制见 internal/scorecard/storage.go,版本定义见 internal/version/version.go。
- 云原生
- 后端
- 开发工具
- 微服务
【免费下载链接】operator-sdk
SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.
相关推荐
Operator SDK v1.17.0 版本解析:混合 Helm 插件、Bundle 校验增强与 Go 1.17 依赖升级
Operator SDK v1.17.0 版本解析:混合 Helm 插件、Bundle 校验增强与 Go 1.17 依赖升级 本篇文章以 Operator SD
云原生后端开发工具微服务terraform-provider-aws v6.33.0 版本解析:新资源、关键增强与缺陷修复全景解读
terraform provider aws v6.33.0 版本解析:新资源、关键增强与缺陷修复全景解读 导读 本篇文章围绕 terraform provid
IaC云原生基础设施Grocy 4.6.0 版本全解析:数量单位流程重构、条码插件增强与关键修复
Grocy 4.6.0 版本全解析:数量单位流程重构、条码插件增强与关键修复 Grocy 4.6.0(2026 03 06 发布)是一个以「产品定义数量单位(Q
后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考