YAOTU INSIGHTS

Helmfile 高级特性实战:Kubedog 资源跟踪、Kustomize 集成与依赖管理

Helmfile 高级特性实战:Kubedog 资源跟踪、Kustomize 集成与依赖管理
云原生运维工具【免费下载链接】helmfileDeclaratively deploy your Kubernetes manifests, Kustomize configs, and Charts as Helm releases. Generate all-in-one manifests for use with ArgoCD.项目地址https://gitcode.com/gh_mirrors/hel/helmfile点击查看免费下载本文基于 helmfile 官方文档 docs/advanced-features.md 展开系统讲解 helmfile 的五大高级能力基于 Kubedog 的精细化资源跟踪trackMode全参数族、借助 vals 导入外部配置参数、以 Helm 方式部署 Kustomization、对 Helm Chart 进行 Adhoc Kustomize 改造、以及不 fork Chart 直接注入依赖与按环境拆分 Lockfile。读完本文你将能在apply/sync时获得远超 Helm 内置--wait的部署反馈并能把 kustomization、Chart 与补丁统一纳入声明式发布体系。一、使用 Kubedog 进行资源跟踪Helmfile 可以借助 werf/kubedog 这类高级跟踪库替代 Helm 内置的--wait标志从而获得更详细的部署进度反馈与更强的控制能力。其核心思想是不再让 Helm 黑盒等待而是由 Helmfile 直接观察目标资源的就绪状态并实时输出进度与日志。在 pkg/state/state.go 中ReleaseSpec声明了完整的跟踪相关字段TrackMode、TrackTimeout、TrackLogs、TrackLogsInterval、TrackLogsUntilReady、TrackFailedLogs、TrackKinds、SkipKinds、TrackResources、KubedogQPS、KubedogBurst等全部以track*/kubedog*前缀出现在releases[]下与命令行 flag 一一对应。1.1 基本用法在helmfile.yaml中启用 kubedog 跟踪releases: - name: myapp chart: ./charts/myapp trackMode: kubedog trackTimeout: 300 # 秒 trackLogs: true也可以在命令行上临时指定优先级高于 release 级配置helmfile apply --track-mode kubedog --track-timeout 300 --track-logs --track-logs-interval 1s1.2 配置项一览配置项含义默认值trackMode设置为kubedog启用 kubedog 跟踪helm-legacy使用 Helm v4 的 legacy 等待模式helmtrackTimeout资源跟踪超时时间秒300trackLogs在部署期间打印被跟踪资源的日志falsetrackLogsInterval日志输出更新的间隔形如1s、30s10s最小1strackLogsUntilReady在trackLogs: true时每个 Pod 首次就绪后停止打印常规 Pod 日志falsetrackFailedLogs仅打印部署期间失败的 Pod 的已收集日志false只查看失败 Pod 日志时可在 release 上设置trackFailedLogs: true或对helmfile apply/helmfile sync使用--track-failed-logs。若两个日志选项同时启用则打印所有被跟踪 Pod 的日志。启用 kubedog 跟踪且开启trackLogs或trackFailedLogs后helmfile apply与helmfile sync默认每 10 秒打印一次收集到的日志。可通过 release 上的trackLogsInterval或命令行--track-logs-interval如上面的1s调整间隔。显式提供的命令行 flag 覆盖 release 设置否则 release 设置优先于10s默认值最小值是1s。部署进度的变化检查同样每 10 秒进行一次。从源码看10s默认值定义在 pkg/kubedog/options.godefaultLogsInterval 10 * time.SecondTrackOptions通过WithLogsInterval、WithLogsUntilReady、WithFailedLogsOnly等链式方法装配见 pkg/kubedog/options.go。1.3 仅跟踪启动日志Startup-Only Pod Logs设置trackLogsUntilReady: true可以在其他副本仍在启动时只展示启动日志而不再持续打印已就绪 Pod 的应用流量releases: - name: myapp chart: ./charts/myapp trackMode: kubedog trackTimeout: 600 trackLogs: true trackLogsUntilReady: true或使用命令行 flaghelmfile apply --track-mode kubedog --track-timeout 600 --track-logs --track-logs-until-ready就绪前捕获的日志会被刷新输出如果同一 Pod 之后变为未就绪或失败日志输出仍只限于启动阶段而就绪与失败跟踪对每个 Pod 持续进行Job 日志保持原有行为。Kubernetes 的就绪时间戳精度为秒级因此就绪那一秒的日志会被保留以免丢失启动输出。该选项默认false所以trackLogs: true会贯穿整个跟踪过程持续打印日志它仅在trackLogs启用时生效单独设置trackFailedLogs: true仍保持原有的仅失败行为当trackLogs与trackFailedLogs同时启用时trackLogs优先。该机制的底层实现位于 pkg/kubedog/logs.gopodLogFilter独立于 kubedog 的工作负载就绪判断只负责过滤输出Pod 跟踪与日志捕获照常进行。需要特别注意的是就绪截止过滤只适用于deploy、sts、ds三类工作负载Job 被显式排除pkg/kubedog/logs.go因为 Job 可能处于 Ready 状态却仍在执行。1.4 三种跟踪模式Track ModesHelmfile 支持三种trackModehelm默认使用 Helm 内置的--wait标志进行资源跟踪helm-legacy使用 Helm v4 的--waitlegacy标志。适合从 Helm v3 迁移到 Helm v4 的场景——当 Chart 与新 watcher 等待机制存在兼容问题时例如只有livenessProbe而没有startupProbe的 Chart可以退回 v3 风格的轮询行为。注意该模式仅对 Helm v4 生效配合 Helm v3 时会回退为普通--waitkubedog使用 kubedog 进行带详细反馈的高级资源跟踪。模式解析的优先级从源码可见一斑pkg/state/helmx.go 的getTrackMode依次取release.TrackMode→SyncOpts.TrackMode→HelmDefaults.TrackMode→ 兜底helm。而 pkg/state/helmx.go 的appendWaitFlags明确仅当 Helm 为 v4 时才追加--waitlegacy否则打印警告并追加普通--wait。这一分支逻辑在 pkg/state/helmx_test.go 中有完整的表格化测试覆盖含 Helm v4 helm-legacy、Helm v3 回退告警、kubedog模式追加普通--wait等用例。1.5 资源过滤Resource Filtering通过白名单/黑名单控制需要跟踪的资源releases: - name: myapp chart: ./charts/myapp trackMode: kubedog # 只跟踪特定资源类型 trackKinds: - Deployment - StatefulSet # 跳过某些资源类型 skipKinds: - ConfigMap - Secret1.6 指定资源跟踪Specific Resource Tracking按名称与命名空间只跟踪特定资源releases: - name: myapp chart: ./charts/myapp trackMode: kubedog trackResources: - kind: Deployment name: myapp-deployment namespace: default - kind: Job name: myapp-jobtrackResources的每个条目对应源码中的TrackResourceSpec结构Kind、Name、Namespace三个字段见 pkg/state/state.go并在 pkg/state/helmx.go 的convertTrackResources中转换为 kubedog 的resource.Resource列表随后与trackKinds、skipKinds一起装配进resource.FilterConfigpkg/state/helmx.go。1.7 过滤优先级规则资源过滤按以下优先级生效从高到低trackResources白名单指定资源最高优先级skipKinds黑名单资源类型trackKinds白名单资源类型。实际跟踪时被过滤后保留的资源数量会通过kubedog filter kept N of M resources之类的日志输出见 pkg/kubedog/tracker.go便于确认过滤是否符合预期。1.8 价值与收益实时反馈以详细状态更新展示部署进度日志流式输出部署期间直接查看容器日志细粒度控制只跟踪关心的资源更易排障部署问题即刻可见。1.9 Helm v4 Legacy 等待模式使用 Helm v4 时若 Chart 存在缺少startupProbe的损坏livenessProbe配置默认的--waitwatcher模式可能失败。Helm v4 引入了--waitlegacy采用与 Helm v3 行为兼容的更简单轮询机制。设置trackMode: helm-legacy即可releases: - name: myapp chart: ./charts/myapp trackMode: helm-legacy或命令行helmfile apply --track-mode helm-legacy1.10 兼容性说明helm默认模式使用 Helm 内置--wait标志helm-legacy使用 Helm v4 的--waitlegacy标志仅 Helm v4 可用kubedog使用 kubedog 库进行高级资源跟踪Kubedog 跟踪与 Helm 3.x 和 4.x 兼容Kubedog 是编译期依赖仅在设置trackMode: kubedog时才被使用适用于部署以下受支持的工作负载类型当前为Deployment、StatefulSet、DaemonSet、Job与Canary其他资源类型仍由 Helm/Helmfile 正常创建但会被 kubedog 跟踪器忽略。三种模式常量定义于 pkg/kubedog/options.goTrackModeHelm helm、TrackModeHelmLegacy helm-legacy、TrackModeKubedog kubedog。1.11 高级 Kubedog 设置releases: - name: myapp chart: ./charts/myapp trackMode: kubedog trackTimeout: 600 trackLogs: true kubedogQPS: 5.0 kubedogBurst: 10kubedogQPSkubedog Kubernetes 客户端的 QPS每秒查询数未设置时沿用底层默认值。从源码看TrackOptions构造时初始化为 QPS100、Burst200pkg/kubedog/options.go并可通过WithQPS/WithBurst覆盖kubedogBurstkubedog Kubernetes 客户端的 Burst突发量未设置时沿用默认值。补充ReleaseSpec还包含trackFailOnError跟踪失败时是否导致非零退出码与helmStuckGracekubedog 跟踪时针对 Helm v4 钩子等待卡死的安全阀详见 pkg/state/state.go源码中也有对应注释与实现可作为排障时的进阶选项。二、向 Helmfile 导入配置参数vals 集成Helmfile 集成了 vals 来从以下后端导入配置参数AWS SSM Parameter StoreAWS SecretsManagerVaultSOPS完整后端列表可查阅 vals 项目的 Supported Backends 文档。该特性最初实现于 roboll/helmfile 的 PR #906对设计思路与内部工作机制感兴趣的读者可以审阅该 PR仓库侧的实现位于 pkg/plugins/vals.go并配有 pkg/plugins/vals_test.go 测试。典型用法是在values或environment.values中通过ref前缀引用后端路径例如refawsssm://...、refvault://...、refsops://...Helmfile 会在渲染阶段解析为真实值。实际可用的引用前缀以 vals 支持的语法为准。三、使用 Helmfile 部署 KustomizationHelmfile 可以直接部署 kustomize 的 kustomization。大多数 Kustomize 操作通常通过kustomize edit完成而这些操作都可以声明式地在 Helm 的values.yaml文件中表达。底层实现上Helmfile 将 kustomization转换成本地临时目录中的 Chart从而可以通过helm upgrade --install安装。转换分两步完成先生成临时 kustomization综合各种选项再从临时 kustomization 生成临时 Chart。转换逻辑的伪代码如下$ TMPCHART/tmp/sometmpdir $ mkdir -p ${TMPCHART}/templates $ somehow_generate_chart_yaml ${TMPCHART}/Chart.yaml $ TMPKUSTOMIZATION/tmp/sometmpdir2 $ somehow_generate_temp_kustomization_yaml ${TMPKUSTOMIZATION}/kustomization.yaml $ kustomize build ${TMPKUSTOMIZATION}/kustomization.yaml ${TMPCHART}/templates/all.yaml假设你的helmfile.yaml如下releases: - name: myapp chart: mykustomization values: - values.yamlHelmfile 首先生成一个临时kustomization.yamlbases: - ${ABS_PATH_TO_HELMFILE_YAML}/mykustomization随后依次执行以下步骤对values.yaml中生成的每个$IMAGE运行kustomize edit set image $IMAGE按values.yaml中指定的namePrefix运行kustomize edit set nameprefix $NAMEPREFIX按values.yaml中指定的nameSuffix运行kustomize edit set namesuffix $NAMESUFFIX按values.yaml中指定的namespace运行kustomize edit set namespace $NS。用于 kustomization 的values.yaml示例如下images: # kustomize edit set image mysqleu.gcr.io/my-project/mysqlcanary - name: mysql newName: eu.gcr.io/my-project/mysql newTag: canary # kustomize edit set image myappmy-registry/my-appsha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3 - name: myapp digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3 newName: my-registry/my-app # kustomize edit set nameprefix foo- namePrefix: foo- # kustomize edit set namesuffix -bar nameSuffix: -bar # kustomize edit set namespace myapp namespace: myapp至此Helmfile 可以从你在releases[].chart中指定的基础 kustomization 与values.yaml生成完整的 kustomization并将其纳入临时 Chart。最后Helmfile 像安装普通 Chart 一样安装这个临时 Chart——无论每个应用是以 Helm Chart 还是 kustomization 声明你都可以用 Helmfile 统一管理。从源码看这一Chart 化能力由 github.com/helmfile/chartify 与 pkg/state/helmx.gotest/advanced/目录下提供了可直接运行的多套集成用例test/advanced/helmfile.yaml 及其配套的 kustomapp / kustomapp2含kustomization.yaml与all.yaml。四、对 Helm Chart 进行 Adhoc Kustomize 改造借助与 Kustomize 的集成Helmfile 不仅能将 Kustomization 部署为 Helm Chart还能在安装前对 Chart 做 Kustomize 改造。提示以下字段也可以用与values字段相同的方式指定文件路径。目前 Helmfile 允许设置以下字段对 Chart 进行 kustomizereleases[].strategicMergePatchesreleases[].jsonPatchesreleases[].transformers这些字段在 pkg/state/state.go 中对应JSONPatches、StrategicMergePatches与Transformers均为[]any既可以是内联 YAML 映射也可以是文件路径。底层处理位于 pkg/state/helmx.go非内联的补丁条目会被渲染为临时 values 文件支持模板再交给 chartify 生成临时 Chart 后统一安装。4.1strategicMergePatches通过releases[].strategicMergePatches可以添加/更新 Helm Chart 渲染出的任意 Kubernetes 资源字段repositories: - name: incubator url: https://charts.helm.sh/incubator releases: - name: raw1 chart: incubator/raw values: - resources: - apiVersion: v1 kind: ConfigMap metadata: name: raw1 namespace: default data: foo: FOO strategicMergePatches: - apiVersion: v1 kind: ConfigMap metadata: name: raw1 namespace: default data: bar: BAR对上述示例执行helmfile template会得到一个名为raw1的 ConfigMap其data为foo: FOO bar: BAR注意第二个data字段bar正是来自上面helmfile.yaml中定义的 strategic-merge 补丁。另外还有releases[].jsonPatches与strategicMergePatches工作方式类似但额外支持删除字段。同样可参考 test/advanced/helmfile.yaml 中的补丁示例。4.2transformers设置transformers可以应用 Kustomize 的 transformers关于内置插件的配置方式可参考 kustomize 官方 configuring the builtin plugins 文档。每个条目可以是 YAML 或 Go 模板文件的路径也可以是内联的 transformer 声明YAML 哈希。它常用于为资源批量添加公共标签与注解。下面的示例为aws-load-balancer-controllerChart 渲染出的每个资源添加公共注解与标签releases: - name: aws-load-balancer-controller namespace: kube-system forceNamespace: kube-system chart: center/aws/aws-load-balancer-controller transformers: - apiVersion: builtin kind: AnnotationsTransformer metadata: name: notImportantHere annotations: area: 51 greeting: take me to your leader fieldSpecs: - path: metadata/annotations create: true - apiVersion: builtin kind: LabelTransformer metadata: name: notImportantHere labels: foo: bar fieldSpecs: - path: metadata/labels create: true如前所述transformers既可以是一组内嵌 transformer也可以是 YAML 或 Go 模板文件或三者混用transformers: # 内嵌 transformer - apiVersion: builtin kind: AnnotationsTransformer metadata: name: notImportantHere annotations: area: 51 greeting: take me to your leader fieldSpecs: - path: metadata/annotations create: true # YAML 文件 - path/to/transformer.yaml # Go 模板 # 与 release values 文件模板相同的模板参数集可用 - path/to/transformer.yaml.gotmpl关于如何声明 transformers 的更多信息可参考 kustomize 官方 configuring the builtin plugins 文档。五、不 fork Chart 添加依赖借助 Helmfile你可以不 fork 一个 Helm Chart 就为它添加 Chart 依赖。下面是一个为 releasefoo添加stable/envoy依赖的helmfile.yaml示例repositories: - name: stable url: https://charts.helm.sh/stable releases: - name: foo chart: ./path/to/foo dependencies: - chart: stable/envoy version: 1.5当 Helmfile 遇到releases[].dependencies时它会从./path/to/foo创建另一个临时 Chart并在其Chart.yaml中添加如下dependencies从而免去 forkdependencies: - name: envoy repo: https://charts.helm.sh/stable condition: envoy.enabled一个 Helm Chart 可以对同一个 Chart 声明两个或更多带不同alias的依赖。像标准Chart.yaml中那样为依赖指定alias即可repositories: - name: stable url: https://charts.helm.sh/stable releases: - name: foo chart: ./path/to/foo dependencies: - chart: stable/envoy version: 1.5 alias: bar - chart: stable/envoy version: 1.5 alias: baz这会令临时 Chart 的Chart.yaml变成dependencies: - alias: bar name: envoy repo: https://charts.helm.sh/stable condition: bar.enabled - alias: baz name: envoy repo: https://charts.helm.sh/stable condition: baz.enabled该特性有更多背景可参考 issue #649。在支持对本地 Chart 添加 Adhoc 依赖#1765之后你甚至可以在chart中写相对helmfile.yaml的本地文件路径releases: - name: foo chart: ./path/to/foo dependencies: - chart: ./path/to/bar内部实现上Helmfile 会从本地 Chart./path/to/foo创建另一个临时 Chart并将 Chart 的Chart.yamldependencies 修改为dependencies: - alias: bar name: bar repo: file:///abs/path/to/bar condition: bar.enabled更多细节可参考 issue #1762 的讨论。源码层面依赖别名默认按namespace-releaseName生成chartDependenciesAlias见 pkg/state/chart_dependency.go并且相对file://依赖会被重写为绝对路径rewriteChartDependencies见 pkg/state/state.go。5.1 OCI Chart 依赖从 Helmfile v0.146.0 起可以将 OCI Chart 加入 Chart 依赖。下面的helmfile.yaml为 releasefoo添加了一个 OCI Chart 依赖releases: - name: foo chart: ./path/to/foo dependencies: - chart: oci://my-oci-registry/helm-repo/envoy version: 1.5仓库中相关实现与解析逻辑可参见 pkg/state/chart_dependency.goOCI Chart 依赖名取路径最后一段、仓库 URL 构造等并由 pkg/state/oci_chart_lock_test.go、pkg/state/oci_chart_version_test.go、pkg/state/oci_parse_test.go 与 pkg/state/chart_dependencies_rewrite_test.go 等测试覆盖。六、按环境拆分 Lockfile某些场景下CI/CD 流水线希望在使用同一组 Chart 的同时对不同环境如 staging 与 production渐进式发布更新。这可以通过将lockFilePath与环境结合实现environments: staging: production --- lockFilePath: .helmfile.{{ .Environment.Name}}.lock releases: - name: myapp chart: charts/myapp上面示例中lockFilePath使用了 Go 模板语法{{ .Environment.Name }}因此 staging 环境会使用.helmfile.staging.lockproduction 环境则使用.helmfile.production.lock互不干扰。lockFilePath字段在源码中对应HelmState.LockFileyaml:lockFilePath,omitempty见 pkg/state/state.go模板渲染由状态加载流程统一完成。结语本文覆盖的六类高级特性让 Helmfile 从声明式发布 Chart的工具进一步演化为统一声明式发布平台Kubedog 跟踪提供了超越--wait的部署可见性日志流、资源过滤、三种跟踪模式与 v4 legacy 兼容vals 集成打通了外部密钥/配置后端Kustomize 支持让 kustomization 与 Chart 在同一体系中部署并能对 Chart 做安装前的 Adhoc 改造依赖注入免去 fork Chart 的维护负担含本地与 OCI 依赖按环境拆分 Lockfile 则为渐进式发布提供了基础设施。相关源码与集成用例可继续在 pkg/kubedog、pkg/state/helmx.go、pkg/state/chart_dependency.go 与 test/advanced/helmfile.yaml 中深入研读。赞分享云原生运维工具【免费下载链接】helmfileDeclaratively deploy your Kubernetes manifests, Kustomize configs, and Charts as Helm releases. Generate all-in-one manifests for use with ArgoCD.项目地址https://gitcode.com/gh_mirrors/hel/helmfile点击查看免费下载相关推荐Helmfile高级特性解析Kustomize集成与图表定制Helmfile高级特性解析Kustomize集成与图表定制 Helmfile作为强大的Kubernetes应用部署工具提供了许多高级特性来简化复杂的部署场Essentia.js项目架构解析从C到WebAssembly的音频处理转换指南Essentia.js项目架构解析从C到WebAssembly的音频处理转换指南 音乐和音频分析 在现代Web应用中变得越来越重要而Essenti音频处理机器学习Cordova PushPlugin API详解从注册到接收通知的完整流程Cordova PushPlugin API详解从注册到接收通知的完整流程 Cordova PushPlugin是一款强大的跨平台推送通知插件支持Andro上一篇PR 12345 - Public Changes Analysis下一篇Voyager 对话导出完整指南将 Gemini 会话一键导出为 Markdown、PDF 与 JSON创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考