【GitOps·Flux篇】核心概念:Source、Kustomization与HelmRelease

前言

上一篇跑通了 Flux 基础部署,本篇深入 Flux 的三大核心 CRD------Source(源)、Kustomization(清单同步)和 HelmRelease(Helm 发布),理解它们的协作关系和配置细节。


一、Flux CRD 全景

复制代码
Flux 的资源分为两类:

源(Source)--- 从哪里获取配置:
  GitRepository    → Git 仓库
  HelmRepository   → Helm Chart 仓库
  HelmChart        → 单个 Helm Chart
  OCIRepository    → OCI 格式的制品仓库
  Bucket           → S3/MinIO Bucket

同步(Sync)--- 如何部署:
  Kustomization     → Kustomize 同步
  HelmRelease       → Helm 发布

通知(Notification)--- 如何告警:
  Provider          → 通知提供者(Slack/钉钉/企微)
  Alert             → 告警规则
  Receiver          → Webhook 接收器

镜像(Image)--- 自动镜像更新:
  ImageRepository   → 镜像仓库扫描
  ImagePolicy       → 镜像版本策略
  ImageUpdateAutomation → 自动更新 Git 中的镜像版本

协作关系

复制代码
GitRepository (源)  →  Kustomization (同步)
                      →  HelmRelease (Helm 同步)
                      →  ImageUpdateAutomation (镜像自动更新)

HelmRepository (源) →  HelmChart (源) → HelmRelease (同步)

二、Source 详解

GitRepository

yaml 复制代码
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: myapp-deploy
  namespace: flux-system
