使用 HelmRelease 部署 Helm Chart
从 Helm 仓库和 OCI 镜像仓库安装并升级 Helm chart,并带有自动回滚。
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 版本的升级,随后执行协调。
热门指南
-
推送与拉取:Flux 如何向 Kubernetes 交付 为什么基于拉取、由 Git 驱动的交付会改变你部署、保障安全和恢复集群的方式。 -
使用 GitRepository 与 Kustomization 部署你的第一个应用 通过 Kustomization 资源将 Flux 指向 Git 中的清单,并观察同步。 -
控制同步行为:间隔、Prune、漂移修正与回滚 决定 Flux 何时应用变更、删除什么、如何暂停它,以及如何撤销一次有问题的部署。 -
使用 Flux 镜像自动化实现镜像更新自动化 让 Flux 检测新的容器镜像标签,并将其提交回 Git。 -
使用 Flux 配置多集群 从一个仓库管理多个集群,包含共享基础设施和每个集群各自的差异。 -
Flux CD 与 Argo CD:如何选择 GitOps 工具 比较架构、UI、Helm、密钥、租户和镜像自动化,以选出合适的工具。