基于Flux、Helm v3、Linkerd与Flagger实现Kubernetes渐进式交付
概述
本文将指导您在Kubernetes集群上设置GitOps风格的渐进式交付管道。
GitOps简介
GitOps是一种通过Git作为声明性基础设施和工作负载的单一可信来源进行持续交付的方法。对于Kubernetes而言,这意味着使用`git push`替代`kubectl create/apply`命令。
与传统CI/CD管道不同,GitOps要求所有生产环境变更必须先提交到源代码管理系统(通常通过拉取请求),然后才能应用于集群。这种方式确保了整个生产状态受版本控制保护,并可以在灾难发生时快速恢复。
渐进式交付
渐进式交付涵盖多种高级部署模式,如金丝雀发布、功能标记和A/B测试。它通过细粒度控制降低新版本引入的风险。
前置条件
为完成本指南,您需要一个支持负载均衡器和RBAC的Kubernetes集群(版本1.13或更高)。此外,请确保已安装以下工具:
- kubectl 1.16
- git 2.20
环境搭建
Helm v3安装
在macOS上,可以通过以下命令安装Helm v3 CLI:
brew install helm
对于Linux或Windows,可从官方发布页面下载二进制文件。
Git配置
Fork workshop仓库并克隆至本地:
export GHUSER=your_username
git clone https://github.com/${GHUSER}/gitops-helm-workshop
设置GitHub用户名和电子邮件:
cd gitops-helm-workshop
git config user.name "${GHUSER}"
git config user.email "your_email@example.com"
Flux安装
添加Flux Helm仓库:
helm repo add fluxcd https://charts.fluxcd.io
创建fluxcd命名空间:
kubectl create ns fluxcd
安装Flux:
helm upgrade -i flux fluxcd/flux --wait \
--namespace fluxcd \
--set registry.pollInterval=1m \
--set git.pollInterval=1m \
--set git.url=git@github.com:${GHUSER}/gitops-helm-workshop
安装fluxctl:
# macOS 和 Linux
curl -sL https://fluxcd.io/install | sh
export PATH=$PATH:$HOME/.fluxcd/bin
# Windows
访问 https://github.com/fluxcd/flux/releases 下载对应版本
获取Git SSH公钥:
export FLUX_FORWARD_NAMESPACE=fluxcd
fluxctl identity
将公钥添加到GitHub仓库的部署密钥中,确保选中"Allow write access"。
Helm Operator安装
在fluxcd命名空间中安装Flux Helm Operator:
helm upgrade -i helm-operator fluxcd/helm-operator --wait \
--namespace fluxcd \
--set git.ssh.secretName=flux-git-deploy \
--set git.pollInterval=1m \
--set chartsSyncInterval=1m \
--set helm.versions=v3
Linkerd安装
下载Linkerd v2 CLI:
# macOS 和 Linux
curl -sL https://run.linkerd.io/install | sh
export PATH=$PATH:$HOME/.linkerd2/bin
# Windows
访问 https://github.com/linkerd/linkerd2/releases 下载对应版本
安装Linkerd控制平面:
linkerd install | kubectl apply -f -
验证安装:
linkerd check
Flagger安装
添加Flagger Helm仓库:
helm repo add flagger https://flagger.app
安装Flagger Canary CRD:
kubectl apply -f https://raw.githubusercontent.com/weaveworks/flagger/master/artifacts/flagger/crd.yaml
在linkerd命名空间中安装Flagger:
helm upgrade -i flagger flagger/flagger --wait \
--namespace linkerd \
--set crd.create=false \
--set metricsServer=http://linkerd-prometheus:9090 \
--set meshProvider=linkerd
应用部署
NGINX Ingress控制器安装
创建启用Linkerd注入的命名空间:
apiVersion: v1
kind: Namespace
metadata:
annotations:
fluxcd.io/ignore: "false"
linkerd.io/inject: enabled
name: ingress-nginx
创建Helm release以安装NGINX Ingress控制器:
apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
name: nginx-ingress
namespace: ingress-nginx
spec:
releaseName: nginx-ingress
chart:
repository: https://kubernetes-charts.storage.googleapis.com/
name: nginx-ingress
version: 1.33.4
values:
controller:
service:
type: LoadBalancer
应用更改:
git add -A && git commit -m "install ingress" && git push origin master && fluxctl sync
Podinfo应用安装
创建启用Linkerd注入的prod命名空间:
apiVersion: v1
kind: Namespace
metadata:
annotations:
fluxcd.io/ignore: "false"
linkerd.io/inject: enabled
name: prod
创建Helm release以安装podinfo:
apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
name: podinfo
namespace: prod
spec:
releaseName: podinfo
chart:
git: git@github.com:GHUSER/gitops-helm-workshop
ref: master
path: cluster/charts/podinfo
values:
image:
repository: stefanprodan/podinfo
tag: 3.1.0
service:
enabled: true
type: ClusterIP
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
path: /
hosts:
- LB-PUBLIC-IP.nip.io
应用更改:
git add -A && git commit -m "install podinfo" && git push origin master && fluxctl sync
自动化升级
通过注解Helm release对象,可以启用Flux自动更新镜像标签:
apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
annotations:
fluxcd.io/automated: "true"
fluxcd.io/tag.chart-image: semver:~3.1
应用更改:
git add -A && git commit -m "automate podinfo" && git push origin master && fluxctl sync
金丝雀发布
编辑podinfo Helm release以禁用自动更新和服务:
apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
name: podinfo
namespace: prod
spec:
releaseName: podinfo
values:
image:
repository: stefanprodan/podinfo
tag: 3.1.0
service:
enabled: false
type: ClusterIP
创建Canary资源:
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: podinfo
namespace: prod
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: podinfo
service:
port: 9898
analysis:
interval: 10s
maxWeight: 100
stepWeight: 5
threshold: 5
metrics:
- name: request-success-rate
thresholdRange:
min: 99
interval: 1m
- name: request-duration
thresholdRange:
max: 500
interval: 1m
触发金丝雀发布:
git add -A && git commit -m "update podinfo" && git push origin master && fluxctl sync
监控与回滚
通过Linkerd仪表板实时监控服务健康状况:
linkerd dashboard --port=50750
观察流量变化:
watch kubectl -n prod get canaries
在失败情况下,Flagger会自动回滚:
kubectl -n linkerd logs deployment/flagger -f | jq .msg