
【 云原生 | kubernetes 】- Argo Rollouts渐进式发布
Argo Rollouts是用于渐进式交付的Kubernetes 控制器,是Argo开源项目的一部分。为提供高级部署功能,具有渐进式交付、蓝绿发布、金丝雀发布和金丝雀分析等功能。
Argo Rollouts
是用于渐进式交付的Kubernetes 控制器,是Argo开源项目的一部分。为Kubernetes提供高级部署功能,具有渐进式交付、蓝绿发布、金丝雀发布和金丝雀分析等功能。
- 蓝绿更新策略
- 金丝雀更新策略
- 更加细粒度、加权流量拆分
- 自动回滚
- 手动判断
- 可定制的指标查询和业务 KPI 分析
- Ingress 控制器集成:NGINX,ALB
- 服务网格集成:Istio,Linkerd,SMI
- Metrics 指标集成:Prometheus、Wavefront、Kayenta、Web、Kubernetes Jobs、Datadog、New Relic
工作原理
与Deployment对象类似,Argo Rollouts
控制器将管理replicsets的创建、伸缩和删除。这些replicsets是由Rollout资源中的spec.template字段定义的,该字段使用与部署对象相同的pod模板。
当spec.template被更改时,它会向Argo Rollouts
控制器发出信号,表示将引入一个新的replicset。控制器将使用spec.strategy字段中的策略集,以确定如何从旧的副本集进展到新的副本集。一旦新的replicset被放大(并可选地通过Analysis),控制器将把它标记为“ stable
”。
如果在从稳定副本到新副本的转换过程中,spec.template中发生了另一项更改(例如,在rollout
的中间更改了应用程序版本),那么之前新的副本将按比例缩小,控制器将尝试前进反映更新的spec.template字段的ReplicasSet。
相关概念
Rollouts
Rollout
是一个等效于 Deployment 的 Kubernetes 的工作负载资源,在需要更高级的部署或渐进式交付功能的情况下,Rollout 取代 Deployment 对象,Rollout
提供了 Kubernetes Deployment 所不能提供的功能。
- 蓝绿部署
- 金丝雀部署
- 入口控制器和服务网格集成,用于高级流量路由
- 用于分析的指标提供程序集成
- 根据成功或失败指标的自动升级与回滚
渐进式交付
渐进式交付为我们提供CI/CD,也提供了安全措施和控制手段,以降低不断将新代码推入生产环境的风险。渐进式交付让我们能够安全地执行CI/CD。
部署策略
以下是 Argo Rollouts 提供的各种部署策略
Rolling Update
(滚动更新):这是Deployment对象默认的更新策略。当新版本的出现,旧版本会依次减少,保持应用的总量不变。Recreate
(重新创建): 在启动新版本之前删除旧版本的应用程序,确保不会有两个版本的应用程序同时运行。但是,这种部署策略会导致停机。Blue-Green
(蓝绿): 蓝绿部署是不停老版本,部署新版本进行测试,确认正常后将流量逐步切到新版本。蓝绿部署无需停机,并且风险较小。Canart
(金丝雀):金丝雀也成灰度发布。将一部分用户暴露在新版本的应用程序中,而将其余流量提供给旧版本,验证数据正常,新版本取代旧版本。
安装
控制器安装
通过kubernetes控制器安装Argo Rollouts,
$ kubectl create namespace argo-rollouts
$ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
运行一下命令创建名为Argo Rollouts的命名空间
[root@ycloud install]# kubectl get po -n argo-rollouts
NAME READY STATUS RESTARTS AGE
argo-rollouts-845b79ff9-jwcpq 1/1 Running 0 24d
可以到query仓库找到最新的容器镜像
Helm 安装
通过 Helm 安装 Argo Rollouts,
helm repo add argo https://argoproj.github.io/argo-helm
helm install my-release argo/argo-rollouts
安装后,使用以下命令安装 Argo 仪表板
--set dashboard.enabled=true
可通过端口转发访问web 31000端口
kubectl port-forward service/argo-rollouts-dashboard 31000:3100
Kubectl 插件安装
但可以方便地从命令行管理和可视化部署。
$ curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
$ chmod +x ./kubectl-argo-rollouts-linux-amd64
$ mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kuberollout
检测确保安装成功
[root@ycloud install]# kuberollouts version
kubectl-argo-rollouts: v1.3.0-rc1+0ec5ac1
BuildDate: 2022-07-29T18:58:16Z
GitCommit: 0ec5ac18a307ae579787b974e17f3e4c0bf41cff
GitTreeState: clean
GoVersion: go1.18.4
Compiler: gc
Platform: linux/amd64
使用
接下来我们通过部署、升级、升级和中止部署来演示 Argo Rollouts 的各种概念和功能
使用 Argo Rollouts 部署 Canary
1.部署
首先我们部署一个 Rollout 资源和一个针对该资源的 Service 对象,
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollouts-demo
spec:
replicas: 5
strategy: #升级策略
canary: #金丝雀发布
steps: #发布阶段
- setWeight: 20
- pause: {} #表示暂停
- setWeight: 40
- pause: {duration: 10} #暂停 10s
- setWeight: 60
- pause: {duration: 10}
- setWeight: 80
- pause: {duration: 10}
revisionHistoryLimit: 2
selector:
matchLabels:
app: rollouts-demo
template:
metadata:
labels:
app: rollouts-demo
spec:
containers:
- name: rollouts-demo
image: argoproj/rollouts-demo:blue
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
---
apiVersion: v1
kind: Service
metadata:
name: rollouts-demo
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: rollouts-demo
---
任何 Rollout 的初始创建都会立即将副本扩展到 100%(跳过任何金丝雀升级步骤、分析等),因为没有发生升级。
2.更新
每次在Rollout中更新pod的spec.template时,都将部署一个新版本
运行以下命令以rollouts-demo
使用“黄色”版本的容器更新 Rollout
[root@ycloud install]# kuberollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
rollout "rollouts-demo" image updated
rollout策略制定新版本应仅部署20%的流量,然后暂停。
当 rollout demo 到第二步时,我们可以从插件中看到 Rollout 处于暂停状态,现在 5 个副本中有 1 个在运行新版本的 pod 模板,5 个副本中有 4 个在运行旧版本。这相当于 setWeight: 20
步骤定义的 20% 金丝雀重量。
3.推广
strategy 配置表明,将金丝雀扩展至 20% 后,Rollout 应该无限期停止并等待操作员。使用这个命令来推广 Rollout 进入下一过程
[root@ycloud install]# kuberollouts promote rollouts-demo
rollout 'rollouts-demo' promoted
推广之后Rollout会执行剩下的所有步骤,查看rollout状态
4.中止
接下来我们来了解如何在更新过程中手动中止 Rollout,使用set image
命令部署一个red
版本的容器, 并等待部署再次到达暂停的步骤
[root@ycloud install]# kuberollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:
red
rollout "rollouts-demo" image updated
这次我们通过使用abort命令,在更新过程中中止Rollout,这样它就回到 stable
版本
[root@ycloud install]# kuberollouts abort rollouts-demo
rollout 'rollouts-demo' aborted
当rollout中止,它将放大ReplicaSet的stable
版本(黄色图像),并缩小其他任何版本。 尽管 ReplicaSet 的稳定版本可能正在运行并且是健康的,但仍会考虑整体推出Degraded
,因为所需的版本(红色图像)不是实际运行的版本。
为了使 Rollout 再次被认为是健康的而不是有问题的版本,有必要将所需的状态改回以前的稳定版本。
[root@ycloud install]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rollouts-demo-5747959bdb 0 0 0 11m
rollouts-demo-687d76d795 0 0 0 77m
rollouts-demo-6cf78c66c5 5 5 5 30m
根据rs生成时间可以确认,版本以回到上一阶段的版本(yellow)
我们可以简单地使用之前的 yellow
镜像重新运行 set image
命令即可。
[root@ycloud install]# kuberollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
rollout "rollouts-demo" image updated
Dashboard
kubelet插件可以提供本地 UI 仪表板来可视化您的 Rollouts。
要启动它,kuberollout dashboard
请在包含您的 Rollouts 的命名空间中运行。然后访问localhost:3100
查看用户界面。
可查看到rollouts-demo升级策略的详细信息,也可对rollout进行相关操作
结论
Argo Rollouts拓展了 Kubernetes 部署对象的功能,榜之我们能够轻松实施高级渐进式交付策略。我们带领尝试了金丝雀发布更新,还有很多功能等着我们去探索。
参考文献
https://argoproj.github.io/argo-rollouts/
https://artifacthub.io/packages/helm/argo/argo-rollouts
更多推荐
所有评论(0)