Kubernetes 结合 Argo rollouts实现高级发布功能

前言:Argo项目于2017年由Applatix公司创立,2018 年初被 Intuit 收购;在这之后,BlackRock为Argo项目贡献了Argo Events这一子项目,2020年4月被CNCF收入孵化器,2022年12月6号毕业,Argo的所有组件都通过专用的Kubernetes CRD实现,支持使用或集成其他CNCF项目,如gRPC、Prometheus、NATS、Helm和CloudEvents等,这次我们使用Argo生态四个项目中的Argo rollouts,ArgoCD的高级交付策略工具支持声明式渐进式交付策略,例如 canary 、blue-green等。

一、Argo Rollouts概览

1.rollouts Argo的一个子项目由一个控制器和一组CRD组成,可为Kubernetes提供高级部署功能包括:

   - blue-green

   - canary

   - canary analysis

   - experimentation

   - progressive delivery

 基本工作机制:

   1.与Deployment相似,Argo Rollouts控制器借助于ReplicaSet完成应用的创建、缩放和删除;

   2. ReplicaSet资源由Rollout的spec.template字段进行定义。

二、部署Argo Rollouts

2.1: 创建argo-rollouts名称空间

root@k8s-master01:~# kubectl create ns argo-rollouts
namespace/argo-rollouts created
root@k8s-master01:~# kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.7.2/install.yaml

  会生成一个services / argo-rollouts-metrics、一个deployments/argo-rollouts,以及一组CRD。

2.2:部署Dashboard

kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.7.2/dashboard-install.yaml

2.2.1: 安装生成的services/argo-rollouts-dashboard默认监听于TCP/3100端口

root@k8s-master01:~# kubectl get svc -n argo-rollouts
NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
argo-rollouts-dashboard   ClusterIP   10.100.61.192    <none>        3100/TCP   5m56s
argo-rollouts-metrics     ClusterIP   10.100.120.232   <none>        8090/TCP   8m38s

2.2.2: 编写ingress-nginx规则实现在外部访问

vim ingress-argo-rollouts.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argo-rollouts
  namespace: argo-rollouts
spec:
  ingressClassName: nginx
  rules:
  - host: rollouts.linux.com
    http:
      paths:
      - backend:
          service:
            name: argo-rollouts-dashboard
            port:
              number: 3100
        path: /
        pathType: Prefix
  - host: rollout.linux.com
    http:
      paths:
      - backend:
          service:
            name: argo-rollouts-dashboard
            port:
              number: 3100
        path: /
        pathType: Prefix

 2.2.3:测试访问

2.3:部署kubectl argo rollouts插件

argo rollouts专用的kubectl插件为可选组件,但安装该组件将能够非常便捷地使用Argo Rollouts
root@k8s-master01:~# curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.7.2/kubectl-argo-rollouts-linux-amd64
root@k8s-master01:~# chmod +x ./kubectl-argo-rollouts-windows-amd64 
root@k8s-master01:~# mv ./kubectl-argo-rollouts-windows-amd64 /usr/local/bin/kubectl-argo-rollouts
root@k8s-master01:~# kubectl argo rollouts version

 三、结合Service进行Canary部署

3.1: 环境说明

   应用:spring-boot-helloworld

           - 微服务,默认监听于80/tcp

   使用Argo Rollouts 提供的Rollout资源编排运行该应用

           - 使用Canary 更新策略

           - 推出一个Canary Pod后即暂停,需要用户手动Promote

相关的常用命令

  更新应用:

kubectl argo rollouts set image ROLLOUT_NAME CONTAINTER=NEW_IMAGE

  继续更新:

kubectl-argo-rollouts promote ROLLOUT_NAME [flags

 中止更新:

kubectl-argo-rollouts abort ROLLOUT_NAME [flags]

 回滚:

kubectl-argo-rollouts undo ROLLOUT_NAME [flags]

3.2: yaml 文件编写

vim rollouts-demo.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-spring-boot-helloworld
spec:
  replicas: 10
  strategy:
    canary:
      steps:
      - setWeight: 10
      - pause: {}
      - setWeight: 20
      - pause: {duration: 20}
      - setWeight: 30
      - pause: {duration: 20}
      - setWeight: 40
      - pause: {duration: 20}
      - setWeight: 60
      - pause: {duration: 20}
      - setWeight: 80
      - pause: {duration: 20}
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: spring-boot-helloworld
  template:
    metadata:
      labels:
        app: spring-boot-helloworld
    spec:
      containers:
      - name: spring-boot-helloworld
        image: github/spring-boot-helloworld:v0.9.2
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
        resources:
          requests:
            memory: 32Mi
            cpu: 50m
        livenessProbe:
          httpGet:
            path: '/'
            port: 80
            scheme: HTTP
          initialDelaySeconds: 3
        readinessProbe:
          httpGet:
            path: '/'
            port: 80
            scheme: HTTP
          initialDelaySeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-helloworld
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: spring-boot-helloworld
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-boot-helloworld
spec:
  ingressClassName: "nginx"
  rules:
    - host: hello.linux.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: spring-boot-helloworld
                port:
                  number: 80

3.3: 在web页面查看

3.4:测试请求

while true; do curl http://hello.linux.com; curl http://hello.linux.com/version; echo; sleep 0.$[$RANDOM%10]; done

rollouts 更新镜像

kubectl argo rollouts set image rollouts-spring-boot-helloworld spring-boot-helloworld=gitlab/spring-boot-helloworld:v0.9.3

查看ui界面第一次调度10%的流量到新版服务中,然后每隔20s调度20%的流量直到全部流量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值