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
相关推荐
Nu11PointerException2 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
南猿北者4 小时前
docker容器
docker·容器
@小博的博客5 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
YCyjs6 小时前
K8S群集调度二
云原生·容器·kubernetes
Hoxy.R6 小时前
K8s小白入门
云原生·容器·kubernetes
南宫生6 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步6 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope7 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen7 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)7 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习