Kubernetes高级部署组件 Argo Rollout

news/2025/3/10 14:53:38/文章来源:https://www.cnblogs.com/Jas0n0ss/p/18346288

Argo介绍

https://argoproj.github.io/

Argo 是一个开源项目,旨在提供一套用于在 Kubernetes 上运行和管理容器化工作负载的工具。
Argo 项目最早在2017年由Applatix公司创立开源,在2018年被美国加利福尼的 Intuit 公司收购并持续维护,并得到了广泛的社区支持。

Argo 项目主要包括以下几个子项目,每个子项目都有其特定的用途:

  • Argo Workflows:

简介: Argo Workflows 是一个 Kubernetes 原生的工作流引擎,用于在 Kubernetes 集群上创 建、管理和协调容器化任务。
用途: 支持DAG(有向无环图 Directed Acyclic Graph),复杂的工作流定义和依赖管理,适用 于数据处理、机器学习训练和 CI/CD 管道等场景。

特性: 提供可视化界面、支持各种编程语言的模板、内置重试和错误处理机制。

  • Argo CD:

简介: Argo CD 是一个用于 Kubernetes 的持续交付工具,通过声明式的 GitOps 方法来管理 Kubernetes 资源。
用途: 将 Git 仓库中的配置和应用程序声明与 Kubernetes 集群的实际状态进行同步。
特性: 提供可视化的同步状态监控、自动回滚、支持多种 Git 提供商、提供丰富的 RBAC(基 于角色的访问控制)。

  • Argo Events:

简介: Argo Events 是一个事件驱动的工作流自动化框架,允许用户根据特定的事件触发工作 流。
用途: 通过各种事件源(如 GitHub、S3、HTTP 请求等)触发 Argo Workflows 或 Kubernetes 资源。

特性: 支持多种事件源、灵活的事件依赖管理、提供事件驱动的自动化功能。

  • Argo Rollouts:

简介: Argo Rollouts 是一个用于管理 Kubernetes 中高级部署策略的工具。
用途: 支持蓝绿部署、金丝雀部署、分阶段发布等高级发布策略,确保应用程序的平滑升级和 回滚。
特性: 提供可视化的发布状态监控、细粒度的流量控制、内置指标和健康检查功能。

这些子项目协同工作,为在 Kubernetes 上实现高效、可扩展和自动化的应用程序交付提供了强大的工 具集。

Argo Rollouts 介绍

Argo Rollouts 是 Argo 开源项目的一部分。Argo Rollouts 是一个用于渐进式交付的 Kubernetes 控制器,相当于增强版的deployment资源Argo Rollouts 包括一组自定义资源定义 (CRD),向 Kubernetes 引入蓝绿部署blue-green、金丝雀 发布canary、金丝雀分析canary analysis、渐进式交付progressive delivery 等高级部署功能。

Argo Rollouts 支持与ServiceMesh(Istio、Linkerd和SMI)和Ingress Controller 集成,以利用其流量 治理能力,并在更新期间逐渐将流量转移到新版本。

Argo Rollouts 还能够查询和解释来自多种指标系统(Prometheus、Kubernetes Jobs、Datadog等) 的指标来检查Blue-Green或Canary部署结果,并根据结果自动决定执行升级或回滚

发布模式:

蓝绿发布:

蓝绿发布提供了一种零宕机的部署方式。不停老版本,部署新版本进行测试,确认OK,将流量切到新版本,然后老版本同时也升级到新版本。始终有两个版本同时在线,有问题可以快速切换。

如下灰度发布的大致流程

先切分20%的流量到新版本,若表现正常,逐步增加流量占比,继续测试新版本表现。若新版本一直很稳定,那么将所有流量都切分到新版本,并下线老版本。

2.gif

切分20%的流量到新版本后,新版本出现异常,则快速将流量切回老版本。

3.gif

金丝雀发布(灰度发布):

采用金丝雀部署,可以在生产环境的基础设施中小范围的部署新的应用代码。一旦应用签署发布,只有少数用户被路由到它。最大限度的降低影响。如果没有错误发生,新版本可以逐渐推广到整个基础设施。下图示范了金丝雀部署:

6.jpg

部署 Argo Rollouts

https://argoproj.github.io/argo-rollouts/installation/

[root@rocky01 ~] # kubectl create namespace argo-rollouts
[root@rocky01 ~] # kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
#生成API群组和CRD资源
[root@rocky01 ~] # kubectl api-resources --api-group argoproj.io
NAME                       SHORTNAMES   APIVERSION             NAMESPACED   KIND
analysisruns               ar           argoproj.io/v1alpha1   true         AnalysisRun
analysistemplates          at           argoproj.io/v1alpha1   true         AnalysisTemplate
clusteranalysistemplates   cat          argoproj.io/v1alpha1   false        ClusterAnalysisTemplate
experiments                exp          argoproj.io/v1alpha1   true         Experiment
rollouts                   ro           argoproj.io/v1alpha1   true         Rollout
[root@rocky01 ~] # kubectl get all -n argo-rollouts
NAME                                READY   STATUS    RESTARTS   AGE
pod/argo-rollouts-bdbddf5fb-zftjw   1/1     Running   0          3m21sNAME                            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/argo-rollouts-metrics   ClusterIP   10.68.187.95   <none>        8090/TCP   3m21sNAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argo-rollouts   1/1     1            1           3m21sNAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/argo-rollouts-bdbddf5fb   1         1         1       3m21s

