k8s学习--Traffic Shifting 流量接入


应用

环境

虚拟机

Ip主机名cpu内存硬盘
192.168.10.11master012cpu双核4G100G
192.168.10.12worker012cpu双核4G100G
192.168.10.13worker022cpu双核4G100G

版本 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

在这里插入图片描述

  • 32
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值