operator必须通过bundle+olm实现版本控制与自动升级,因手动kubectl apply csv/crd会导致catalogsource缺失、镜像拉取失败、频道绑定失效三大问题;bundle/metadata/annotations.yaml三字段、csv version格式及relatedimages一致性为关键校验点。

Operator 用 Go 写完后,不集成 OLM 就只是个手动部署的控制器;要真正实现版本控制、自动升级、依赖解析和多租户隔离,必须走 Bundle + OLM 流程——而 Operator SDK 的 make bundle 是唯一被官方支持且稳定落地的路径。
为什么不能直接 kubectl apply CSV 和 CRD?
手动 apply ClusterServiceVersion 和 CustomResourceDefinition 看似能跑起来,但会立刻掉进三个坑:
- 缺失
CatalogSource时,Subscription无法发现更新,InstallPlan永远 Pending - CSV 中声明的
spec.install.spec.deployments路径若指向本地镜像(如localhost:5000/...),OLM 会因无法拉取而卡在Installing状态 - 没有
annotations.yaml或其中operators.operatorframework.io.bundle.channel.default.v1缺失,Subscription无法绑定频道,升级逻辑彻底失效
Bundle 构建流程中哪些字段绝对不能错?
make bundle 生成的文件里,以下三处出错会导致整个 OLM 安装失败或静默降级:
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
-
bundle/metadata/annotations.yaml中必须包含:operators.operatorframework.io.bundle.mediatype.v1: "registry+v1"operators.operatorframework.io.bundle.manifests.v1: "manifests/"operators.operatorframework.io.bundle.metadata.v1: "metadata/" -
bundle/manifests/*.clusterserviceversion.yaml的spec.version必须是语义化版本(如"0.1.0"),不能是"v0.1.0"或"0.1",否则 OLM 认为版本不可比,跳过升级 -
spec.relatedImages若存在,所有镜像必须已推送到可访问 registry,且spec.install.spec.deployments[].spec.template.spec.containers[].image必须与之完全一致(含 tag)
Subscription 配置如何控制升级节奏?
Subscription 不是“一键升级”开关,它的行为由两个字段共同决定:
-
spec.channel:必须与CatalogSource中 Bundle 发布的频道名严格匹配(如"stable"),大小写敏感 -
spec.installPlanApproval:设为"Automatic"才触发自动 InstallPlan;设为"Manual"后,必须人工 patchInstallPlan的status.phase为"Approved",否则卡住 - 升级不是立即发生的:OLM 每 15 分钟轮询一次
CatalogSource,新 CSV 出现后才生成新InstallPlan,期间旧 Operator 继续运行
调试 InstallPlan 失败最有效的三步
当 Operator 卡在 UpgradePending 或 Failed,别翻日志堆栈,先查这三项:
- 运行
kubectl get installplan -n olm,看status.phase是Pending还是Failed;如果是Pending,大概率是CatalogSource的status.connectionState.lastObservedState为Failed(镜像 unreachable 或 TLS 证书错误) - 运行
kubectl describe installplan <name> -n olm</name>,重点看status.conditions下的message字段,常见值如"no objects found for the provided identifiers"表示 CSV 引用的 CRD 名称拼写错误 - 检查
ClusterServiceVersion的spec.installStrategy.spec.permissions是否漏掉了某条rules,导致 OLM 创建 RBAC 时校验失败(此时InstallPlan状态为Failed,但事件里不会明说缺哪条权限)
Bundle 不是打包格式的选择题,而是 OLM 唯一信任的交付单元;所有看似绕过的“简化流程”,最终都会在多版本共存、跨命名空间部署或 Operator 间依赖场景下暴露出来——尤其当你要让不同团队在同一个集群里各自管理自己的 Operator 时,CatalogSource 的 scope 和 OperatorGroup 的 namespace binding 就成了不可妥协的边界。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










