当前位置: 首页 > news >正文

k8s学习--Traffic Shifting 流量接入

文章目录

  • 应用
    • 环境
    • 一、Argo rollouts安装
      • 1. 在Kubernetes集群中安装argo rollouts
      • 2.安装argo rollouts的kubectl plugin
      • 3. Argo-Rollouts Dashboard
    • 二、负载均衡器metallb部署
      • 1. 修改kube-proxy代理模式
      • 2. metallb部署
      • 3.IP地址池准备
      • 4.开启二层通告
    • 三、Traffic Shifting 流量接入
      • 1.服务代理ingress nginx部署
      • 2.获取应用YAML部署描述文件
      • 3.部署应用
      • 4.访问应用
      • 4.更新应用


应用

环境

虚拟机

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.yamlkubectl -n metallb-system get pod

在这里插入图片描述
等待一会,可通过查看描述信息跟踪pod的运行状态,长时间无法完成下载时,各节点重启docker
查看描述信息

kubectl describe pod pod名称

3.IP地址池准备

vim ippool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:name: ippoolnamespace: 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: examplenamespace: 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: 1strategy:canary:canaryService: rollouts-demo-canarystableService: rollouts-demo-stabletrafficRouting:nginx:stableIngress: rollouts-demo-stablesteps:- setWeight: 50- pause: {}revisionHistoryLimit: 2selector:matchLabels:app: rollouts-demotemplate:metadata:labels:app: rollouts-demospec:containers:- name: rollouts-demoimage: argoproj/rollouts-demo:blueports:- name: httpcontainerPort: 8080protocol: TCPresources:requests:memory: 32Micpu: 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: 80targetPort: httpprotocol: TCPname: httpselector:app: rollouts-demo---
apiVersion: v1
kind: Service
metadata:name: rollouts-demo-stable
spec:ports:- port: 80targetPort: httpprotocol: TCPname: httpselector: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: nginxrules:- host: www.test.com		# 对外发布的域名http:paths:- path: /pathType: Prefixbackend:service:name: rollouts-demo-stableport:number: 80

3.部署应用

kubectl apply -f rollout.yamlkubectl apply -f services.yamlkubectl 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

在这里插入图片描述

相关文章:

  • 【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88
  • ubuntu18.04 配置 mid360并测试fast_lio
  • C++ 算法教程
  • 深入理解指针(四)
  • 计算机图形学入门11:图形管线与着色器
  • fs模块(一)
  • Day07-06_13【CT】LeetCode手撕—1. 两数之和
  • Vue主要使用-03
  • mysql之数据聚合
  • 用python纯手写一个日历
  • 数字化校园:打造未来教育新风尚
  • 每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割
  • 分类预测 | Matlab实现基于Transformer多特征分类预测/故障诊断
  • Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包
  • 中文大数据训练的数据集
  • ComponentOne 2017 V2版本正式发布
  • CSS实用技巧
  • eclipse(luna)创建web工程
  • iOS 系统授权开发
  • Java方法详解
  • JS+CSS实现数字滚动
  • js对象的深浅拷贝
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • node-glob通配符
  • React16时代,该用什么姿势写 React ?
  • Spring声明式事务管理之一:五大属性分析
  • STAR法则
  • vue脚手架vue-cli
  • 力扣(LeetCode)21
  • 如何用vue打造一个移动端音乐播放器
  • 入手阿里云新服务器的部署NODE
  • 使用common-codec进行md5加密
  • 算法系列——算法入门之递归分而治之思想的实现
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • Semaphore
  • ​flutter 代码混淆
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # Apache SeaTunnel 究竟是什么?
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1) caustics\
  • (2)(2.10) LTM telemetry
  • (day6) 319. 灯泡开关
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十一)手动添加用户和文件的特殊权限
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Unity3DUnity3D在android下调试
  • ****三次握手和四次挥手
  • .net core控制台应用程序初识
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net环境下的缓存技术介绍