
云原生后端开发工具微服务【免费下载链接】operator-sdkSDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.项目地址https://gitcode.com/gh_mirrors/op/operator-sdk点击查看免费下载本文基于 operator-sdk 仓库 changelog/generated/v1.7.0.md 展开系统梳理 v1.7.0 版本的三类变化新增的pkgman-to-bundle迁移命令与bundle validate --optional-values验证能力、对 packagemanifests 相关命令的弃用决策以及 Ansible/Helm 操作符、CSV 生成链路上的多项修复。读者将掌握如何把传统 packagemanifests 目录一键迁移为 OLM bundle、如何用可选验证器校验 bundle 兼容性以及理解这些变化背后的源码实现与测试依据。版本概览v1.7.0 是 operator-sdk 在 OLM 打包格式演进过程中的一个关键版本。该版本围绕「以 bundle 取代 packagemanifests 作为推荐打包格式」这一主线做了三件事新增operator-sdk pkgman-to-bundle迁移命令、Ansible 操作符事件日志、bundle validate的--optional-values参数弃用generate packagemanifests、run packagemanifests两条命令修复--config标志缺失、运行命令日志格式、leases 代理规则、MakefileSHELL变量、非 served CRD 进入 CSV 的问题。下面按版本发布说明的条目逐一深入并结合当前仓库源码给出实现证据。新增pkgman-to-bundle命令——packagemanifests 到 bundle 的一键迁移命令背景与用途随着 OLMOperator Lifecycle Manager生态全面转向 bundle 格式operator-sdk v1.7.0 引入了operator-sdk pkgman-to-bundle命令对应 PR #4718用于把传统的 packagemanifests 目录迁移为 OLM 推荐的 bundle 打包格式。命令的入口实现在 internal/cmd/operator-sdk/pkgmantobundle/cmd.go其Long帮助文本明确指出pkgman-to-bundlecommand helps in migrating OLM packagemanifests to bundles which is the preferred OLM packaging format. This command takes an input packagemanifest directory and generates bundles for each of the versions of manifests present in the input directory.也就是说输入一个包含多版本 manifest 的 packagemanifests 目录命令会为其中每个版本各生成一个独立 bundle并可选地构建对应的 bundle 镜像。命令用法与全部参数命令的基本形态为operator-sdk pkgman-to-bundle packagemanifestdir支持三个可选标志均定义在 internal/cmd/operator-sdk/pkgmantobundle/cmd.go#L139-L144标志默认值说明--output-dirbundles生成 bundle 的输出目录。注意若该目录已存在命令会直接报错并退出见run()开头的os.Stat检查避免覆盖已有产物--image-tag-base空bundle 镜像的基础名称不带 tag。生成的镜像 tag 取自 packagemanifests 中每个子目录名最终镜像名为base_image:子目录名例如quay.io/example/etcd:0.0.1--build-cmd空默认执行docker build -f bundle.Dockerfile -t img .自定义构建命令。使用该标志时必须同时提供--image-tag-base否则validate()会报错base image needs to be specified to build bundle imagevalidate()internal/cmd/operator-sdk/pkgmantobundle/cmd.go#L352-L361还强制要求恰好传入一个位置参数即 packagemanifests 目录路径。实操示例etcd packagemanifests 迁移假设输入目录结构如下来自命令内置Example$ tree packagemanifests/ packagemanifests └── etcd ├── 0.0.1 │ ├── etcdcluster.crd.yaml │ └── etcdoperator.clusterserviceversion.yaml ├── 0.0.2 │ ├── etcdbackup.crd.yaml │ ├── etcdcluster.crd.yaml │ ├── etcdoperator.v0.0.2.clusterserviceversion.yaml │ └── etcdrestore.crd.yaml └── etcd.package.yaml执行迁移并在默认bundles/目录生成产物$ operator-sdk pkgman-to-bundle packagemanifests --image-tag-base quay.io/example/etcd INFO[0000] Packagemanifests will be migrated to bundles in bundle directory INFO[0000] Creating bundle/bundle-0.0.1/bundle.Dockerfile INFO[0000] Creating bundle/bundle-0.0.1/metadata/annotations.yaml ...生成后的目录结构每个版本一个 bundle内含标准 bundle 布局与独立的bundle.Dockerfile$ tree bundles/ bundles/ ├── bundle-0.0.1 │ ├── bundle │ │ ├── manifests │ │ │ ├── etcdcluster.crd.yaml │ │ │ └── etcdoperator.clusterserviceversion.yaml │ │ ├── metadata │ │ │ └── annotations.yaml │ │ └── tests │ │ └── scorecard │ │ └── config.yaml │ └── bundle.Dockerfile └── bundle-0.0.2 ├── bundle │ ├── manifests │ │ ├── etcdbackup.crd.yaml │ │ ├── etcdcluster.crd.yaml │ │ ├── etcdoperator.v0.0.2.clusterserviceversion.yaml │ │ └── etcdrestore.crd.yaml │ └── metadata │ └── annotations.yaml └── bundle.Dockerfile如需使用非 Docker 的容器工具构建镜像可自定义构建命令例如用 podman$ operator-sdk pkgman-to-bundle packagemanifests --image-tag-base quay.io/example/etcd --build-cmd podman build -f bundle.Dockerfile . -t此时两个 bundle 镜像分别被构建为quay.io/example/etcd:0.0.1与quay.io/example/etcd:0.0.2。迁移流程的源码级拆解pkgManToBundleCmd.run()internal/cmd/operator-sdk/pkgmantobundle/cmd.go#L150-L233的执行链路可概括为五步前置校验检查输出目录是否已存在若存在则报错终止解析包元数据调用getPackageMetadata()从pkgman-dir/package.package.yaml读取packageName、defaultChannel并建立CSV 名 → 频道列表的映射channelsByCSV仓库测试数据 internal/cmd/operator-sdk/pkgmantobundle/testdata/packagemanifests/memcached-operator.package.yaml 展示了该文件的标准形态逐版本生成 bundle遍历 packagemanifests 根目录下的每个子目录一个子目录即一个版本通过 internal/util/bundleutil/bundleutil.go 中的BundleMetaData完成CopyOperatorManifests()复制 manifests、GenerateMetadata()生成annotations.yaml与bundle.Dockerfile迁移 scorecard 配置getScorecardConfigPath()递归扫描版本目录识别kind为Configuration的 scorecard 配置对应 scorecard v1alpha3 的ConfigurationKind若存在则写入 bundle 的tests/scorecard/config.yaml若发现多个配置会报错构建镜像仅当提供了--image-tag-base时触发BuildBundleImage()默认执行docker build -f bundle.Dockerfile -t base:version .internal/util/bundleutil/bundleutil.go#L197-L244。生成的 bundle 元数据annotations.yaml 与 bundle.Dockerfile迁移产物中metadata/annotations.yaml与bundle.Dockerfile由模板 internal/util/bundleutil/template.go 生成两者保持一致的核心标签其中测试类标签仅在原 packagemanifests 中存在 scorecard 配置时才写入# annotations.yaml 核心内容 annotations: # Core bundle annotations. operators.operatorframework.io.bundle.mediatype.v1: registryv1 operators.operatorframework.io.bundle.manifests.v1: manifests/ operators.operatorframework.io.bundle.metadata.v1: metadata/ operators.operatorframework.io.bundle.package.v1: packageName operators.operatorframework.io.bundle.channels.v1: channels operators.operatorframework.io.bundle.channel.default.v1: defaultChannel # Annotations for testing有 scorecard 配置时 operators.operatorframework.io.test.mediatype.v1: scorecardv1 operators.operatorframework.io.test.config.v1: tests/scorecard/bundle.Dockerfile同样以FROM scratch为基础携带上述LABEL并通过COPY将 manifests、metadata、tests 拷入镜像对应路径。此外迁移过程会从 CSV 注解中提取 SDK 标记operators.operatorframework.io/builder与operators.operatorframework.io/project_layout定义于 internal/annotations/metrics/metrics.go写入 bundle 标签保留项目布局与 SDK 版本信息。测试证据仓库的 internal/cmd/operator-sdk/pkgmantobundle/pkgmantobundle_test.go 覆盖了该命令的核心行为参数校验不传参数或传多个参数都会报错恰好一个参数时通过多版本生成基于testdata/packagemanifests运行后应生成 2 个 bundle 目录每个目录都包含bundle.Dockerfile、metadata/annotations.yaml、非空 CSV 与 v1 CRDbundle-0.0.1因输入含 scorecard 配置而额外生成tests/scorecard/config.yaml镜像构建提供--build-cmd时可成功执行自定义构建输出目录冲突输出目录已存在时返回output directory: ... for bundles already exists错误通道映射getChannelsByCSV能返回 CSV 对应的多通道如alpha,beta无法识别时回退到默认通道getPackageMetadata在 packageName 或 defaultChannel 缺失时报错。新增bundle validate --optional-values——向验证器传递自定义键值v1.7.0 为operator-sdk bundle validate新增了可选的--optional-values标志对应 PR #4693允许以keyvalue列表的形式向验证器传入运行时参数。典型用法如operator-sdk bundle validate ./bundle --optional-valuesk8s-version1.22 --select-optional suiteoperatorframework标志定义与数据类型该标志在 internal/cmd/operator-sdk/bundle/validate/validate.go#L84-L87 中通过StringToStringVarP注册因此支持多次出现、累积成map[string]string例如--optional-valuesk8s-version1.22 --optional-valuescontainer-toolspodman会合并为{k8s-version: 1.22, container-tools: podman}fs.StringToStringVarP(c.optionalValues, optional-values, , optionalValueEmpty, Inform a []string map of keyvalues which can be used by the validator. e.g. to check the operator bundle against an Kubernetes version that it is intended to be distributed use --optional-valuesk8s-version1.22)可选验证器与标签选择器--optional-values必须配合--select-optional或--list-optional使用。可选验证器的注册表位于 internal/cmd/operator-sdk/bundle/validate/optional.go包括名称标签说明operatorhubv2nameoperatorhubv2, suiteoperatorframeworkOperatorHub.io 元数据校验capabilitiesnamecapabilities, suiteoperatorframeworkOperatorHub.io 能力元数据校验categoriesnamecategories, suiteoperatorframeworkOperatorHub.io 分类元数据校验operatorhubnameoperatorhub已弃用的 OperatorHub.io 元数据校验communitynamecommunityalpha社区 Operator bundle 校验已在后续版本中被外部验证器取代alpha-deprecated-apisnamealpha-deprecated-apis, suiteoperatorframeworkalpha废弃 API 校验可配合k8s-version检查 bundle 是否使用了目标集群版本中已废弃的 APIgood-practicesnamegood-practices, suiteoperatorframework良好实践校验multiarchnamemultiarchalpha多架构支持校验需能拉取 CSV 中声明的镜像选择器通过 Kubernetes 标签选择器语法解析labels.Parse常用两种用法# 按套件整体运行 operator-sdk bundle validate ./bundle --select-optional suiteoperatorframework # 按单一验证器运行 operator-sdk bundle validate ./bundle --select-optional nameoperatorhub运行operator-sdk bundle validate --list-optional可以列出全部可选验证器及其标签。键值如何被验证器消费在run()流程中internal/cmd/operator-sdk/bundle/validate/validate.go#L172-L174bundle 对象列表会被追加optionalValues这个map随后一并传给被选中验证器的Validate(objs...)方法internal/cmd/operator-sdk/bundle/validate/optional.go#L164-L190。因此各验证器可以直接从传入对象中读取k8s-version、container-tools等键值作为校验参数。例如k8s-version1.22让 operatorhub / alpha-deprecated-apis 验证器按指定 Kubernetes 版本检查 manifest 兼容性container-toolsdocker|podman|none指定 multiarch 验证器检查镜像时使用的容器工具默认docker。命令整体校验流程含退出码语义bundle validate在 v1.7.0 版本中的完整行为可概括为internal/cmd/operator-sdk/bundle/validate/cmd.go输入可以是本地 bundle 目录如./bundle或远程可拉取的 bundle 镜像如registry/name:tag注意镜像必须存在于远端仓库本地镜像不被支持依次执行 bundle 格式校验ValidateBundleFormat与内容校验ValidateBundleContent若指定了--select-optional追加运行可选验证器若指定--alpha-select-external还会运行外部验证器脚本存在错误时退出码为 1仅有警告或全部通过时退出码为 0--output支持text默认与json-alpha1两种结果格式日志输出到 stderr便于| jq . result.json重定向 JSON 结果。弃用packagemanifests 相关命令v1.7.0 正式弃用对应 PR #4838operator-sdk generate packagemanifestsoperator-sdk run packagemanifests原因在于 OLM 已确定 bundle 为打包与分发格式的主流方向packagemanifests 支持整体让位于 operator bundles。迁移路径正是上文介绍的新命令pkgman-to-bundle先用它把存量 packagemanifests 一次性转换为 bundle再改用operator-sdk bundle/operator-sdk run bundle等 bundle 工作流。从当前仓库源码看internal/cmd/operator-sdk/generate/packagemanifests/cmd.go与internal/cmd/operator-sdk/run/packagemanifests/packagemanifests.go等命令实现仍保留但属于维护状态新项目应直接采用 bundle 格式。修复项详解Ansible / Helm 操作符补上--config标志此前在引入文件化配置支持时--config标志被遗漏在 ansible-operator 与 helm-operator 二进制之外对应 PR #4776。v1.7.0 修复了该问题。在 Helm 一侧该标志定义于 internal/helm/flags/flag.go#L72-L76用于从配置文件加载 controller manager 选项同时它已被标记为 deprecated原因是 controller-runtime 的 ComponentConfig 包被弃用_ flagSet.MarkDeprecated(config, controller-runtime has deprecated the ComponentConfig package and as such, the ability to load the configuation from a file. ...)这意味着--config在当时的 controller-runtime 版本中仍可用但属于过渡性能力升级 controller-runtime 后会随 ComponentConfig 一起移除。修正 ansible-operator 与 helm-operatorrun命令日志格式对应 PR #4844。Helm 操作符的run命令实现位于 internal/cmd/helm-operator/run/cmd.go其日志系统基于 controller-runtime 的logr zapzapf.New(zapf.UseFlagOptions(opts))修复旨在让两类二进制run命令的日志输出保持一致的键值对结构便于调试与检索。leases.coordination.k8s.io独立为 proxy-role 规则对应 PR #4835。在 go/v3、ansible/v1、helm/v1 三种项目布局中leases.coordination.k8s.io的权限被从原有角色中拆出独立成一条 proxy-role 规则。其最终产物形态可参考仓库测试数据 testdata/go/v4/memcached-operator/bundle/manifests/memcached-operator.clusterserviceversion.yaml#L218-L229- apiGroups: - coordination.k8s.io resources: - leases verbs: - get - list - watch - create - update - patch - delete这一拆分让 leader election 所需的 lease 权限与业务资源权限解耦权限模型更清晰、更易审计。(go/v3) Makefile 的SHELL变量显式指向 bash同一 PR #4835 中go/v3 布局生成的 Makefile 现在会显式设置SHELL /bin/bash当前仓库根 Makefile 第一行即为该设置并携带 shell 选项。这保证了make目标在默认 shell 非 bash 的环境如部分容器镜像中默认sh下行为一致避免管道、进程替换等 bash 语法失效导致的构建失败。generate kustomize manifests不再收录非 served CRD 版本对应 PR #4842。此前生成的 CSV 会把 CRD 中所有版本都写入.spec.customresourcedefinitions.owned包括served: false的版本v1.7.0 修复为只收录被服务的版本。测试证据位于 internal/generate/clusterserviceversion/clusterserviceversion_updaters_test.go#L224-L257当 CRD 同时含v1servedtrue与v1beta1servedfalse时applyCustomResourceDefinitions生成的owned列表只保留v1一项。该修复避免了 CSV 中声明不可用版本导致的误导与安装校验问题。总结operator-sdk v1.7.0 的变更具有清晰的演进主线迁移能力pkgman-to-bundle为存量 packagemanifests 用户提供了低成本迁移到 bundle 的官方通道输入目录即可产出标准 bundle 布局、元数据与可选镜像验证能力--optional-values让bundle validate的可选验证器具备参数化能力如指定目标 Kubernetes 版本、容器工具配合标签选择器可覆盖 OperatorHub、废弃 API、多架构、良好实践等多种校验场景方向收敛packagemanifests 命令被正式弃用新项目应直接采用 bundle 工作流质量修复--config标志补齐、日志格式统一、leases 权限独立、Makefile shell 显式化、非 served CRD 过滤共同提升了多语言布局go/ansible/helm的构建与运行一致性。如需深入了解各功能的实现细节可继续阅读仓库中的 pkgman-to-bundle 命令实现、bundle 元数据模板、bundle 验证命令 及对应的 迁移命令测试。赞分享云原生后端开发工具微服务【免费下载链接】operator-sdkSDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding.项目地址https://gitcode.com/gh_mirrors/op/operator-sdk点击查看免费下载相关推荐Operator SDK v1.22.0 版本特性解析Go 1.18 支持、bundle 校验增强与 File-Based Catalog 迁移Operator SDK v1.22.0 版本特性解析Go 1.18 支持、bundle 校验增强与 File Based Catalog 迁移 本指南围绕云原生后端开发工具微服务Operator SDK v1.17.0 版本解析混合 Helm 插件、Bundle 校验增强与 Go 1.17 依赖升级Operator SDK v1.17.0 版本解析混合 Helm 插件、Bundle 校验增强与 Go 1.17 依赖升级 本篇文章以 Operator SD云原生后端开发工具微服务Operator SDK v1.31.0 版本解析Ansible 2.15 迁移、Helm Secret Informer 与 OLM 稳定性修复Operator SDK v1.31.0 版本解析Ansible 2.15 迁移、Helm Secret Informer 与 OLM 稳定性修复 本篇文章基云原生后端开发工具微服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考