Flux CD Flux CD

使用 HelmRelease 部署 Helm Chart

从 Helm 仓库和 OCI 镜像仓库安装并升级 Helm chart,并带有自动回滚。

12 min 中级

Flux 通过它自己的 helm-controller 部署 Helm chart。你声明一个存放 chart 的 source,以及一个说明用哪个 chart、哪个版本、哪些 values 的 HelmRelease。控制器随后按计划为你执行 Helm 的安装和升级,整个 release 生命周期都以声明的方式处理。本指南以公开的 podinfo chart 为例。

声明 chart 的 source

HelmRepository 告诉 source-controller chart 存放在哪里。apps/podinfo/helmrepository.yaml:

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: podinfo
  namespace: podinfo
spec:
  interval: 1h
  url: https://stefanprodan.github.io/podinfo

它本身只列出可用的 chart,此时还没有安装任何东西。这个 source 可以放在应用的命名空间中,也可以放在 flux-system 中,两者都可以。

声明 release

apps/podinfo/helmrelease.yaml:

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: podinfo
  namespace: podinfo
spec:
  interval: 10m
  chart:
    spec:
      chart: podinfo
      version: "6.x"
      sourceRef:
        kind: HelmRepository
        name: podinfo
      interval: 1h
  install:
    remediation:
      retries: 3
  upgrade:
    remediation:
      retries: 3
  values:
    replicaCount: 2
    ui:
      color: "#34577c"

关键部分说明:

  • chart.spec 指明 chart、版本或 semver 范围(6.x 会跟随新的次版本和补丁版本),以及它来自哪个 source。
  • interval 是 Flux 多久检查一次 release 的变更和漂移。
  • values 相当于内联书写的 values.yaml。对于较大的配置,请通过 valuesFrom 从 ConfigMap 或 Secret 加载 values。
  • remediation 控制安装或升级失败时会发生什么。在允许的重试次数用完之后,升级失败默认会触发回滚到最后一个良好的 release。

在同一文件夹中为 podinfo 添加一个普通的 namespace.yaml,然后像第一个应用指南中那样,用 Flux Kustomization 注册这个文件夹:

flux create kustomization podinfo \
  --source=GitRepository/flux-system \
  --path=./apps/podinfo --prune=true --interval=10m \
  --export > clusters/dev/podinfo.yaml

提交并推送。一旦 podinfo Kustomization 完成协调,检查该 release:

flux get helmreleases -A
kubectl get all -n podinfo

你会看到该 release、已安装的 chart 版本,以及 Helm 创建的 Pod。该 Helm release 对普通的 Helm CLI 也是可见的(helm list -n podinfo),但请把 Git 视为你修改它的地方。

按环境配置 values

在共享的默认值之上叠加特定于环境的配置,方法是保留一个基础 release 并用 Kustomize 为每个环境打补丁,或者使用 valuesFrom:

spec:
  valuesFrom:
    - kind: ConfigMap
      name: podinfo-values
      valuesKey: values.yaml

valuesFrom 中的 values 先被合并,内联的 values 会覆盖它们。当被引用的 ConfigMap 或 Secret 变化时,helm-controller 会察觉并升级 release,这与被 Deployment 读取的普通 ConfigMap 不同。对于烘焙在 chart 自身 ConfigMap 中的配置,请在 chart 的 Pod 模板中添加 checksum 注解,使配置变化时 Pod 重启:

  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

来自 OCI 镜像仓库的 chart

Helm chart 越来越多地存放在 OCI 镜像仓库中。使用类型为 oci 的 HelmRepository:

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: podinfo-oci
  namespace: podinfo
spec:
  type: oci
  interval: 1h
  url: oci://ghcr.io/stefanprodan/charts

HelmRelease 保持不变,只是它的 sourceRef 指向 podinfo-oci。对于私有镜像仓库,添加带镜像仓库凭据的 secretRef。你也可以通过 OCIRepository source 引用 chart,这样多个 release 可以共享同一个 chart 版本,并在制品摘要变化时协调。

漂移检测与升级

开箱即用时,helm-controller 会在 release 的 spec 或 chart 变化时重新应用它。若还要检测并修正对 release 所创建资源的手动编辑,请启用漂移检测:

spec:
  driftDetection:
    mode: enabled

没有它,对 chart 管理的 Deployment 做手动的 kubectl edit,可能会一直保留到下一次升级。将它与 interval 配合使用,使 Flux 定期将现实与 release 进行比较。

回滚与排查

flux get helmreleases -A
kubectl describe helmrelease podinfo -n podinfo
flux reconcile helmrelease podinfo -n podinfo

describe 显示失败的 Helm 操作及其错误。如果升级失败,控制器会根据你的 remediation 设置自动回滚,HelmRelease 会报告失败,这样你就可以修复 Git。持久的修复始终是一次提交,例如回退一次 chart 版本的升级,随后执行协调。

热门指南