Flux CD K8s 持续部署
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 中的镜像标签。
工作原理
- 定义
ImageRepository:告诉 Flux 要扫描哪个镜像仓库 - 定义
ImagePolicy:指定版本筛选规则(如只选 semver 范围) - 在 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: '*'