Renovate 的 Kustomize Manager 完全指南:自动更新 `kustomization.yaml` 中的远程资源、镜像与 Helm Chart Renovate 的 Kustomize Manager 完全指南自动更新kustomization.yaml中的远程资源、镜像与 Helm Chart【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovateRenovate 内置的 Kustomize manager 专注于自动维护 Kubernetes 声明式配置文件kustomization.yaml可以自动提取并升级其中的远程资源remote resources、镜像标签image tags、组件components与 Helm Chart并在满足条件时自动执行 Helm Chart 的膨胀inflate操作。读完本文你将掌握 Kustomize manager 的全部能力边界、depType细分控制方式、kustomizeInflateHelmCharts等关键配置以及其底层提取逻辑与已知限制。一、Kustomize Manager 是什么Kustomize manager 是 Renovate 众多 package manager 中的一个位于仓库源码的 lib/modules/manager/kustomize 目录。它专门用于解析仓库中的kustomization.yaml文件将其中的外部引用识别为依赖并保持更新。从 index.ts 的默认配置可以看出它的匹配规则与行为基调export const defaultConfig { managerFilePatterns: [/(^|/)kustomization\\.ya?ml$/], pinDigests: false, };文件匹配模式为/(^|/)kustomization\.ya?ml$/即同时覆盖kustomization.yaml与kustomization.yml两种命名默认不固定 digestpinDigests: false只在有升级时顺带更新。它归属的类别是categories: [kubernetes]参考文档主页为 kubectl.docs.kubernetes.io/references/kustomize。支持管理的内容Renovate 的 Kustomize manager 可以管理kustomization.yaml中的以下五个部分remote resources通过resources字段引用的远程构建资源image tags通过images字段声明的镜像标签配合newTag、newName、digest使用components通过components字段引用的远程 Kustomize Componenthelm charts通过helmCharts字段引用的 Helm Chartremote bases通过bases字段引用的远程基础自 Kustomizev2.1.0起已废弃。其中 remote bases 虽然已被 Kustomize 官方弃用但 Renovate 仍然兼容解析以便存量项目平滑过渡。二、工作流程四步完成依赖更新官方 readmelib/modules/manager/kustomize/readme.md给出了完整的执行流程Renovate 在每个仓库中搜索所有kustomization.yaml文件从远程 bases、image tags 和 Helm charts 中提取依赖Renovate 解析依赖的源仓库检查是否存在 SemVer 标签如果发现更新则直接改写kustomization.yaml文件。整个流程在源码中的落点是 extract.ts 的extractPackageFile函数它先通过parseKustomize将 YAML 解析为Kustomize结构再依次遍历bases、resources、components、images、helmCharts五个字段提取依赖最后以{ deps }形式返回只有当kind为Kustomization或Component时才继续处理见 parseKustomize。提取时依赖解析所支持的 datasource 在 index.ts 中声明export const supportedDatasources [ DockerDatasource.id, GitTagsDatasource.id, GithubTagsDatasource.id, HelmDatasource.id, ];即 Docker、GitTags、GithubTags、Helm 四种 datasource分别对应镜像、通用 Git 仓库、GitHub 仓库与 Helm Chart 的版本探测。三、用 depType 精细控制升级范围为了对“哪些依赖该升级”进行精细控制Kustomize manager 使用了三种depType。注意readme 中列出的四个名称中实际由 dep-types.ts 声明的knownDepTypes为depType含义KustomizationKustomization 资源引用远程 bases 或 imagesComponentKustomize Component 资源引用远程 bases 或 imagesHelmChart通过helmCharts嵌入 kustomization 文件的 Helm Chart而在实际提取时OCI 风格的 Helm Chart仓库地址形如oci://...会通过 helmv3/oci.ts 的getOciChartDep生成依赖从而在 extract.ts 中得到以 Docker 作为 datasource 的OCIChartdepType。因此 readme 中的四个 depTypeComponent、Kustomization、HelmChart、OCIChart在运行期都是真实存在的。你可以像下面这样使用packageRules对不同的 depType 采取不同策略{ packageRules: [ { matchDepTypes: [HelmChart, OCIChart], matchManagers: [kustomize], enabled: false } ] }结合matchFileNames、matchDatasources等字段可以做到“镜像只升级 patch 版本、Helm Chart 全部忽略、远程资源走独立频率”之类的细粒度控制。四、Helm Charts 膨胀Inflate机制Kustomize 在helmCharts字段中引用 Helm Chart 后执行kustomize build时会把 Chart 的内容展开到本地目录默认是charts/。Renovate 会在以下任一条件成立时对 kustomization 中引用的 Helm Chart 执行膨胀操作Renovate 升级前的版本本身就是被膨胀过的即本地charts/name-version目录已存在在postUpdateOptions中启用了kustomizeInflateHelmCharts选项。kustomizeInflateHelmCharts在 lib/config/options/index.ts 中被登记为postUpdateOptions的合法取值之一。启用方式是在 renovate 配置中追加该选项{ postUpdateOptions: [kustomizeInflateHelmCharts] }膨胀的具体执行在 artifacts.ts 的updateArtifacts中它会过滤出depType HelmChart且版本发生变化的依赖通过helm pull --untar --untardir ... --version ...命令把新旧版本的 Chart 拉到chartHome默认charts可用helmGlobals.chartHome覆盖下若旧版本目录已存在则先删除再拉取新版本。期间生成的增删文件会作为 artifact 提交到 PR 中。判断“是否膨胀”的日志与逻辑artifacts.tsNot inflating Helm chart for ${depName} as kustomizeInflateHelmCharts is not enabled and the current version isnt inflated同时执行helm命令时会通过 common.ts 的generateHelmEnvs注入安全环境变量把HELM_REGISTRY_CONFIG、HELM_REPOSITORY_CONFIG、HELM_REPOSITORY_CACHE指向 Renovate 的私有缓存目录避免文件与凭据泄露当 Helm 版本约束低于3.8.0时还会设置HELM_EXPERIMENTAL_OCI1以兼容 OCI 仓库。注意为防止 Renovate 去更新那些被展开inflate出来的 Chart 目录里的依赖需要手动把这些目录从 Helm 相关 manager 中排除。官方推荐的配置{ packageRules: [ { matchFileNames: [**/charts/**], matchManagers: [helmv3, helm-values], enabled: false } ] }这段配置让**/charts/**目录下的文件不再被helmv3与helm-values两个 manager 处理从而避免双重更新或对已展开内容的误改。五、镜像提取的规则与边界images字段的解析集中在 extractImage其行为直接决定了哪些镜像能被正确识别与更新。5.1 标签可以来自 newTag键顺序无关Kustomize 的images列表项中name、newTag等键的书写顺序不限Renovate 都能正确解析- name: image/name newTag: v0.0.1 # 或 - newTag: v0.0.1 name: image/name5.2 digest 可写在 newTag 或 digest 中Digest 可以以两种形式出现- name: image/name newTag: v0.0.1sha256:3eeba3e2caa30d2aba0fd78a34c1bbeebaa1b96c7aa3c95ec9bac44163c5ca4f # 不带版本时digest 按 :latest 追踪 - name: image/name digest: sha256:3eeba3e2caa30d2aba0fd78a34c1bbeebaa1b96c7aa3c95ec9bac44163c5ca4f从源码看纯digest形式会生成带currentDigest、replaceString: digest的依赖而newTag: tagdigest形式则使用autoReplaceStringTemplate: {{newValue}}{{#if newDigest}}{{newDigest}}{{/if}}来拼接新值。由于pinDigests: falsedigest 默认不会被单独固定。5.3 用 newName 更换镜像仓库newName用于把镜像指向另一个仓库支持多种写法- name: image/name newName: custom-image/name:v0.0.1 - name: image/name newName: custom-image/name:v0.0.1sha256:3eeba3e2caa30d2aba0fd78a34c1bbeebaa1b96c7aa3c95ec9bac44163c5ca4f - name: image/name newName: custom-image/namesha256:3eeba3e2caa30d2aba0fd78a34c1bbeebaa1b96c7aa3c95ec9bac44163c5ca4f - name: image/name newName: custom-image/name newTag: v0.0.1sha256:3eeba3e2caa30d2aba0fd78a34c1bbeebaa1b96c7aa3c95ec9bac44163c5ca4f - name: image/name newName: custom-image/name digest: sha256:3eeba3e2caa30d2aba0fd78a34c1bbeebaa1b96c7aa3c95ec9bac44163c5ca4f在实现上extractImage以newName ?? name作为实际的解析名称见 extract.ts并复用dockerfilemanager 的getDep来拆分仓库、标签与 digest。5.4 会被 Kustomize 忽略的写法将被跳过为了避免歧义Renovate 会跳过那些 Kustomize 自身会忽略的镜像写法。最典型的是同时声明newTag与digest的情况——Kustomize 会忽略newTag此时 Renovate 会记录skipReason: invalid-dependency-specification并跳过该依赖# bad被跳过因为设置了 digest 时 newTag 会被忽略 - name: image/name newTag: v0.0.1 digest: sha256:3eeba3e2caa30d2aba0fd78a34c1bbeebaa1b96c7aa3c95ec9bac44163c5ca4f # good把 digest 并入 newTag - name: image/name newTag: v0.0.1sha256:3eeba3e2caa30d2aba0fd78a34c1bbeebaa1b96c7aa3c95ec9bac44163c5ca4f此外newTag或digest不是合法字符串如newTag直接以sha256:开头、digest不以sha256:开头时依赖会被标记为skipReason: invalid-value镜像只有name而没有newTag/newName/digest时则返回null不生成依赖。六、远程资源与 Git 仓库引用的解析resources、bases、components中的远程引用由 extractResource 负责。它支持 Kustomize 官方 URL 规范对齐 hashicorp go-getter 的 URL 格式能识别以下形式的 URLgitgithub.com:moredhel/remote-kustomize.git?refv0.0.1SSH 形式github.com/fluxcd/flux/deploy?ref1.19.0短路径形式https://github.com/user/test-repo.git?refv0.0.1带//子目录的形式如gitgithub.com:kubernetes-sigs/kustomize.git//examples/helloWorld?refv2.0.0带_git分隔符的 Azure DevOps 风格地址如git::https://itfs.mycompany.com/collection/project/_git/somerepos?ref...解析时优先匹配_git、.git等特征再尝试带额外//的路径最后回到通用格式见 extract.ts 中的四个正则。版本取自查询参数ref或versionref优先见 extract.ts。若路径命中github.com则使用GithubTagsDatasourcedepName为去掉.git后缀的仓库路径否则使用GitTagsDatasource并额外携带packageName指向完整 URL。这些依赖的depType会被标记为文件本身的kindKustomization或Component因此你可以通过matchDepTypes单独控制远程资源与镜像的更新策略。测试用例extract.spec.ts覆盖了github.com/fluxcd/flux/deploy?ref1.19.0、gitgithub.com:moredhel/remote-kustomize.git?refv0.0.1、github.com/user/repo//deploy?refv0.0.1等典型场景可作为理解解析行为的参考。七、Helm Chart 的提取helmCharts字段的每个条目包含name、repo、version三项见 types.tshelmCharts: - name: minecraft repo: https://itzg.github.io/minecraft-server-charts version: 3.1.3extractHelmChart 的处理逻辑若repo是 OCI 仓库oci://开头走getOciChartDep以 Docker 作为 datasource 生成OCIChart类型依赖否则以HelmDatasource生成依赖registryUrls指向repo版本取version字段depType 为HelmChart。Helm Chart 的更新同样遵循 SemVer 标签探测原则Renovate 会在 chart 仓库中查找符合 SemVer 语义的版本标签再回写version字段。八、已知限制官方 readme 明确列出的限制如下使用时需注意使用 HTTPS 拉取远程 Git 仓库未经测试——即https://形式的远程资源引用虽然在解析层面被支持但端到端更新流程未经过完整测试验证images 列表中键的顺序可以是任意顺序已在上文 5.1 说明Renovate 均能解析digest 可以固定在newTag或digest中见 5.2不带版本的 digest 按:latest追踪镜像仓库可以用newName更换见 5.3被 Kustomize 忽略的镜像写法会被跳过以避免歧义见 5.4。另外从源码结构可以推断artifacts.ts的膨胀流程依赖本地 Helm 二进制通过toolConstraints声明必要时由 Renovate 自动安装如果helm pull失败会把 stderr 以artifactError形式反馈在 PR 上。九、端到端配置示例把以上内容组合成一个完整的 Renovate 配置即可覆盖 Kustomize 场景的常见诉求{ kustomize: { fileMatch: [(^|/)kustomization\\.ya?ml$] }, postUpdateOptions: [kustomizeInflateHelmCharts], packageRules: [ { matchFileNames: [**/charts/**], matchManagers: [helmv3, helm-values], enabled: false }, { matchManagers: [kustomize], matchDepTypes: [HelmChart, OCIChart], separateMinorPatch: true }, { matchManagers: [kustomize], matchDatasources: [docker], pinDigests: true } ] }要点说明fileMatch可以按需覆盖默认的kustomization.ya?ml匹配例如加入**/kustomization.yaml之外的自定义路径kustomizeInflateHelmCharts保证首次未膨胀的 Chart 也能被拉取展开对**/charts/**的排除规则防止膨胀产物被helmv3/helm-values重复处理通过matchDepTypes与matchDatasources可对 Chart 类依赖与 Docker 镜像采取不同的升级与 digest 策略。十、相关源码导航如果你希望深入阅读实现细节推荐按以下路径继续探索当前仓库关注点文件manager 入口、默认配置、datasource 声明lib/modules/manager/kustomize/index.ts依赖提取核心逻辑lib/modules/manager/kustomize/extract.tsHelm Chart 膨胀与 artifact 生成lib/modules/manager/kustomize/artifacts.tsdepType 元数据lib/modules/manager/kustomize/dep-types.tsHelm 执行环境变量lib/modules/manager/kustomize/common.ts数据结构定义lib/modules/manager/kustomize/types.ts提取逻辑测试lib/modules/manager/kustomize/extract.spec.ts膨胀逻辑测试lib/modules/manager/kustomize/artifacts.spec.tspostUpdateOptions选项登记lib/config/options/index.tsOCI Chart 依赖生成lib/modules/manager/helmv3/oci.tsKustomize manager 的官方说明文档为 lib/modules/manager/kustomize/readme.md其中记录了本文所述的能力范围与限制的权威出处。结语Renovate 的 Kustomize manager 用一套统一的提取与更新机制覆盖了kustomization.yaml中远程资源、镜像标签、组件与 Helm Chart 的全部主要更新场景并通过depType体系把控制粒度下放到每一类依赖。理解其提取规则尤其是镜像字段的各种合法/非法组合与kustomizeInflateHelmCharts膨胀机制是让 Kubernetes 配置仓库实现“声明式自动化更新”的关键一步。配合postUpdateOptions与packageRules你可以把它无缝嵌入现有的 GitOps 工作流中。【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考