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
相关推荐
jerry6092 分钟前
LLM笔记(六)线性代数
笔记·学习·线性代数·自然语言处理
ghost1436 分钟前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
Yan_ks33 分钟前
计算机组成原理——数据的表示
学习
freellf1 小时前
go语言学习进阶
后端·学习·golang
真的想上岸啊1 小时前
学习51单片机02
嵌入式硬件·学习·51单片机
小刘要努力呀!1 小时前
嵌入式开发学习(第二阶段 C语言基础)
c语言·学习·算法
圈圈编码2 小时前
MVVM框架
android·学习·kotlin
Akamai中国3 小时前
分布式AI推理的成功之道
人工智能·分布式·云原生·云计算·云服务·云平台·云主机
川石教育3 小时前
测试工程师如何学会Kubernetes(k8s)容器知识
云原生·容器·kubernetes·kubernetes容器·kubernetes教程
iRayCheung4 小时前
Kind方式部署k8s单节点集群并创建nginx服务对外访问
nginx·kubernetes·kind