一、前言
argorollout是比argocd更高级的发布工具,其中包含自动化金丝雀发布、自动化蓝绿发布、还可以通过argo命令或者dashboard查看发布的过程
二、使用
需要先部署argo rollout服务
参考:https://github.com/argoproj/argo-rollouts/tree/master/manifests
创建argo rollout目录
mkdir /opt/argocd-rollout && cd /opt/argocd-rollout
下载yaml文件部署
wget https://github.com/argoproj/argo-rollouts/blob/master/manifests/install.yaml
创建命名空间
kubectl create namespace argo-rollouts
部署argo rollout服务
kubectl apply -f install.yaml -n argo-rollouts
查看是否部署完成
kubectl get all -n argo-rollouts
安装命令行工具
wget https://github.com/argoproj/argo-rollouts/releases/download/v1.6.6/kubectl-argo-rollouts-linux-amd64
cp kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
chmod +x /usr/local/bin/kubectl-argo-rollouts
部署dashboard
wget https://github.com/argoproj/argo-rollouts/blob/master/manifests/dashboard-install.yaml
更改部署文件的svc配置,改为nodeport模式
vi dashboard-install.yaml
执行部署
kubectl create -f dashboard-install.yaml -n argo-rollouts
启动dashboard
kubectl argo rollouts dashboard
自动化金丝雀发布
在目录中创建部署服务的yaml文件
rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout #使用rollout类型,实际就是比deployment更高级的控制器
metadata:
name: argo
labels:
app: argo
spec:
replicas: 3 #定义副本数
selector:
matchLabels:
app: argo
template:
metadata:
labels:
app: argo
spec:
containers:
- name: argo
image: argoproj/rollouts-demo:green #使用argo rollouts的demo可以更直观的看到金丝雀发布过程
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
protocol: TCP
strategy: #定义升级策略
canary: #使用金丝雀发布
canaryService: argo-canary #金丝雀环境的svc服务名称
stableService: argo #生产环境的svc服务名称
canaryMetadata: #应用于金丝雀环境pod的标签
labels:
deployment: canary
stableMetadata: #应用于生产环境pod的标签
labels:
deployment: stable
trafficRouting: #定义ingress
nginx: #使用nginx控制器
stableIngress: argo #定义生产环境ingress的名称
additionalIngressAnnotations: #定义ingress的参数
canary-by-header: X-Canary #定义使用该请求头的请求走金丝雀环境
steps: #升级流程
- setWeight: 20 #更新百分之20,会根据pod的数量更新20%的pod,也会设置金丝雀环境的ingress流量权重为20%
- pause: {} #暂停更新,需要手动执行恢复才会继续执行
- setWeight: 50 #设置金丝雀环境的流量权重为50%
- pause:
duration: 30s #暂停30秒
- setWeight: 70
- pause:
duration: 30s
service.yaml
apiVersion: v1 #这里创建两个svc来切分生产环境和金丝雀环境的流量
kind: Service
metadata:
name: argo
labels:
app: argo
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: argo
---
apiVersion: v1
kind: Service
metadata:
name: argo-canary
labels:
app: argo
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: argo
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress #创建生产环境的ingress
metadata:
name: argo
labels:
app: argo
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: argo.apex.com #定义域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argo #匹配生产环境的svc
port:
name: http
定义完成后,在argocd创建对应的应用,先执行同步在k8s创建出服务,在更改应用为自动同步模式
访问一下部署的argo服务,会看到现在所有访问都是绿的
这里在gitops直接更改rollout的镜像,模拟版本更新,触发argocd的自动化发布
等待三分钟argocd触发自动同步后可以看到开始了金丝雀发布
查看部署的argo服务 会发现有一部分金丝雀环境的流量即蓝色的
也可以使用curl命令访问去验证,会有一部分流量调度到金丝雀环境
查看一下发布的情况,可以用命令行,也可以用dashboard
kubectl argo rollouts get rollout argo --watch #后面的argo是部署的服务名称
与此同时可以来查看一下ingress、svc的情况
可以看到金丝雀环境的svc 标签选择器绑定了一个新的标签,并且新版本的pod也是绑定在了金丝雀环境的svc上
可以看到新建了一个金丝雀环境的ingress,并且通过金丝雀环境的svc发现了新版本的pod
还可以通过rollout更直观的了解金丝雀发布的流程
kubectl describe rollout argo
先是新建了rs并将pod数量设置为1,然后创建金丝雀环境的ingress设置流量权重,再将金丝雀环境的svc标签选择器更改
了解到这里就在继续执行更新,也可以执行取消更新
继续更新
kubectl argo rollouts promote argo
取消更新,执行取消后会回滚到stable版本
kubectl argo rollouts abort argo
可以通过dashboard看发布的情况
查看argo服务也会发现全部是蓝的流量
全部发布完成后再查看svc和ingress会发现,金丝雀环境、生产环境的svc和ingress都是指向的新版本的pod,但金丝雀环境的ingress流量权重为0
补充一下金丝雀发布是金丝雀环境的所有pod启动后,再去删除生产环境的所有pod
至此金丝雀发布完成
自动化蓝绿发布
跟金丝雀发布一样使用gitops仓库存放yaml文件
rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: argo
labels:
app: argo
spec:
replicas: 3
selector:
matchLabels:
app: argo
template:
metadata:
labels:
app: argo
spec:
containers:
- name: argo
image: argoproj/rollouts-demo:blue
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
protocol: TCP
strategy: #发布策略
blueGreen: #开启蓝绿发布
autoPromotionEnabled: true
activeService: argo #定义svc服务名称
service.yaml
apiVersion: v1
kind: Service
metadata:
name: argo
labels:
app: argo
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: argo
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argo
labels:
app: argo
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: argo.apex.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argo
port:
name: http
在argocd中创建该服务的应用并进行第一次同步在k8s集群中创建服务再设置该应用为自动同步
在gitops仓库中更改rollout文件的镜像配置模拟版本发布
等待argocd自动同步,会发现两个版本的pod共存
查看argo服务会发现全部都是绿的流量
可以通过svc查看,也是通过更改svc的标签选择器,去选择新版本的pod,来达到流量切换到新版本pod的效果
也可以通过rollout查看
至此自动化蓝绿发布介绍完成