spec:
  url: https://github.com/myorg/myapp-deploy.git

  # 跟踪哪个引用
  ref:
    branch: main
    # 或 Tag
    # tag: v1.0.0
    # 或 SemVer
    # semver: ">=1.0.0"
    # 或 commit
    # commit: abc123

  # 检查间隔
  interval: 30s

  # 认证
  secretRef:
    name: myapp-deploy-creds

  # Git 操作超时
  timeout: 60s

  # 忽略文件
  ignore: |
    /docs
    /examples
    /*.md

  # 代理配置(如果有 Git 代理)
  # proxySecretRef:
  #   name: proxy-secret

OCIRepository(OCI 制品仓库)

yaml 复制代码
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: OCIRepository
metadata:
  name: myapp-oci
  namespace: flux-system
spec:
  url: oci://registry.mycompany.com/deploy
  ref:
    semver: ">=1.0.0"           # 跟踪最新版本
  interval: 1m
  secretRef:
    name: registry-creds

HelmRepository

yaml 复制代码
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: bitnami
  namespace: flux-system
spec:
  url: https://charts.bitnami.com/bitnami
  interval: 5m                   # 每5分钟检查 Chart 仓库更新
  type: oci                       # OCI 类型 Chart 仓库
  # secretRef:
  #   name: helm-registry-creds

HelmChart

yaml 复制代码
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmChart
metadata:
  name: redis
  namespace: flux-system
spec:
  sourceRef:
    kind: HelmRepository
    name: bitnami
    namespace: flux-system
  chart: redis
  version: "18.x.x"               # Chart 版本
  interval: 1m
  valuesFiles:
    - values.yaml                # 自定义 values 文件

三、Kustomization 详解

完整配置

yaml 复制代码
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: myapp
  namespace: flux-system
spec:
  # 源引用
  sourceRef:
    kind: GitRepository
    name: myapp-deploy
    namespace: flux-system

  # 路径
  path: ./overlays/prod

  # 同步间隔
  interval: 1m

  # 重试策略
  retryInterval: 30s
  retry: 5

  # 超时
  timeout: 5m

  # 清理
  prune: true                     # 删除 Git 中不存在的资源

  # 等待健康检查
  wait: true

  # 健康检查
  healthChecks:
    - apiVersion: apps/v1
      kind: Deployment
      name: myapp
      namespace: myapp-prod
    - apiVersion: v1
      kind: Service
      name: myapp
      namespace: myapp-prod

  # 依赖(先同步其他 Kustomization)
  dependsOn:
    - name: infrastructure-redis
    - name: infrastructure-ingress

  # 仅同步特定资源
  target:
    labelSelector:
      matchLabels:
        app.kubernetes.io/part-of: myapp

  # 延迟同步(如等基础设施就绪)
  # suspend: true

  # 补丁(在 Kustomize 渲染后应用)
  patches:
    - target:
        kind: Deployment
        patch: |
          - op: replace
            path: /spec/replicas
            value: 4

  # 资源过滤
  components:
    - ../../components/monitoring

dependsOn 的用途

复制代码
场景: 应用依赖 Redis 和 PostgreSQL

如果同时同步,应用 Pod 可能先于 Redis 就绪 → 启动失败

配置:
  Kustomization: infrastructure-redis → 先同步
  Kustomization: infrastructure-postgres → 先同步
  Kustomization: myapp → dependsOn: [infrastructure-redis, infrastructure-postgres]

结果:
  1. Flux 先同步 Redis → 等待 Redis Pod Ready
  2. Flux 同步 PostgreSQL → 等待 PostgreSQL Pod Ready
  3. 最后同步 myapp → 此时 Redis 和 PostgreSQL 已可用

四、HelmRelease 详解

基本配置

yaml 复制代码
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: redis
  namespace: redis
spec:
  # Chart 引用
  chart:
    spec:
      chart: redis
      version: "18.x.x"
      sourceRef:
        kind: HelmRepository
        name: bitnami
        namespace: flux-system

  # 同步间隔
  interval: 1m

  # 超时
  timeout: 10m

  # 安装策略
  install:
    remediation:
      retries: 3                 # 安装失败重试3次

  # 升级策略
  upgrade:
    remediation:
      retries: 3
      strategy: rollback         # 升级失败回滚到上一版本

  # 回滚策略
  rollback:
    cleanupOnFail: true          # 回滚失败时清理资源

  # values 配置
  values:
    architecture: replication
    master:
      persistence:
        size: 8Gi
    replica:
      replicaCount: 2
    auth:
      password: "your-password"

  # 从外部文件读取 values
  valuesFrom:
    - kind: ConfigMap
      name: redis-values
      valuesKey: values.yaml
    - kind: Secret
      name: redis-secret-values
      valuesKey: values.yaml
      optional: true

  # 健康检查
  test:
    enable: true                 # 运行 Helm Test

  # 依赖
  dependsOn:
    - name: infrastructure-storage

HelmRelease 与 Kustomization 的关系

复制代码
Kustomization:
  → 适合 K8s 原生 YAML(Kustomize)
  → 简单直接,所见即所得

HelmRelease:
  → 适合 Helm Chart
  → 支持复杂模板逻辑
  → 有安装/升级/回滚策略
  → 有 Helm Test 集成

选择标准:
  自研应用 → Kustomization
  第三方应用 → HelmRelease
  需要复杂模板 → HelmRelease

五、Source 与 Sync 的解耦设计

为什么要解耦

复制代码
传统设计:
  一个配置同时定义"从哪来"和"怎么部署"
  → 修改同步策略需要修改源配置
  → 多个应用共用一个源时配置重复

Flux 设计:
  Source 只定义"从哪来"
  Sync 只定义"怎么部署" + 引用 Source
  → 一个 Source 可以被多个 Sync 引用
  → 修改同步策略不影响 Source

一个源多个同步

yaml 复制代码
# 一个 GitRepository
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: myapp-deploy
  namespace: flux-system
spec:
  url: https://github.com/myorg/myapp-deploy.git
  ref:
    branch: main
  interval: 30s

---
# 同步1: 基础设施
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: infrastructure
  namespace: flux-system
spec:
  sourceRef:
    kind: GitRepository
    name: myapp-deploy         # 引用同一个源
  path: ./infrastructure
  interval: 1m
  prune: true

---
# 同步2: 应用层
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: myapp
  namespace: flux-system
spec:
  sourceRef:
    kind: GitRepository
    name: myapp-deploy         # 引用同一个源
  path: ./overlays/prod
  interval: 1m
  prune: true
  dependsOn:
    - name: infrastructure     # 先等基础设施同步

六、本篇要点回顾

  1. Flux CRD 分四类:Source(源)、Sync(同步)、Notification(通知)、Image(镜像)
  2. GitRepository 是最常用的 Source,定义 Git 仓库地址和检查间隔
  3. Kustomization 引用 Source,定义路径和同步策略(prune/wait/healthChecks)
  4. HelmRelease 有安装/升级/回滚策略,比 Kustomization 功能更丰富
  5. dependsOn 实现同步顺序控制(基础设施先于应用)
  6. Source 和 Sync 解耦:一个 Source 可以被多个 Sync 引用

下一篇预告:《多集群与多租户:Tenant 模型与权限隔离》------学习 Flux 如何实现多团队权限隔离。

相关推荐
heimeiyingwang5 天前
【GitOps·ArgoCD篇】RBAC与多租户:团队权限隔离实战
argocd·gitops
heimeiyingwang5 天前
【GitOps·ArgoCD篇】健康检查与资源钩子:自定义健康状态
argocd·gitops
heimeiyingwang6 天前
【GitOps·ArgoCD篇】与 Kustomize 集成:多环境配置管理
kustomize·argocd·gitops
heimeiyingwang7 天前
【GitOps·ArgoCD篇】同步策略:自动同步、手动同步与同步钩子
argocd·gitops
heimeiyingwang11 天前
【GitOps·入门篇】工具生态:ArgoCD、Flux、Jenkins X 对比选型
jenkins·flux·argocd·gitops
BIG-HO3 个月前
AI绘画新选择:麦橘超然与主流模型对比实测
flux·图像生成·星图gpu·中文ai绘画
ん贤3 个月前
Helm入门
云原生·kubernetes·helm
云游牧者3 个月前
K8S-Helm包管理全解-从入门到Chart开发实战指南
云原生·容器·kubernetes·helm·chart模板
递归尽头是星辰3 个月前
云原生部署架构演进:基于 Helm 的 GitOps 落地选型
helm·gitops·云原生部署·ci/cd 架构·k8s 配置管理