文章目录
- 应用
-
- 环境
- [一、Argo rollouts安装](#一、Argo rollouts安装)
-
- [1. 在Kubernetes集群中安装argo rollouts](#1. 在Kubernetes集群中安装argo rollouts)
- [2.安装argo rollouts的kubectl plugin](#2.安装argo rollouts的kubectl plugin)
- [3. Argo-Rollouts Dashboard](#3. Argo-Rollouts Dashboard)
- 二、负载均衡器metallb部署
- [三、Traffic Shifting 流量接入](#三、Traffic Shifting 流量接入)
-
- [1.服务代理ingress nginx部署](#1.服务代理ingress nginx部署)
- 2.获取应用YAML部署描述文件
- 3.部署应用
- 4.访问应用
- 4.更新应用
应用
环境
虚拟机
Ip | 主机名 | cpu | 内存 | 硬盘 |
---|---|---|---|---|
192.168.10.11 | master01 | 2cpu双核 | 4G | 100G |
192.168.10.12 | worker01 | 2cpu双核 | 4G | 100G |
192.168.10.13 | worker02 | 2cpu双核 | 4G | 100G |
版本 centos7.9
已部署k8s-1.27
一、Argo rollouts安装
均在master节点操作
1. 在Kubernetes集群中安装argo rollouts
kubectl create namespace argo-rollouts
wget https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
kubectl -n argo-rollouts apply -f install.yaml
kubectl -n argo-rollouts get all
![](https://img-blog.csdnimg.cn/direct/c5e9a318db76454697e0600eb7f6f774.png)
2.安装argo rollouts的kubectl plugin
还可以安装一个 kubectl 插件,对于命令行管理和可视化发布非常方便。使用 curl 安装 Argo Rollouts 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/kubectl-argo-rollouts
执行下面的命令来验证插件是否安装成功
kubectl argo rollouts version
![](https://img-blog.csdnimg.cn/direct/b8d389f122504dba8bdde09d3ba68c4c.png)
3. Argo-Rollouts Dashboard
Argo Rollouts Kubectl 插件可以提供一个本地 Dashboard,来可视化你的 Rollouts。
要启动这个 Dashboard,需要在包含 Rollouts 资源对象的命名空间中运行 kubectl argo rollouts dashboard 命令,然后访问localhost:3100 即可。
kubectl argo rollouts dashboard &
windows浏览器访问:192.168.10.11:3100
过程比较漫长,可以先做下面部分
点击 Rollout 可以进行详细页面,在详细页面可以看到Rollout 的配置信息,还可以直接在 UI 界面上执行一些常用的操作,比如重启、重启、中断等。
二、负载均衡器metallb部署
1. 修改kube-proxy代理模式
kubectl get configmaps -n kube-system
![](https://img-blog.csdnimg.cn/direct/d4e44400908a4527912df79c34e266f9.png)
kubectl edit configmap kube-proxy -n kube-system
修改两处
strictARP 由原来的flase修改为true
mode 添加ipvs
kubectl rollout restart daemonset kube-proxy -n kube-system
2. metallb部署
服务器连接不了时,可在vpn连接后,Windows浏览器中访问
https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml
看到内容后复制创建文件
vim metallb-native.yaml
使用创建的文件metallb-native.yaml进行部署
kubectl apply -f metallb-native.yaml
kubectl -n metallb-system get pod
![](https://img-blog.csdnimg.cn/direct/0108b01f38f746d4988a4438abf8767f.png)
等待一会,可通过查看描述信息跟踪pod的运行状态,长时间无法完成下载时,各节点重启docker
查看描述信息
kubectl describe pod pod名称
3.IP地址池准备
vim ippool.yaml
\
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: ippool
namespace: metallb-system
spec:
addresses:
- 192.168.10.240-192.168.10.250
kubectl apply -f ippool.yaml
查看地址池信息:
kubectl -n metallb-system get ipaddresspool
![](https://img-blog.csdnimg.cn/direct/977d843d02e5471a9eccd4c9eef25557.png)
4.开启二层通告
vim L2.yaml
\
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
kubectl apply -f L2.yaml
三、Traffic Shifting 流量接入
1.服务代理ingress nginx部署
Windows浏览器打开文件:
https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml
复制网页文件内容,创建deploy.yaml文件
vim deploy.yaml
复制文件内容
修改此行 type: NodePort
为 type: LoadBalancer
修改前
修改后
执行yaml文件并查看
kubectl apply -f deploy.yaml
kubectl -n ingress-nginx get pod,svc
![](https://img-blog.csdnimg.cn/direct/21aeb1873fe348c5af1b3c817b44e90e.png)
2.获取应用YAML部署描述文件
mkdir /root/tsdir
cd /root/tsdir
windows浏览器打开文件
https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/nginx/rollout.yaml
复制网页内容,创建rollout.yaml文件
为了方便测试把setWeight: 5修改为setWeight: 50
vim rollout.yaml
\
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollouts-demo
spec:
replicas: 1
strategy:
canary:
canaryService: rollouts-demo-canary
stableService: rollouts-demo-stable
trafficRouting:
nginx:
stableIngress: rollouts-demo-stable
steps:
- setWeight: 50
- pause: {}
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
上面的资源清单中,我们定义了一个 rollouts-demo 的 Rollout 资源,它的 canaryService 和 stableService 分别引用了两个 Service 资源, stableIngress 引用了一个 Ingress 资源,steps 定义了金丝雀发布的步骤,这里我们定义了两个步骤,第一个步骤将权重设置为 50%,第二个步骤是暂停,这样就可以在第一个步骤中将 50% 的流量发送到金丝雀上,然后手动发布,最后在升级的剩余时间内逐渐自动增大流量。
其中 canary.trafficRouting.nginx.stableIngress 中引用的 Ingress 需要有一个 host 规则,该规则具有针对 canary.stableService 下引用的服务的后端。
windows浏览器打开文件
复制网页内容到word文件中,将文件中的#行删除后复制到linux系统services.yaml文件
因为带注释会有问题
https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/nginx/services.yaml
vim services.yaml
\
apiVersion: v1
kind: Service
metadata:
name: rollouts-demo-canary
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: rollouts-demo
---
apiVersion: v1
kind: Service
metadata:
name: rollouts-demo-stable
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: rollouts-demo
从配置文件可以看出Rollout里用canaryService和stableService分别定义了该应用灰度的Service Name(rollouts-demo-canary)和当前版本的Service Name(rollouts-demo-stable)。而且rollouts-demo-canary 和 rollouts-demo-stable的service的内容是一样的。
最后还需要定义一个 Ingress 对象:
windows浏览器打开文件
复制网页内容到word文件中,将文件中的#行删除后复制到linux系统ingress.yaml文件
https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/nginx/ingress.yaml
vim ingress.yaml
\
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rollouts-demo-stable
spec:
ingressClassName: nginx
rules:
- host: www.test.com # 对外发布的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: rollouts-demo-stable
port:
number: 80
3.部署应用
kubectl apply -f rollout.yaml
kubectl apply -f services.yaml
kubectl apply -f ingress.yaml
查看
kubectl get rollout
![](https://img-blog.csdnimg.cn/direct/23b75a15e74245448ae57a40324b473f.png)
kubectl get pod
kubectl get service
![](https://img-blog.csdnimg.cn/direct/dc5529b022e140e4807a31ba707f6fcf.png)
kubectl get ingress
![](https://img-blog.csdnimg.cn/direct/741b2f958fcd476db4cdde9e37a70e5e.png)
我们可以注意到新增了一个名为 rollouts-demo-rollouts-demo-stable-canary 的 Ingress 对象。这个对象是 canary ingress,它是 nginx.stableIngress 下引用的用户管理 Ingress 的克隆。 nginx ingress 控制器使用它来实现金丝雀流量分割。生成的入口的名称是使用 --canary 制定的。
观察rollouts-demo-rollouts-demo-stable-canary的内容如下:
kubectl get ingress rollouts-demo-rollouts-demo-stable-canary -o yaml
![](https://img-blog.csdnimg.cn/direct/f8f91f3d66994c54aedf57c249eb0bc6.png)
4.访问应用
客户端主机修改/etc/hosts文件
192.168.10.240 www.test.com
通过域名访问,可以看到如下界面。
4.更新应用
现在通过以下命令来进行应用更新操作。
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
![](https://img-blog.csdnimg.cn/direct/e7a7345e2b38403383ce21cf40f1a40d.png)
kubectl argo rollouts get rollout rollouts-demo
![](https://img-blog.csdnimg.cn/direct/8d916e75587c49e09f69c4d6978ffe96.png)
然后可以看到rollouts-demo-rollouts-demo-stable-canary的ingress的annotations中新增了两个参数,如下:
kubectl get ingress rollouts-demo-rollouts-demo-stable-canary -o yaml
![](https://img-blog.csdnimg.cn/direct/81ff16e1141f4bb9bac521b5a66ce42a.png)
我们发现它比原始 Ingress 有以下变化:
• 注解中添加了两个额外的 NGINX 特定金丝雀注解。
• Ingress 规则将有一条将后端指向金丝雀服务的规则。
随着 Rollout 逐步进行,canary-weight 注解将调整以匹配步骤的当前 setWeight。NGINX Ingress 控制器检查原始 Ingress、金丝雀 Ingress 和金丝雀权重注解,以确定在两个入口之间分配的流量百分比。
然后可以通过验证结果来判断是否继续还是终止。
如果继续使用如下命令,可以执行 promote 命令来将Rollout 推进到下一个步骤,这样就完成了金丝雀发布:
kubectl argo rollouts promote rollouts-demo
![](https://img-blog.csdnimg.cn/direct/b01b9468b6f0420cae761fbbdd7a5e1d.png)
kubectl argo rollouts get rollout rollouts-demo
![](https://img-blog.csdnimg.cn/direct/94dcc3fc0620470592578f6f284bd094.png)
如果终止使用如下命令:
kubectl-argo-rollouts undo rollouts-demo --to-revision=1
![](https://img-blog.csdnimg.cn/direct/b2b9552eae8f4b119ce70aaf7e3fc4a2.png)
kubectl argo rollouts get rollout rollouts-demo
![](https://img-blog.csdnimg.cn/direct/ee609e62776248c7ad9273c70286204c.png)
kubectl argo rollouts abort rollouts-demo
![](https://img-blog.csdnimg.cn/direct/4ec99c58aa7a48b6b2f3a46cc8e6d263.png)
kubectl argo rollouts get rollout rollouts-demo
![](https://img-blog.csdnimg.cn/direct/1e5f025d5969431d8fd8e3cad31578aa.png)
但是我们可以看到Status是Degraded状态而并非Healthy状态,我们有必须要将其变成Healthy状态。最简单的办法就是执行如下命令重新发布一下版本:
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
kubectl argo rollouts get rollout rollouts-demo
![](https://img-blog.csdnimg.cn/direct/e1db68f3224c457294a198ae425e1285.png)