Argo Rollouts工作机制及快速入门
Argo生态目前主要由四个子项目组成
◼ Argo Workflows
◆第一个Argo项目
◆基于Kubernetes平台的原生工作流引擎,支持 DAG和step-based工作流
◼ Argo Events
◆Kubernetes上的基于事件的依赖管理器,用于触发Kubernetes中的Argo工作流和其他操作
◼ Argo CD
◆由Argo社区和Intuit维护的开源项目
◆支持GitOps范式的的声明式Kubernetes资源管理
◼ Argo Rollouts
◆ArgoCD的高级交付策略工具
◆支持声明式渐进式交付策略,例如 canary 、blue-green等
Argo Rollouts概览
Argo Rollouts
◼ 由一个控制器和一组CRD组成,可为Kubernetes提供高级部署功能,包括
◆blue-green
◆canary
◆canary analysis
◆experimentation
◆progressive delivery
◼ 支持与Ingress Controller(Nginx和ALB)及ServiceMesh(Istio、Linkerd和SMI)集成,利用它们的流量治理能力实现流量迁移过程
◼ 能够查询和解释来自多种指标系统(Prometheus、Kubernetes Jobs、Web、Datadog等)的指标来验证BlueGreen或Canary部署结果,并根据结果自动决定执行升级或回滚
◼ 几个相关的CRD
◆Rollout、AnalysisTemplate、ClusterAnalysisTemplate和AnalysisRun
基本工作机制
◼ 与Deployment相似,Argo Rollouts控制器借助于ReplicaSet完成应用的创建、缩放和删除;
◼ ReplicaSet资源由Rollout的spec.template字段进行定义
Argo Rollouts支持的非常著名的高可用策略:Blue-Green和Canary部署
Blue-Green(蓝绿发布)
对任何一个应用而言,应用本身有旧版(蓝版),当发布新版本的时候,在部署一个绿版出来,二者规格一模一样,所以需要制备两套资源。一但新版的规格应用被拉起来之后,一次性的将流量切换到绿版,并等待绿版流量分析结果,如果客户端的请求都能被正常响应,没有投诉,监控也没有报错,此时就将蓝版清理掉,释放资源
对于微服务的架构场景,在kubernetes之上,无非就是多创建几个pod
微服务的管理场景当中,几乎都是蓝绿发布(常用于有状态的场景)
Canary(金丝雀发布,其实就是滚动发布)
假如现在版本是version 3.0,需要发布version 3.4
引出来一个子集,version 3.0假如10个pod,version 3.4只有1个pod,所以只会在version 3.0之外部署少量的pod,并引一定比例的流量(如10%)到新版上来,等流量分割到新版之后,不会立即执行更新操作,等待查看引入的流量有没有什么错误发生,并根据监控结果来判定,是完成后续所有的滚动还是回滚。如果是完成后续的所有滚动,就需要加入更多的pod,把流量的比例渐渐的切入到新版上来,在此过程当中,不断减少旧版pod的数量,进而所有的流量都迁移到新版上来
Argo Rollouts架构
Argo Rollout主要由Argo Rollout Controller、Rollout CRD、ReplicaSet、Ingress/Service、
AnalysisTemplate/AnalysisRun、Metric providers和CLI/GUI等组件构成
Argo Rollouts架构组件
Rollout Controller
◼ 负责管理Rollout CRD资源对象
Rollout CRD
◼ 由Argo Rollout引入的自定义资源类型,与Kubernetes Deployment兼容,但具有控制高级部署方法的阶段、阈值和方法的额外字段
◼ 并不会对Kubernetes Deployment施加任何影响,或要使用Rollout的功能,用户需要手动将资源从Deployment迁移至Rollout
Ingress/Service
◼ Argo Rollouts使用标准的Kubernetes Service,但需要一些额外的元数据
◼ 针对Canary部署,Rollouts支持多种不同的ServiceMesh和Ingress Controller,实现精细化的流量分割和迁移
AnalysisTemplate和AnalysisRun
◼ Analysis是将Rollout连接至特定的Metric Provider,并为其支持的某些指标定义特定的阈值的能力,于是,这些指标的具体值将决定更新操作是否成功进行;
◼ 若指标查询结果满足阈值,则继续进行;若不能满足,则执行回滚;若查询结果不确定,则暂停;
◼ 为了执行Analysis,Argo Rollouts提供了AnalysisTemplate和AnalysisRun两个CRD
如何在kubernetes集群上使用Rollouts来取代过去使用的Deployment完成应用编排
部署Argo Rollouts
需要部署三个组件
部署Argo Rollouts (Rollouts自身,包括Rollouts控制器和它所提供的几个自定义资源)
◼ kubectl create namespace argo-rollouts
◼ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
◆会生成一个services/ argo-rollouts-metrics、一个deployments/argo-rollouts,以及一组CRD
部署Dashboard (图形面板,允许我们用图形化的界面监视它的更新过程,了解更新状态)
◼ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/dashboard-install.yaml
◼ 安装生成的services/argo-rollouts-dashboard默认监听于TCP/3100端口
部署kubectl argo rollouts插件 (用以命令行的方式管理Rollouts资源对象)
◼ argo rollouts专用的kubectl插件为可选组件,但安装该组件将能够非常便捷地使用Argo Rollouts
◼ 安装
◆curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-darwin-amd64
◆chmod +x ./kubectl-argo-rollouts-darwin-amd64
◆sudo mv ./kubectl-argo-rollouts-darwin-amd64 /usr/local/bin/kubectl-argo-rollouts
◼ 测试
◆kubectl argo rollouts version
具体部署如下:
Argo Rollouts部署清单说明:https://github.com/argoproj/argo-rollouts,打开最新版本,找到install.yaml部署文件:
dashboard-install.yaml部署文件:
对应的插件(找适配自己系统平台的版本)kubectl-argo-rollouts-darwin-amd64部署文件:
在k8s集群主节点之上进行部署
第一步:部署Argo Rollouts (Rollouts自身,包括Rollouts控制器和它所提供的几个自定义资源)
创建名称空间
kubectl create namespace argo-rollouts
在名称空间之下部署argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
查看名称空间及名称空间下部署的argo-rollouts的pod
kubectl get ns
kubectl get pods -n argo-rollouts
查看资源群组
kubectl api-versions
查看某个组内有多少个资源类型
kubectl api-resources --api-group=argoproj.io
第二步:部署Dashboard (图形面板,允许我们用图形化的界面监视它的更新过程,了解更新状态)
kubectl apply -f https://github.com/argoproj/argo-rollouts/releases/download/v1.4.0/dashboard-install.yaml -n argo-rollouts
查看pods(多了一个独立的组件),这是一个基于外部接口所访问的页面,此时是没办法进行访问,需额外部署ingress
kubectl get pods -n argo-rollouts
部署ingress nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml
查看部署状态:kubectl get pods -n ingress-nginx
基于文件定义ingress资源开启Dashboard的外部流量策略(没有认证功能,开放以后都可访问,适合内部使用)
[root@ubuntu2004 01-ingress-argocd-and-rollouts]#pwd
/root/learning-jenkins-cicd/09-argocd-and-rollout/01-ingress-argocd-and-rollouts
[root@ubuntu2004 01-ingress-argocd-and-rollouts]#ls
ingress-argocd.yaml ingress-argo-rollouts.yaml
[root@ubuntu2004 01-ingress-argocd-and-rollouts]#cat ingress-argo-rollouts.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argo-rollouts
namespace: argo-rollouts
spec:
ingressClassName: nginx
rules:
- host: rollouts.magedu.com
http:
paths:
- backend:
service:
name: argo-rollouts-dashboard
port:
number: 3100
path: /
pathType: Prefix
- host: rollout.magedu.com
http:
paths:
- backend:
service:
name: argo-rollouts-dashboard
port:
number: 3100
path: /
pathType: Prefix
kubectl apply -f ingress-argo-rollouts.yaml
查看ingress资源
kubectl get ingress -n argo-rollouts
NAME CLASS HOSTS ADDRESS PORTS AGE
argo-rollouts nginx rollouts.magedu.com,rollout.magedu.com 80 7S
在桌面系统完成相关解析并进行访问
查看svc,看dashboard运行在哪个节点并进行解析
kubectl get svc -n arge.rollouts
没有部署任何资源,不会有任何显示
第三步:部署kubectl argo rollouts插件 (用以命令行的方式管理Rollouts资源对象)
curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.4.0/kubectl-argo-rollouts-darwin-amd64
下载完之后,把它挪到任何一个只要path环境变量能够搜索到的命令保存路径下,会自动成为kubectl的插件
install -m 755 kubectl-argo-rollouts-darwin-amd64 /usr/local/bin/kubectl-argo-rollouts
建立软连接:
ln -sv /usr/local/bin/kubectl-argo-rollouts /usr/local/bin/kubectl-rollouts
接下来就可以直接使用了
kubectl rollouts
部署rollouts级别的应用
[root@ubuntu2004 rollout-demos]#pwd
/root/learning-jenkins-cicd/09-argocd-and-rollout/rollout-demos
[root@ubuntu2004 rollout-demos]#ls
01-basic-rollouts-demo.yaml 04-rollouts-bluegreen-demo.yaml
02-rollouts-with-ingress-nginx-traffic-shifting.yaml 05-rollouts-bluegreen-with-analysis.yaml
03-rollouts-with-prometheus-analysis.yaml 06-argocd-application-and-rollouts.yaml
[root@ubuntu2004 rollout-demos]#cat Rollout
# CopyRight: MageEdu
#
---
apiVersion: argoproj.io/v1alpha1 #所属资源群组
kind: Rollout #定义Rollout资源
metadata:
name: rollouts-spring-boot-helloworld #资源名字
spec:
replicas: 10 #运行10个pod
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: #pod模板
metadata:
labels:
app: spring-boot-helloworld
spec:
containers:
- name: spring-boot-helloworld
image: ikubernetes/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.magedu.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: spring-boot-helloworld
port:
number: 80
---
进行部署
kubectl apply -f 01-basic-rollouts-demo.yaml
在default名称空间下会创建10个pod
kubect get pods
在argo rollouts图形界面下
使用命令行方式查看资源状态
查看资源
kubectl get rollouts
查看资源具体情况
kubectl rollouts get rollouts rollouts-spring-boot-helloworld
-w资源监视
列出rollouts资源
kubectl rollouts list rollouts
对rollouts资源进行更新
kubectl rollouts set image rollouts-spring-boot-helloworld spring-boot-helloworld=kubernetes/spring-boot-helloworld:v0.9.3
(set image:指定更新哪个资源,并更新资源中的pod容器的image)
可对资源进行持续监视
kubectl rollouts get rollouts rollouts-spring-boot-helloworld -w
图形界面
进行流量访问,查看流量分布情况
查看service
kubectl get svc
开另一终端对service进行持续访问,查看流量分布情况
while true; do curl 10.108.36.148; sleep 0.$[$RANDOM%10]; done
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.3
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.2
Spring Boot Helloworld, Version 0.9.3
请求没有问题,0.9.3能够正常提供服务,接下来就可以通过设置图形页面PROMOTE来继续完成后面的更新
也可使用命令触发
查看当前状态发现现在是暂停状态
kubectl rollouts list rollouts
状态为Paused(暂停状态)
使用命令触发后续更新
kubectl rollouts promote rollouts-spring-boot-helloworld
图形界面
更新完之后,所有的流量都到3.9.3上,如果有问题,可在图形界面点击ROLLBACK进行回滚
或者在命令行下进行回滚(如果没有指定回滚到哪个,会回滚到前一个)
kubectl rollouts undo rollouts-spring-boot-helloworld
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net