安装 FluxCD

1
2
3
4
5
6
7
8
# 集群内安装 FluxCD
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/lyzhang1999/resource/main/fluxcd/fluxcd.yaml

# 安装 FluxCD 的工作负载比较多,你也使用 kubectl wait 来等待安装完成
kubectl wait --for=condition=available --timeout=300s --all deployments -n flux-systemdeployment.apps/helm-controller condition metdeployment.apps/image-automation-controller condition metdeployment.apps/image-reflector-controller condition metdeployment.apps/kustomize-controller condition metdeployment.apps/notification-controller condition metdeployment.apps/source-controller condition met

# 本地创建 fluxcd-demo 目录
mkdir fluxcd-demo && cd fluxcd-demo

在 fluxcd-demo 目录下创建 deployment.yaml 文件,并将下面的内容保存到这个文件里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hello-world-flask
name: hello-world-flask
spec:
replicas: 2
selector:
matchLabels:
app: hello-world-flask
template:
metadata:
labels:
app: hello-world-flask
spec:
containers:
- image: lyzhang1999/hello-world-flask:latest
name: hello-world-flask

将此 yaml 推入 github/gitlab 仓库中

配置FluxCD与仓库连接信息

编辑 fluxcd-repo.yaml ,此内容为创建仓库连接信息

1
2
3
4
5
6
7
8
9
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
name: hello-world-flask
spec:
interval: 5s
ref:
branch: main
url: https://github.com/lyzhang1999/fluxcd-demo

使用 kubectl apply 将其 GitRepository 对象部署到集群内

1
2
3
4
5
kubectl apply -f fluxcd-repo.yaml
gitrepository.source.toolkit.fluxcd.io/hello-world-flask created

# 验证
kubectl get gitrepository

创建部署策略

编辑 fluxcd-kustomize.yaml ,为 FluxCD 创建部署策略

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
name: hello-world-flask
spec:
interval: 5s
path: ./
prune: true
sourceRef:
kind: GitRepository
name: hello-world-flask
targetNamespace: default

将 kustomization 对象部署到集群内:

1
2
3
4
kubectl apply -f  fluxcd-kustomize.yaml 

# 验证
kubectl get kustomization

自动发布

修改 fluxcd-demo 仓库的 deployment.yaml 文件

1
2
3
4
5
6
7
8
9
10
 - image: lyzhang1999/hello-world-flask:v1 # 修改此处  

# 将修改推送到远端仓库
git add -A && git commit -m "Update image tag to v1"
git push origin main

# 可以使用 kubectl describe kustomization hello-world-flask 查看触发重新部署的事件
kubectl describe kustomization hello-world-flask

# 通过上面的配置,让 FluxCD 自动完成了监听修改、比较和重新部署

发布回滚

GitOps 工作流中,Git 仓库是描述期望状态的唯一可信源,那么只要对 Git 仓库执行回滚,就可以实现发布回滚

1
2
3
4
5
6
7
8
9
10
# 回滚 fluxcd-demo 仓库,可以使用 git log 来查看它
git log

# 可以看到,上一次的 commit id 为 75f39dc58101b2406d4aaacf276e4d7b2d429fc9,接下来使用 git reset 来回滚到上一次提交,并强制推送到 Git 仓库
git reset --hard 75f39dc58101b2406d4aaacf276e4d7b2d429fc9

# 使用 kubectl describe kustomization hello-world-flask 查看触发重新部署的事件
kubectl describe kustomization hello-world-flask

# 从返回结果的 Last Applied Revision 可以看出,FluxCD 已经检查到了变更,并已经进行了同步。