一、前言
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: argolabels:app: argo
spec:replicas: 3 #定义副本数selector:matchLabels:app: argotemplate:metadata:labels:app: argospec:containers:- name: argoimage: argoproj/rollouts-demo:green #使用argo rollouts的demo可以更直观的看到金丝雀发布过程imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 8080protocol: TCPstrategy: #定义升级策略canary: #使用金丝雀发布canaryService: argo-canary #金丝雀环境的svc服务名称stableService: argo #生产环境的svc服务名称canaryMetadata: #应用于金丝雀环境pod的标签labels:deployment: canarystableMetadata: #应用于生产环境pod的标签labels:deployment: stabletrafficRouting: #定义ingressnginx: #使用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: argolabels: app: argo
spec:ports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app: argo
---
apiVersion: v1
kind: Service
metadata:name: argo-canarylabels: app: argo
spec:ports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app: argo
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress #创建生产环境的ingress
metadata: name: argolabels:app: argoannotations:kubernetes.io/ingress.class: nginx
spec:rules:- host: argo.apex.com #定义域名http:paths:- path: /pathType: Prefixbackend:service:name: argo #匹配生产环境的svcport: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: argolabels:app: argo
spec:replicas: 3selector:matchLabels:app: argotemplate:metadata:labels:app: argospec:containers:- name: argoimage: argoproj/rollouts-demo:blueimagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 8080protocol: TCPstrategy: #发布策略blueGreen: #开启蓝绿发布autoPromotionEnabled: trueactiveService: argo #定义svc服务名称
service.yaml
apiVersion: v1
kind: Service
metadata:name: argolabels: app: argo
spec:ports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app: argo
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: argolabels:app: argoannotations:kubernetes.io/ingress.class: nginx
spec:rules:- host: argo.apex.comhttp:paths:- path: /pathType: Prefixbackend:service:name: argoport:name: http
在argocd中创建该服务的应用并进行第一次同步在k8s集群中创建服务再设置该应用为自动同步
在gitops仓库中更改rollout文件的镜像配置模拟版本发布
等待argocd自动同步,会发现两个版本的pod共存
查看argo服务会发现全部都是绿的流量
可以通过svc查看,也是通过更改svc的标签选择器,去选择新版本的pod,来达到流量切换到新版本pod的效果
也可以通过rollout查看
至此自动化蓝绿发布介绍完成