k8s学习--Traffic Shifting 流量接入

文章目录


应用

环境

虚拟机

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修改为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

等待一会,可通过查看描述信息跟踪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
相关推荐
虾球xz39 分钟前
游戏引擎学习第55天
学习·游戏引擎
oneouto1 小时前
selenium学习笔记(二)
笔记·学习·selenium
sealaugh321 小时前
aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发
笔记·学习·aws
炭烤玛卡巴卡1 小时前
学习postman工具使用
学习·测试工具·postman
thesky1234562 小时前
活着就好20241224
学习·算法
蜗牛hb2 小时前
VMware Workstation虚拟机网络模式
开发语言·学习·php
汤姆和杰瑞在瑞士吃糯米粑粑2 小时前
【C++学习篇】AVL树
开发语言·c++·学习
虾球xz2 小时前
游戏引擎学习第58天
学习·游戏引擎
奶香臭豆腐3 小时前
C++ —— 模板类具体化
开发语言·c++·学习
波音彬要多做4 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法