Flux CD K8s 持续部署

FreeGuideOnline 最新 2026-07-10

bash brew install fluxcd/tap/flux


Linux:
```bash
curl -s https://fluxcd.io/install.sh | sudo bash

Windows 请使用包管理器或从 GitHub Releases 下载。

验证安装:

flux --version

第一步:将 Flux 安装到集群

执行 flux bootstrap 命令,它会一次性完成集群控制器的部署和初始仓库的创建。

GitHub 示例

flux bootstrap github \
  --owner=你的GitHub用户名 \
  --repository=my-flux-config \
  --branch=main \
  --path=clusters/my-cluster \
  --personal
  • --owner--repository 用于指定存放集群期望状态的 Git 仓库(仓库会被自动创建)
  • --path 定义了集群配置在仓库中的路径
  • --personal 使用个人访问令牌(会引导你完成身份验证)

等待命令执行完毕,输出类似:

✔ install completed
✔ all components are healthy

此时 Flux 控制器已经运行在你的集群中,并且能够自动同步 my-flux-config 仓库内 clusters/my-cluster 目录下的所有资源。


第二步:理解核心组件

安装完成后,集群中会运行几个关键控制器:

  • source-controller:负责从 Git、Helm 仓库、OCI 制品获取资源
  • kustomize-controller:对 Kustomize 覆盖进行重建并应用到集群
  • helm-controller:管理 Helm 发行版的安装、升级和回滚
  • notification-controller:处理事件通知(Slack、Teams 等)
  • image-automation-controller:负责镜像策略和自动更新

每个控制器都通过 CRD(自定义资源)来声明式配置,你的任务就是将这些 CRD 定义写入 Git 仓库。


第三步:构建你的 GitOps 仓库

一个典型的 Flux 仓库结构如下:

my-flux-config/
├── clusters/
│   └── my-cluster/
│       ├── flux-system/
│       │   ├── gotk-components.yaml   # Flux 自身组件(自动生成)
│       │   ├── gotk-sync.yaml         # 同步配置
│       │   └── kustomization.yaml     # 引导 Kustomization
│       └── apps/                      # 你的应用
│           ├── blog-app/
│           │   ├── deploy.yaml
│           │   └── kustomization.yaml
│           └── monitoring/
│               ├── helmrelease.yaml
│               └── kustomization.yaml

路径 clusters/my-cluster 下的资源会被主 Kustomization 自动递归部署。


第四步:部署第一个应用

我们以一个简单的 Nginx 部署为例,展示如何通过 Flux 持续部署。

4.1 创建应用目录和清单

在仓库的 clusters/my-cluster/apps/nginx-demo/ 下创建以下文件:

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

kustomization.yaml

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: nginx-demo
  namespace: flux-system
spec:
  interval: 5m0s
  path: ./clusters/my-cluster/apps/nginx-demo
  prune: true
  sourceRef:
    kind: GitRepository
    name: flux-system
  targetNamespace: default

说明Kustomization 告诉 Flux 去指定路径拉取 Kubernetes 清单并将其应用到集群。prune: true 表示当 Git 中的资源被删除时,集群中也会自动清理。

4.2 推送到 Git

git add .
git commit -m "Add nginx demo app"
git push origin main

4.3 观察同步

几秒钟后,用以下命令检查同步状态:

flux get kustomizations

输出应显示 nginx-demo 状态为 Ready,表明已成功同步。

验证 Pod:

kubectl get pods -n default | grep nginx-demo

如果你修改了 Git 中的副本数并推送,Flux 会自动调整集群中的 Pod 数量,无需人工介入。


第五步:使用 Helm Release 部署复杂应用

Flux 原生支持 Helm,可以让你像管理普通清单一样管理 Helm Chart。

示例:部署 Prometheus 社区版

在仓库中创建 clusters/my-cluster/apps/prometheus/ 目录,并写入以下文件:

helmrepository.yaml

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: prometheus-community
  namespace: flux-system
spec:
  interval: 10m
  url: https://prometheus-community.github.io/helm-charts

helmrelease.yaml

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: prometheus
  namespace: monitoring
spec:
  interval: 5m
  chart:
    spec:
      chart: kube-prometheus-stack
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
        namespace: flux-system
      version: "48.1.0"
  values:
    grafana:
      adminPassword: admin

kustomization.yaml

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: prometheus-stack
  namespace: flux-system
spec:
  interval: 5m
  path: ./clusters/my-cluster/apps/prometheus
  prune: true
  sourceRef:
    kind: GitRepository
    name: flux-system

推送到 Git 后,Flux 自动创建 monitoring 命名空间并安装整个监控栈。你可以随时通过修改 values 字段来调整配置,所有变更都会自动应用。


第六步:镜像自动更新(可选)

Flux 的 Image Automation 组件可以监听容器镜像仓库的新版本,并自动更新 Git 中的镜像标签。

工作原理

  1. 定义 ImageRepository:告诉 Flux 要扫描哪个镜像仓库
  2. 定义 ImagePolicy:指定版本筛选规则(如只选 semver 范围)
  3. 在 Deployment 上添加 marker 注释:Flux 会根据策略更新清单中的镜像字段,并提交回 Git

简单示例

ImageRepository

apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
  name: my-app
  namespace: flux-system
spec:
  image: myregistry/my-app
  interval: 1m

ImagePolicy

apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
  name: my-app-policy
  namespace: flux-system
spec:
  imageRepositoryRef:
    name: my-app
  policy:
    semver:
      range: ">=1.0.0 <2.0.0"

在 Deployment 的 spec 中添加注释:

metadata:
  annotations:
    fluxcd.io/automated: "true"
    fluxcd.io/tag.my-app: regex:^1\.\d+\.\d+$

配置完毕后,当镜像仓库出现符合条件的标签时,Flux 会自动更新 Deployment 并创建一个 Git 提交,集群随之更新。


日常操作与监控

查看所有 Flux 资源状态

flux get all

强制立即同步某个源

flux reconcile source git flux-system

查看同步日志

flux logs --level=info

设置通知

使用 Provider + Alert 将同步失败、健康检查等信息发送到 Slack、Discord 或 Webhook。

示例 Slack Provider:

apiVersion: notification.toolkit.fluxcd.io/v1
kind: Provider
metadata:
  name: slack
  namespace: flux-system
spec:
  type: slack
  channel: flux-alerts
  secretRef:
    name: slack-url
---
apiVersion: notification.toolkit.fluxcd.io/v1
kind: Alert
metadata:
  name: on-call
  namespace: flux-system
spec:
  providerRef:
    name: slack
  eventSeverity: info
  eventSources:
    - kind: Kustomization
      name: '*'