部署 Dashboard

[root@rocky01 ~] # kubectl apply -n argo-rollouts -f  https://github.com/argoproj/argo-rollouts/releases/latest/download/dashboard-install.yaml
[root@rocky01 ~] # kubectl get svc -n argo-rollouts
NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
argo-rollouts-dashboard   ClusterIP   10.68.192.197   <none>        3100/TCP   40s
argo-rollouts-metrics     ClusterIP   10.68.187.95    <none>        8090/TCP   6m10s
#准备ingress清单文件实现外部访问,注意:需要提前部署ingress-nginx
[root@rocky01 ~] # kubectl create ingress -n argo-rollouts --rule="rollout.k8slab.io/*=argo-rollouts-dashboard:3100" --class=nginx  rollouts
[root@rocky01 ~] # kubectl get ingress -n argo-rollouts
NAME       CLASS   HOSTS               ADDRESS         PORTS   AGE
rollouts   nginx   rollout.k8slab.io   192.168.5.239   80      18s
[root@rocky01 ~] # nslookup rollout.k8slab.io
Server:		192.168.5.1
Address:	192.168.5.1#53Name:	rollout.k8slab.io
Address: 192.168.5.239
[root@rocky01 ~] # kubectl config set-context context-lab --namespace argo-rollouts #更改默认ns为argo-rollouts

部署 kubectl argo rollouts 命令插件

argo rollouts 没有提供相关专用命令管理 argo rollouts 资源,可以通过安装kubectl的插件实现管理argo rollouts的命令功能.

[root@rocky01 ~] # wget -O  /usr/local/bin/kubectl-argo-rollouts https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64 && chmod +x /usr/local/bin/kubectl-argo-rollouts
[root@rocky01 ~] # kubectl-argo-rollouts version
kubectl-argo-rollouts: v1.7.1+6a99ea9BuildDate: 2024-06-24T22:46:25ZGitCommit: 6a99ea9908e8f1e816ccd71e4c35adbbbbdd5f6cGitTreeState: cleanGoVersion: go1.21.11Compiler: gcPlatform: linux/amd64
[root@rocky01 ~] #  echo 'source <(kubectl argo rollouts completion bash)' >> ~/.bashrc && source ~/.bashrc

kubectl argo rollouts 命令常见用法:

#更新应用
kubectl argo rollouts set image ROLLOUT_NAME CONTAINTER=NEW_IMAGE
#查看
kubectl argo rollouts get rollout ROLLOUT_NAME --watch
#继续更新
kubectl-argo-rollouts promote ROLLOUT_NAME [flags]
#中止更新
kubectl-argo-rollouts abort ROLLOUT_NAME [fags]
#再次重新更新
kubectl-argo-rollouts retry rollout ROLLOUT_NAME [fags]
#回滚
kubectl-argo-rollouts undo ROLLOUT_NAME [flags]

基础案例:

https://github.com/argoproj/argo-rollouts/tree/master/examples

结合 Service 进行 Canary 部署

https://github.com/argoproj/argo-rollouts/blob/master/examples/rollout-rolling-update.yaml

案例说明:

  • 部署 Argo Rollouts 和 dashboard 及 kubectl argo rollouts 命令插件 部署 ingress-nginx
  • 准备一个有两个新旧版本的myapp应用
  • 依赖一个Service的调度功能, 通过Pod 数量来实现灰度发布
  • 基于Pod 数量来实现流量的分配, 所以精确程度不足
# vim rollouts-canary-service-myapp.yaml
# 
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:name: rollouts-myapp
spec:replicas: 10 strategy:canary:steps:- setWeight: 10 # 先发布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: 5selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: registry.cn-beijing.aliyuncs.com/wangxiaochun/myapp:v1.0ports:- name: httpcontainerPort: 80protocol: TCPresources:requests:memory: 32Micpu: 50mlivenessProbe:httpGet:path: '/'port: 80scheme: HTTPinitialDelaySeconds: 3readinessProbe:httpGet:path: '/'port: 80scheme: HTTPinitialDelaySeconds: 5
---
apiVersion: v1
kind: Service
metadata:name: myapp
spec:ports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app: myapp
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: myapp
spec:ingressClassName: "nginx"rules:- host: myapp.k8slab.iohttp:paths:- path: /pathType: Prefixbackend:service:name: myappport:number: 80
---
[root@rocky01 ~] # vim rollouts-canary-service-myapp.yaml
[root@rocky01 ~] # kubectl apply -f rollouts-canary-service-myapp.yaml -n argo-rollouts
rollout.argoproj.io/rollouts-myapp created
service/myapp created
ingress.networking.k8s.io/myapp created
[root@rocky01 ~] # kubectl get ingress
NAME       CLASS   HOSTS               ADDRESS         PORTS   AGE
myapp      nginx   myapp.k8slab.io     192.168.5.239   80      30s
[root@rocky01 ~] # curl myapp.k8slab.io
<h1>Welcome to MyAPP v1.0</h1>

