@TOC
应用
环境
虚拟机
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
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
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
kubectl edit configmap kube-proxy -n kube-system
修改两处strictARP 由原来的flase修改为truemode 添加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
等待一会,可通过查看描述信息跟踪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
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
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
kubectl get pod
kubectl get service
kubectl get ingress
我们可以注意到新增了一个名为 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
4.访问应用
客户端主机修改/etc/hosts文件192.168.10.240 www.test.com
通过域名访问,可以看到如下界面。
4.更新应用
现在通过以下命令来进行应用更新操作。
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
kubectl argo rollouts get rollout rollouts-demo
然后可以看到rollouts-demo-rollouts-demo-stable-canary的ingress的annotations中新增了两个参数,如下:
kubectl get ingress rollouts-demo-rollouts-demo-stable-canary -o yaml
我们发现它比原始 Ingress 有以下变化:• 注解中添加了两个额外的 NGINX 特定金丝雀注解。• Ingress 规则将有一条将后端指向金丝雀服务的规则。
随着 Rollout 逐步进行,canary-weight 注解将调整以匹配步骤的当前 setWeight。NGINX Ingress 控制器检查原始 Ingress、金丝雀 Ingress 和金丝雀权重注解,以确定在两个入口之间分配的流量百分比。
然后可以通过验证结果来判断是否继续还是终止。
如果继续使用如下命令,可以执行 promote 命令来将Rollout 推进到下一个步骤,这样就完成了金丝雀发布:
kubectl argo rollouts promote rollouts-demo
kubectl argo rollouts get rollout rollouts-demo
如果终止使用如下命令:
kubectl-argo-rollouts undo rollouts-demo --to-revision=1
kubectl argo rollouts get rollout rollouts-demo
kubectl argo rollouts abort rollouts-demo
kubectl argo rollouts get rollout rollouts-demo
但是我们可以看到Status是Degraded状态而并非Healthy状态,我们有必须要将其变成Healthy状态。最简单的办法就是执行如下命令重新发布一下版本:
kubectl argo rollouts set image rollouts-demo rollouts-demo=argoproj/rollouts-demo:yellow
kubectl argo rollouts get rollout rollouts-demo