- 云原生
- 后端
- 开发工具
- 微服务
【免费下载链接】operator-sdk
SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.
Operator Lifecycle Manager(OLM)是 Kubernetes 生态中负责 Operator 生命周期管理的关键组件,Operator SDK 通过operator-sdk olm命令族为开发者提供了在集群中直接管理 OLM 安装的能力。本文以operator-sdk olm命令及其三个子命令(install、status、uninstall)为核心,结合本仓库(gh_mirrors/op/operator-sdk)的源码实现,完整讲解每个命令的参数含义、默认值、底层执行流程与常见使用场景。读完本文,你将能够独立完成 OLM 的安装、状态检查与卸载,并理解其背后的资源编排与版本解析机制。
命令概览
operator-sdk olm是operator-sdk的一个子命令,其定位一句话即可概括:
Manage the Operator Lifecycle Manager installation in your cluster(管理集群中 Operator Lifecycle Manager 的安装)。
它本身不直接执行任何操作,而是作为install、status、uninstall三个子命令的父级入口。从源码看,三个子命令在 internal/cmd/operator-sdk/olm/cmd.go 中通过cmd.AddCommand(newInstallCmd(), newStatusCmd(), newUninstallCmd())注册,构成完整的 OLM 生命周期管理命令族:
operator-sdk olm install:在集群中安装 OLM;operator-sdk olm status:获取集群中 OLM 安装的状态;operator-sdk olm uninstall:从集群中卸载 OLM。
该命令族完整依赖关系见 operator-sdk 根命令文档,三个子命令的详细说明分别见 operator-sdk olm install、operator-sdk olm status 与 operator-sdk olm uninstall。
命令选项:父命令与继承自根命令的全局参数
operator-sdk olm自身只有一个帮助选项:
-h, --help help for olm同时,它继承所有operator-sdk根命令的全局参数,这些参数同样作用于其三个子命令:
--plugins strings plugin keys to be used for this subcommand execution --verbose Enable verbose logging--plugins:指定本次子命令执行时使用的插件键(plugin keys),用于控制命令执行所走的插件化逻辑;--verbose:开启详细(verbose)日志输出,便于排查安装、状态检查或卸载过程中的问题。
这两个全局参数是operator-sdk系列命令的统一约定,在 website/content/en/docs/cli/operator-sdk.md 中有完整定义。
子命令一:operator-sdk olm install—— 安装 OLM
命令用法与参数
operator-sdk olm install [flags]对应选项如下:
-h, --help help for install --timeout duration time to wait for the command to complete before failing (default 2m0s) --version string version of OLM resources to install (default "0.28.0")参数说明:
| 参数 | 含义 | 默认值 |
|---|---|---|
--timeout | 命令整体执行的超时时间,超过该时间仍未完成则判定失败 | 2m0s(2 分钟) |
--version | 要安装的 OLM 资源版本号 | 0.28.0 |
在源码 internal/cmd/operator-sdk/olm/install.go 中,--version直接绑定到installer.DefaultVersion,该常量定义于 internal/olm/installer/manager.go:
const ( // TODO: switch back to latest once olm fixes their releases // https://github.com/operator-framework/operator-lifecycle-manager/issues/3419 DefaultVersion = "0.28.0" DefaultTimeout = time.Minute * 2 // DefaultOLMNamespace is the namespace where OLM is installed DefaultOLMNamespace = "olm" )可见默认安装版本被固定为0.28.0(源码注释说明这是在上游 OLM 修复发布问题之前的临时固定版本),默认超时为 2 分钟,OLM 默认安装命名空间为olm。需要特别说明的是:install子命令在 CLI 层并未暴露--olm-namespace参数(该参数仅出现在status与uninstall上),因此安装操作固定使用olm命名空间。
安装流程的底层实现
执行operator-sdk olm install时,命令调用链为:newInstallCmd的RunE→Manager.Install()(internal/olm/installer/manager.go)→Client.InstallVersion()(internal/olm/installer/client.go)。Manager.initialize()会通过 controller-runtime 的config.GetConfig()读取当前 kubeconfig 构建 Kubernetes 客户端,因此执行前需要具备可用的集群访问凭据。
安装过程的核心步骤(见Client.InstallVersion)如下:
- 获取资源清单:根据
--version拉取 OLM 的 CRD 与普通资源清单。getResources()会先判断该版本是否已被内置为 bindata:仓库 internal/bindata/olm/versions.go 中内置了0.25.0、0.26.0、0.27.0三个版本的清单,命中时直接使用本地内置清单(日志输出 "Using locally stored resource manifests");未命中(例如默认的0.28.0)则从 OLM 上游 GitHub Releases 下载crds.yaml与olm.yaml两个资产文件。 - 版本号规范化:
formatVersion()使用semver.ParseTolerant解析版本号,对于0.17.0之前的版本(OLM 发布标签格式变更前)返回不带v前缀的版本号,否则在版本号前补v前缀用于拼接下载 URL。 - 检查存量资源:先检查集群中是否已存在 OLM 的 CRD 与其他资源。若检测到已安装资源,安装会直接报错并提示"detected existing OLM resources: OLM must be completely uninstalled before installation"——即安装前必须确保 OLM 已被完全卸载。
- 创建 CRD 并等待就绪:先创建 CRD 对象,然后以 1 秒为间隔轮询等待 CRD 全部注册成功(
wait.PollUntilContextCancel),随后再创建其余 OLM 资源。 - 等待关键 Deployment 滚动完成:依次等待
deployment/olm-operator与deployment/catalog-operator完成 rollout(DoRolloutWait会持续观察UpdatedReplicas、AvailableReplicas等状态,并检查DeploymentProgressing条件是否超时)。 - 等待 Subscription/CSV 就绪:对于清单中的每个
Subscription资源,轮询其Status.InstalledCSV字段,随后等待对应 ClusterServiceVersion 进入Succeeded阶段(DoCSVWait;若 CSV 进入Failed阶段会直接报错)。 - 等待 packageserver 就绪并输出结果:等待
deployment/packageserver滚动完成,最后以表格形式打印所有资源的安装状态。
安装成功时,Manager.Install()会输出Successfully installed OLM version "0.28.0"并打印状态表格。
安装示例
# 使用默认版本(0.28.0)与默认超时安装 OLM operator-sdk olm install # 指定 OLM 版本安装,并延长超时时间 operator-sdk olm install --version 0.27.0 --timeout 5m # 使用内置 bindata 版本(0.25.0 ~ 0.27.0)安装,可避免网络下载 operator-sdk olm install --version 0.26.0提示:仓库 hack/tests/subcommand-olm-install.sh 提供了针对该命令的集成测试脚本,可作为实际安装流程的参考。
子命令二:operator-sdk olm status—— 查询 OLM 状态
命令用法与参数
operator-sdk olm status [flags]对应选项如下:
-h, --help help for status --olm-namespace string namespace where OLM is installed (default "olm") --timeout duration time to wait for the command to complete before failing (default 2m0s) --version string version of OLM installed on cluster; if unsetoperator-sdk attempts to auto-discover the version参数说明:
| 参数 | 含义 | 默认值 |
|---|---|---|
--olm-namespace | OLM 安装所在的命名空间 | olm |
--timeout | 命令执行超时时间 | 2m0s |
--version | 集群中已安装的 OLM 版本;若未设置,operator-sdk会尝试自动发现版本 | 空(自动发现) |
在 internal/cmd/operator-sdk/olm/status.go 中,--version默认值为空字符串,触发Manager.Status()的版本自动发现逻辑。
版本自动发现与状态输出
Manager.Status()(internal/olm/installer/manager.go)首先调用Client.GetInstalledVersion()探测已安装的 OLM 版本。该方法的实现位于 internal/olm/client/client.go,原理是:列出指定命名空间下的全部 ClusterServiceVersion(CSV),寻找名为packageserver(新版本命名)或以packageserver.为前缀(0.11 之前的旧命名)的 CSV;若找到多个则报错提示集群中安装有多份 OLM。版本号优先从 CSV 的olm.version标签读取(OLM > 0.10.1 才有该标签),否则回退解析 CSV 名称中的版本号。若集群中完全没有 OLM,则返回ErrOLMNotInstalled("no existing installation found")。
状态结果由 internal/olm/client/status.go 的Status.String()方法以text/tabwriter格式化输出,表格列为:
NAME NAMESPACE KIND STATUS其中STATUS列取值包括Installed(资源存在)、错误信息(资源查询失败)与Unknown。HasInstalledResources()的判定逻辑对"资源不存在"(NotFound)以及"自定义资源的 kind 无匹配"(NoKindMatch)两类错误做了豁免处理,避免因 CRD 缺失导致状态误判。
状态查询示例
# 自动发现版本并查询状态(默认 olm 命名空间) operator-sdk olm status # 指定命名空间查询 operator-sdk olm status --olm-namespace olm # 显式指定版本查询(跳过自动发现) operator-sdk olm status --version 0.28.0子命令三:operator-sdk olm uninstall—— 卸载 OLM
命令用法与参数
operator-sdk olm uninstall [flags]对应选项如下:
-h, --help help for uninstall --olm-namespace string namespace from where OLM is to be uninstalled. (default "olm") --timeout duration time to wait for the command to complete before failing (default 2m0s) --version string version of OLM resources to uninstall.参数说明:
| 参数 | 含义 | 默认值 |
|---|---|---|
--olm-namespace | 要从中卸载 OLM 的命名空间 | olm |
--timeout | 命令执行超时时间 | 2m0s |
--version | 要卸载的 OLM 资源版本号 | 空(自动发现) |
卸载流程的底层实现
Manager.Uninstall()(internal/olm/installer/manager.go)的执行逻辑:
- 先调用
GetInstalledVersion探测集群中已安装的 OLM 版本; - 若自动探测失败且用户未通过
--version指定版本,命令报错并提示"error getting installed OLM version (set --version to override the default version)"; - 若用户指定了
--version且与集群实际版本不一致,命令报错"mismatched installed version ... vs. supplied version ...",防止误删错误版本; - 探测成功后,
Client.UninstallVersion()(internal/olm/installer/client.go)会按相同版本拉取完整资源清单,逐一执行删除:删除采用DeletePropagationBackground后台传播策略,并以 100 毫秒间隔轮询确认每个资源确实被删除(IsNotFound视为删除成功);若目标版本根本没有安装,则返回ErrOLMNotInstalled。
卸载成功后输出Successfully uninstalled OLM version "..."。
卸载示例
# 自动发现版本并卸载(默认 olm 命名空间) operator-sdk olm uninstall # 显式指定版本卸载 operator-sdk olm uninstall --version 0.28.0 # 指定命名空间与超时 operator-sdk olm uninstall --olm-namespace olm --timeout 5m深入:资源获取、安全校验与错误处理
资源清单的来源:本地 bindata 与远程下载
安装、卸载、状态查询三个操作都需要目标版本对应的 OLM 资源清单,统一由getResources()负责获取(internal/olm/installer/client.go)。仓库通过 internal/bindata/olm/manifests.go 与 internal/bindata/olm/versions.go 内置了0.25.0、0.26.0、0.27.0三个版本的清单;其余版本(含默认的0.28.0)则从 OLM 上游 Releases 下载。下载 URL 的拼接逻辑位于getBaseDownloadURL():
- 版本为
latest时,URL 形如.../releases/latest/download/crds.yaml(或olm.yaml); - 其他版本形如
.../releases/download/<v版本号>/crds.yaml(或olm.yaml)。
若请求返回 404,命令会给出提示:"manifests may not exist for this OLM release, please check ... releases for olm.yaml and crds.yaml"——即该版本可能没有发布对应的清单资产文件。
安装前的安全校验
安装流程最值得注意的是其"先查后装"策略:在创建任何资源前,会分别检查"OLM CRD 是否已存在"与"其他 OLM 资源是否已存在"。一旦发现有残留,立即中止并提示必须先完整卸载 OLM 才能重新安装。这保证了不会在已有 OLM 的集群上重复安装导致资源冲突。
等待与诊断机制
- Deployment 滚动等待(
DoRolloutWait,internal/olm/client/client.go):逐秒轮询 Deployment 状态,依次等待"spec 更新被观察"→"新副本完成更新"→"旧副本终止"→"可用副本数达标",并在DeploymentProgressing条件出现TimedOutReason时判定 rollout 失败。 - CSV 阶段等待(
DoCSVWait):轮询 CSV 的Status.Phase,Failed阶段直接报错并附上Reason与Message;超时后还会进一步检查 CSV 中 Deployment 的条件(DeploymentAvailable)以及 Pod 容器状态(ContainerStatuses中Waiting状态的 message),将deployment ... has error与pod ... has error汇总输出,极大方便了安装失败的根因排查。
测试与验证
仓库为这三个子命令提供了完整的单元测试与集成测试,可作为行为契约参考:
- internal/cmd/operator-sdk/olm/install_test.go:验证
install命令的参数绑定与执行路径; - internal/cmd/operator-sdk/olm/status_test.go:验证
status命令及版本处理逻辑; - internal/cmd/operator-sdk/olm/uninstall_test.go:验证
uninstall命令的执行路径; - internal/cmd/operator-sdk/olm/olm_suite_test.go:命令族的 Ginkgo 测试入口;
- hack/tests/subcommand-olm-install.sh:面向真实集群的安装集成测试脚本。
实战要点与注意事项
- 前置条件:执行前需保证
kubectl可用的 kubeconfig 与集群连接(Manager.initialize()通过 controller-runtime 读取默认 kubeconfig),并且当前账号具备创建 CRD、Deployment、Subscription、CSV 等资源的权限。 - 默认命名空间为
olm:status与uninstall可通过--olm-namespace覆盖,install则固定安装到olm。 - 版本策略:
install默认安装0.28.0(该版本清单需联网下载);若希望离线安装,可显式指定内置的0.25.0、0.26.0、0.27.0任一版本,命令会直接使用仓库内置的 bindata 清单。 - 卸载前版本校验:
uninstall会严格校验--version与集群实际版本的匹配关系,避免误删;不确定版本时建议省略--version让其自动发现。 - 超时设置:安装流程包含多次 rollout 与 CSV 阶段等待,在资源受限或慢速集群上建议适当调大
--timeout(如5m)。 - 先卸载后重装:若安装失败后需要重试,务必先执行
operator-sdk olm uninstall清理干净,否则install会因检测到存量资源而拒绝安装。
相关文档导航
- operator-sdk 根命令文档:全局参数
--plugins、--verbose的定义; - operator-sdk olm install:安装子命令的完整参数参考;
- operator-sdk olm status:状态子命令的完整参数参考;
- operator-sdk olm uninstall:卸载子命令的完整参数参考;
- OLM 集成 CLI 概览 与 OLM 集成快速入门(Bundle):了解如何结合
bundle相关命令完成 Operator 的打包、验证与在 OLM 中的部署全流程。
- 云原生
- 后端
- 开发工具
- 微服务
【免费下载链接】operator-sdk
SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.
相关推荐
Flax NNX 图像分割实战:用 UNETR 模型从零训练 Oxford Pets 语义分割
Flax NNX 图像分割实战:用 UNETR 模型从零训练 Oxford Pets 语义分割 本教程基于 Flax 官方 NNX 示例 image_segme
云原生后端开发工具微服务operator-sdk run 命令详解:借助 OLM 在多环境中部署 Operator
operator sdk run 命令详解:借助 OLM 在多环境中部署 Operator operator sdk run 是 Operator SDK 提供
云原生后端开发工具微服务operator-sdk cleanup 命令详解:一键清理 OLM 部署的 Operator
operator sdk cleanup 命令详解:一键清理 OLM 部署的 Operator operator sdk cleanup 是 operator
云原生后端开发工具微服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考