实施镜像更新
[root@rocky01 ~] # kubectl-argo-rollouts set image rollouts-myapp myapp=registry.cn-beijing.aliyuncs.com/wangxiaochun/myapp:v2.0
rollout "rollouts-myapp" image updated
[root@rocky01 ~] # kubectl-argo-rollouts status rollouts-myapp
[root@rocky01 ~] # kubectl-argo-rollouts get rollout rollouts-myapp

image-20240807034900514

在页面上点击了 Promote以后,就会每隔20S,更新10%的资源。

[root@rocky01 ~] # kubectl-argo-rollouts promote rollouts-myapp

实施回滚
[root@rocky01 ~] # kubectl-argo-rollouts undo rollouts-myapp

结合Service进行Blue-Green部署

进阶案例

结合Prometheus指标进行Analysis实现canary部署

结合Prometheus指标进行Analysis实现Blue- Green部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779049.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

n00bzCTF 2024

n00bzCTF 2024n00bzCTF 2024 Crypto Vinegar 题目:Encrypted flag: nmivrxbiaatjvvbcjsf Key: secretkeyexp: 维吉尼亚密码 ​​ flag:n00bz{vigenerecipherisfun} RSA 题目:e = 3 n = 1351123252887151367278321777355120706250832196704807178418175833438514454543565797…

两个coca略有不同词频文件 比较

coca20000xlsxFuzhi.a应该也是这样弄的.txt COCA60000.txt确实有一些词顺序不同,不知道为什么。。。

【第2期】2024 搜索客 Meetup | Elasticsearch 的代码结构和写入查询流程的解读

本次活动由 搜索客社区、极限科技(INFINI Labs)联合举办,活动主题将深入探讨 Elasticsearch 的两个核心方面:代码结构以及写入和查询的关键流程。本次活动将为 Elasticsearch 初学者和有经验的用户提供宝贵的见解,欢迎大家报名参加、交流学习。 活动主题:Elasticsearch 的…

【第2期】2024 搜索客 Meetup | Elasticsearch 的代码结构和写入查询流程的解读.md

本次活动由 搜索客社区、极限科技(INFINI Labs)联合举办,活动主题将深入探讨 Elasticsearch 的两个核心方面:代码结构以及写入和查询的关键流程。本次活动将为 Elasticsearch 初学者和有经验的用户提供宝贵的见解,欢迎大家报名参加、交流学习。 活动主题:Elasticsearch 的…

使用黑群晖webdav服务同步obsidian笔记

前言 本文使用的黑群晖套件 webdav server进行黑群晖配置,接着使用obsidian插件将笔记同步到黑群晖上 使用的黑群晖已经经过内网穿透。 配置黑群晖 配置 webdav 并创建共享文件夹 首先下载套件,在套件中心搜索webdav server ,下载安装并打开进行配置此处已经安装好了,打开,…

文件的读写

1.判断文件夹是否存在 2.文件的数据写入 3.文件内容的读取 4.文件的复制,移动,删除 5.log日志的记录 6.三种序列化器:

Apache Answer Plugin 开发笔记

0x00 引言 在前两天的 Apache CommunityOverCode Asia 2024 大会上认识到了一个很有意思的项目:Apache Answer。这是一个 Apache 开源问答社区系统,可以帮助开发者在社区中快速找到答案。尝试为这个项目做一些贡献,整理一下开发笔记。 领取的任务: incubator-answer-plugins…

2024 暑假集训笔记

Day 1搜索 DFS: 基本思路:边界设置(if(...) return ;) 检查(for(....)) 标记结果(a[...]=...) 递归搜索(dfs(...)) 回溯例题: N皇后问题 [POJ 1321] 棋盘问题 [POJ 1011] Sticks BFS 略分治 基本思路将处理区间二分为两个区间(merge(l,mid) merge(mid+1,r)) 边界(if(l==r) r…

macbook开机登录时输入正确的密码却提示密码错误

背景 Macbook正常的账户登录,提示密码错误,但是我输入的密码确认了几次都是完全正确的,就是死活登不上去一直显示密码错误,一搜索原来是操作系统BUG,有对应解决方案。 原因 系统macOS Monterey 12.0.1设计的原因,导致有某些时刻可能忘记你的开机密码,导致你输入正确的密…

中信证券抓取(页码范围)

中信证券抓取(页码范围) 创建时间:2024年8月5日 一、完整代码 import re import requests from lxml import etreeheaders = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, } url1 = ht…

三国演义内容抓取(诗词名句网)

三国演义内容抓取(诗词名句网) 时间:2024-08-06 一、完整代码 import random import timeimport requests from lxml import etreefour_famous_novels = https://www.shicimingju.com/bookmark/sidamingzhu.html # 四大名著在线阅读地址 three_kingdoms = https://www.shic…

表情党抓取(单页) (网站已转移)

表情党抓取(单页) (网站已转移) 创建时间:2024-08-06 一、完整代码 import requests from lxml import etree url = https://qq.yh31.com/xq/wq/ header = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.…