前言
上一篇跑通了 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 # 先等基础设施同步
六、本篇要点回顾
- Flux CRD 分四类:Source(源)、Sync(同步)、Notification(通知)、Image(镜像)
- GitRepository 是最常用的 Source,定义 Git 仓库地址和检查间隔
- Kustomization 引用 Source,定义路径和同步策略(prune/wait/healthChecks)
- HelmRelease 有安装/升级/回滚策略,比 Kustomization 功能更丰富
dependsOn实现同步顺序控制(基础设施先于应用)- Source 和 Sync 解耦:一个 Source 可以被多个 Sync 引用
下一篇预告:《多集群与多租户:Tenant 模型与权限隔离》------学习 Flux 如何实现多团队权限隔离。