argo rollout使用

一、前言

      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

滚动更新

在gitops仓库创建存放服务yaml的目录

在目录中创建部署服务的yaml文件

rollout.yaml

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: argo
  labels:
    app: argo
spec:
  replicas: 5
  selector:
    matchLabels:
      app: argo
  template:
    metadata:
      labels:
        app: argo
    spec:
      containers:
      - name: argo
        image: argoproj/rollouts-demo:green
        imagePullPolicy: IfNotPresent
        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 2
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 2
          failureThreshold: 2 
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP
  strategy:
    canary:      #开启金丝雀发布
      maxSurge: "20%"    #定义最大更新pod数量为20%
      maxUnavailable: 0     #定义最大不可用pod数量为0
      steps:
       - setWeight: 20
       - pause:         #如果pod探针的健康检测没过,即使手动执行继续更新pod也不会继续更新
           duration: 1h
       - setWeight: 40
       - pause: {}
       - setWeight: 60
       - pause: {}
       - setWeight: 80
       - pause: {}

 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

定义完成后,在argocd创建对应的应用,先执行同步在k8s创建出服务,在更改应用为自动同步模式

 这里在gitops直接更改rollout的镜像,模拟版本更新,触发argocd的自动化发布

 等待三分钟argocd触发自动同步后可以看到开始了滚动更新发布,会发现更新了一个新版本的pod删除掉了一个老版本的pod

也可以通过argo命令行查看发布进程

kubectl argo rollouts get rollout argo --watch   #加上watch是实时观测,去掉watch是显示出当时的

执行命令让滚动更新继续执行,也可以执行命令回滚到stable版本

#继续滚动更新
 kubectl argo rollouts promote argo
#取消滚动更新,回滚到stable版本
kubectl argo rollouts abort argo

 再次查看,可以看到新版本的pod更新的同时,旧版本的pod也在删除,一直循环往复直到新版本pod删除完成,后面的就不演示了

展示一下取消更新回滚的过程

kubectl argo rollouts abort argo

 可以看到执行回滚命令后,删除新版本的pod,重新创建旧版本的pod

并且不用再通过手动开始滚动的步骤直接自动回滚到所有pod为老版本

至此滚动更新介绍完成 

自动化金丝雀发布

跟滚动更新一样在目录中创建部署服务的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查看

至此自动化蓝绿发布介绍完成

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值