istio实现灰度发布,A/B发布, Kiali网格可视化(二)

代码发布是软件开发生命周期中的一个重要环节,确保新功能和修复能够顺利上线。以下是几种常见的代码发布流程。在学习灰度发布之前。我们首先回忆下代码发布常用的几种方法。

A/B(蓝绿)发布

蓝绿部署是一种通过维护两套独立的环境(蓝环境和绿环境)来实现零停机时间发版的方法。当前版本(蓝)和新版本(绿)是完全独立的,在绿色环境通过验证后,流量被切换到绿色环境。

优点:对用户无感,是最安全的发布方式,业务稳定

缺点:需要两套系统,对资源要求比较高,成本特别高

img

滚动式发布

按批次停止老版本实例,启动新版本实例。滚动更新是指逐步替换系统中的旧版本实例,而不是一次性替换所有实例。这样可以保证在更新过程中,始终有一部分实例在服务用户。

优点

  • 平滑过渡,减少停机时间。
  • 节约资源,用户无感

缺点

  • 在某些情况下,可能会有部分实例同时运行不同版本,导致潜在的不一致问题。部署和回滚的速度慢
img

灰度(金丝雀)发布

根据比例将老版本升级,例如80%用户访问是老版本,20%用户访问是新版本。金丝雀发布是将新版本应用于生产环境中的少数实例,逐步将流量引入新版本。随着监控的稳定,逐渐扩大新版本的流量范围,直到所有流量都转向新版本。

优点

  • 能在真实环境中测试新版本,减少风险。
  • 可以通过监控和日志快速发现问题,并且迅速回滚。

缺点

  • 发布周期较长,逐步切换流量可能影响性能。
img

在现代微服务架构中,应用的更新和发布是一个高频且关键的操作。如何在不影响用户体验的前提下,安全、平稳地将新版本应用推送到生产环境,是每个开发者和运维团队必须面对的挑战。灰度发布(Gray Release)作为一种渐进式发布策略,能够有效降低发布风险。

在 Kubernetes 中,灰度发布可以通过多种方式实现,例如:

  • Deployment + Service:修改副本数,手动控制流量切换。
  • Ingress 注解:通过 Nginx Ingress Controller 的注解功能实现流量分割。
  • Istio:通过服务网格实现高级流量管理。

本文重点讲解在k8s中 基于Istio的灰度发布如何实现。

上传镜像到harbor仓库

[root@harbor.cherry.com docker-client]# docker login harbor.cherry.com
[root@worker232 ~]# docker push harbor.cherry.com/istio/busybox:1.36.1

灰度发布

流量管理之路由(权重路由模拟灰度发布)

使用Deployment控制器部署两个版本

[root@master231 istio]# cat 01-deploy-apps.yaml 
apiVersion: v1
kind: Namespace
metadata:name: cherry---apiVersion: apps/v1
kind: Deployment
metadata:name: apps-v1namespace: cherry
spec:replicas: 1selector:matchLabels:app: xiuxian01version: v1auther: cherrytemplate:metadata:labels:app: xiuxian01version: v1auther: cherryspec:containers:- name: c1ports:- containerPort: 80image: harbor.cherry.com/istio/busybox:1.36.1command: ["/bin/sh","-c","echo 'c1' > /var/www/index.html;httpd -f -p 80 -h /var/www"]
---apiVersion: apps/v1
kind: Deployment
metadata:name: apps-v2namespace: cherry
spec:replicas: 1selector:matchLabels:app: xiuxian02version: v2auther: cherrytemplate:metadata:labels:app: xiuxian02version: v2auther: cherryspec:containers:- name: c2ports:- containerPort: 80image: harbor.cherry.com/istio/busybox:1.36.1command: ["/bin/sh","-c","echo 'c2' > /var/www/index.html;httpd -f -p 80 -h /var/www"]

手动注入Istio-proxy

查看注入之前的标签
[root@master231 istio]# kubectl -n cherry get pod --show-labels 
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
apps-v1-67884c795b-256jd   1/1     Running   0          3m47s   app=xiuxian01,auther=cherry,pod-template-hash=67884c795b,version=v1
apps-v2-754f9b6f8-hx9s4    1/1     Running   0          3m47s   app=xiuxian02,auther=cherry,pod-template-hash=754f9b6f8,version=v2将Istio sidecar代理注入注入指定名称空间下
[root@master231 istio]# istioctl kube-inject -f 01-deploy-apps.yaml | kubectl -n cherry  apply -f -
namespace/cherry unchanged
deployment.apps/apps-v1 configured
deployment.apps/apps-v2 configured再次查看标签.注入istio之后。很明显pod数量也变成了两个。
[root@master231 istio]# kubectl -n cherry get pod --show-labels
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
apps-v1-77f9877969-2c54w   2/2     Running   0          38s   app=xiuxian01,auther=cherry,pod-template-hash=77f9877969,security.istio.io/tlsMode=istio,service.istio.io/canonical-name=xiuxian01,service.istio.io/canonical-revision=v1,version=v1
apps-v2-64bcbb594b-jbdqd   2/2     Running   0          38s   app=xiuxian02,auther=cherry,pod-template-hash=64bcbb594b,security.istio.io/tlsMode=istio,service.istio.io/canonical-name=xiuxian02,service.istio.io/canonical-revision=v2,version=v2

在这里插入图片描述

通过查看标签,部署的v1和v2他们version不同。但是auther是相同的。所以我们编写svc的时候。可以分别通过version关联不同版本的pod。使用auther同时关联两个pod

[root@master231 istio]# cat 02-svc-apps.yaml 
apiVersion: v1
kind: Service
metadata:name: apps-svc-v1namespace: cherry
spec:selector:#关联v1版本version: v1ports:- protocol: TCPport: 80targetPort: 80name: http---apiVersion: v1
kind: Service
metadata:name: apps-svc-v2namespace: cherry
spec:selector:#关联v2版本version: v2ports:- protocol: TCPport: 80targetPort: 80name: http---apiVersion: v1
kind: Service
metadata:name: apps-svc-allnamespace: cherry
spec:selector:#关联两个版本auther: cherryports:- protocol: TCPport: 80targetPort: 80name: http

查看svc详情详细,不难发现通过auther关联的pod。ep列表有两个ip

[root@master231 istio]# kubectl -n cherry describe svc
Name:              apps-svc-all
Namespace:         cherry
Labels:            <none>
Annotations:       <none>
Selector:          auther=cherry
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.200.95.30
IPs:               10.200.95.30
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.100.1.18:80,10.100.2.17:80
Session Affinity:  None
Events:            <none>Name:              apps-svc-v1
Namespace:         cherry
Labels:            <none>
Annotations:       <none>
Selector:          version=v1
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.200.99.39
IPs:               10.200.99.39
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.100.1.18:80
Session Affinity:  None
Events:            <none>Name:              apps-svc-v2
Namespace:         cherry
Labels:            <none>
Annotations:       <none>
Selector:          version=v2
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.200.229.240
IPs:               10.200.229.240
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.100.2.17:80
Session Affinity:  None
Events:            <none>

部署VirtualService。将来访问apps-svc-all-vs的时候。会代理apps-svc-v1和apps-svc-v2

[root@master231 istio]# cat 03-vs-apps-svc-all.yaml 
apiVersion: networking.istio.io/v1beta1
# apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: apps-svc-all-vsnamespace: cherry
spec:# 指定vs关联的后端svc名称hosts:- apps-svc-all# 配置http配置http:# 定义路由信息- route:# 定义目标- destination:host: apps-svc-v1# 指定权重weight: 90- destination:host: apps-svc-v2weight: 10

部署客户端测试

[root@master231 istio]# cat 04-deploy-client.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: apps-clientnamespace: cherry
spec:replicas: 1selector:matchLabels:app: client-testtemplate:metadata:labels:app: client-testspec:containers:- name: c1image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 command:- tail- -f- /etc/hosts

客户端注入Istio-proxy

[root@master231 istio]# istioctl kube-inject -f 04-deploy-client.yaml | kubectl -n cherry apply -f -
deployment.apps/apps-client configured

测试

[root@master231 istio]# kubectl -n cherry get pod
NAME                          READY   STATUS    RESTARTS   AGE
apps-client-98fddd875-hp259   2/2     Running   0          3m24s
apps-v1-77f9877969-2c54w      2/2     Running   0          104m
apps-v2-64bcbb594b-jbdqd      2/2     Running   0          104m[root@master231 istio]# kubectl exec -it apps-client-98fddd875-hp259 -n cherry -- sh
/ # while true; do curl http://apps-svc-all;sleep 0.1;done
c1
c1
c1
c1
c1
c2
c1
c1
c1
c1
c1
c2
c1
c1
c1
c1
c1
c1
c1
c1
c1
c1
c1
/ # while true; do curl http://apps-svc-all; sleep 0.1; done > 1.txt
/ # cat 1.txt | sort | uniq -c72 c110 c2

此时很明显。通过VirtualService资源定义svc权重比。已经达到了灰度发布的一个效果

A/B测试

流量管理之基于用户匹配(定向路由模拟A/B测试)

通过请求头信息。将版本精确打入到指定的区域。这里我们将header信息name是cherry的。全部打入v1版本。否则全部打入v2

[root@master231 istio]# cat 05-vs-apps-svc-all.yaml 
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:name: apps-svc-all-vsnamespace: cherry
spec:hosts:- apps-svc-allhttp:# 定义匹配规则- match:# 基于header信息匹配将其进行路由,header信息自定义即可。- headers:# 匹配用户名包含"cherry"的用户,这个KEY是咱们自定义的。username:# "eaxct"关键词是包含,也可以使用"prefix"进行前缀匹配。exact: cherryroute:- destination:host: apps-svc-v1- route:- destination:host: apps-svc-v2

测试

[root@master231 istio]# kubectl exec -it apps-client-98fddd875-hp259 -n cherry -- sh
/ #  while true; do curl -H  "username:cherry" http://apps-svc-all;sleep 0.1;done  # 添加用户认证的header信息
c1
c1
c1
c1
c1
c1
c1
^C
/ #  while true; do curl  http://apps-svc-all;sleep 0.1;done # 不添加用户认证
c2
c2
c2
c2
c2
c2
c2

网格可视化

Kiali 是一个为 Istio 提供图形化界面和丰富观测功能的 Dashboard 的开源项目,其名称源于希腊语,意思是望远镜。用户利用 Kiali 可以监测网格内服务的实时工作状态,管理Istio的网络配置,快速识别网络问题。但是从Istio 1.7开始,默认不安装控制面板Kiali等组件,所以需要用户自行单独安装控制面板Kiali及相关的组件。

[root@master231 istio-1.17.3]#  kubectl apply -f samples/addons[root@master231 istio-1.17.3]# kubectl apply -f samples/addons/extras

配置Kiali控制面板对外访问

查看kiali服务,发现其类型为ClusterIP,没有对外暴露端口,无法从外部访问:

[root@chon istio-1.9.0]# kubectl get service kiali -n istio-system

将类型改NodePort

[root@master231 istio-1.17.3]# kubectl -n istio-system edit svc kiali
...
spec:clusterIP: 10.200.5.137clusterIPs:- 10.200.5.137externalTrafficPolicy: ClusterinternalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- appProtocol: httpname: httpnodePort: 30003      #添加对外暴露端口port: 20001protocol: TCPtargetPort: 20001- appProtocol: httpname: http-metricsnodePort: 31367port: 9090protocol: TCPtargetPort: 9090selector:app.kubernetes.io/instance: kialiapp.kubernetes.io/name: kialisessionAffinity: Nonetype: NodePort    #修改网络类型
status:loadBalancer: {}

访问

http://10.0.0.233:30003/

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20843.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零搭建微服务项目Base(第7章——微服务网关模块基础实现)

前言&#xff1a; 在前面6章的学习中已经完成了服务间的调用实现&#xff0c;即各微服务通过nacos或eureka服务器完成服务的注册&#xff0c;并从nacos中拉取配置实现热更新。当某个服务接口需要调用其他服务时&#xff0c;通过feign定义接口&#xff0c;并通过注解配置服务名…

【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示

异常问题&#xff1a; 这个是在新版的pycharm中出现的&#xff0c;出现的问题&#xff0c;点击view后不全部显示&#xff0c;而是以...折叠显示 在setting中这么设置一下就好了&#xff1a; 解决办法&#xff1a; https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法&#xff08;Snow Geese Algorithm&#xff0c;SGA&#xff09;是2024年提出的一种新型元启发式算法&#xff0c;其灵感来源于雪雁的迁徙行为&#xff0c;特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

LearnOpenGL——高级OpenGL(下)

教程地址&#xff1a;简介 - LearnOpenGL CN 高级数据 原文链接&#xff1a;高级数据 - LearnOpenGL CN 在OpenGL中&#xff0c;我们长期以来一直依赖缓冲来存储数据。本节将深入探讨一些操作缓冲的高级方法。 OpenGL中的缓冲本质上是一个管理特定内存块的对象&#xff0c;它…

nodejs及搭建

java项目可以运行在tomcat服务器&#xff0c;开始完成前后端完全分离。前端有自己独立的工程。我们需 要把前端独立的工程运行起来。---运行在nodejs服务器下。 1.安装nodejs 检验是否安装过 node --version 2.安装npm java项目需要依赖jar&#xff0c;安装maven。 前端项目…

Jenkins插件管理切换国内源地址

安装Jenkins 插件时&#xff0c;由于访问不了国外的插件地址&#xff0c;会导致基本插件都安装失败。 不用着急&#xff0c;等全部安装失败后&#xff0c;进入系统&#xff0c;修改插件源地址&#xff0c;重启后在安装所需插件。 替换国内插件更新地址 选择&#xff1a;系统…

关于uniApp的面试题及其答案解析

我的血液里流淌着战意&#xff01;力量与智慧指引着我&#xff01; 文章目录 1. 什么是uniApp&#xff1f;2. uniApp与原生小程序开发有什么区别&#xff1f;3. 如何使用uniApp实现条件编译&#xff1f;4. uniApp支持哪些平台&#xff0c;各有什么特点&#xff1f;5. 在uniApp中…

2025年2月9日(数据分析_2)

散点图 from matplotlib import pyplot as plt from matplotlib import font_manager # 字体相关# 字体 font_path = r"C:\Windows\Fonts\msyh.ttc" my_font = font_manager.FontProperties(fname=font_path)x = list(range(31)) x2 = list(range(31, 62)) a3 = [11…

11.编写前端内容|vscode链接Linux|html|css|js(C++)

vscode链接服务器 安装VScode插件 Chinese (Simplified) (简体中⽂) Language Pack for Visual Studio CodeOpen in BrowserRemote SSH 在命令行输入 remote-ssh接着输入 打开配置文件&#xff0c;已经配置好主机 点击远程资源管理器可以找到 右键链接 输入密码 …

【插件】前端生成word 文件

文章目录 1、背景2、方式一&#xff1a;html-docx-js2.1 具体代码2.2 前端生成word文件的样式2.3 总结 3、方式二&#xff1a;pizzip docxtemplater3.1 具体代码3.2 前端生成word文件的样式3.3 总结 4、参考链接 1、背景 在实际开发中&#xff0c;业务需要&#xff0c;需要把数…

大道至简 少字全意 易经的方式看 缓存 mybatis缓存 rendis缓存场景 案例

目录 介绍 mybatis缓存 一级缓存 1.是什么 2.特点 3.场景 mybatis 二级缓存 1.是什么 2.特点 3.配置步骤 注意 一级缓存问题 二级缓存问题 扩展 1.MyBatis集成 Redis 2.直接使用Redis redis 缓存 一、String 字符串 二、Llst 列表 三、Hash 哈希 四、Set…

RocketMQ消息是如何储存的?

前言 之前有写过关于kafka的存储结构的文章。RocketMQ大部分是借鉴了Kafka的设计原理&#xff0c;但是副本集群机制和存储结构有些差异。看完本篇文章可以看看这篇。消息中间件之kafka RocketMQ 的消息存储机制是其高吞吐、高可用和高可靠性的关键。以下将介绍 RocketMQ 消息存…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

Coze扣子怎么使用更强大doubao1.5模型

最近&#xff0c;豆包刚刚发布了最新的doubao1.5系列模型&#xff0c;并且加量不加价。 在性能极大进步的情况下&#xff0c;价格还与之前一致。真是业界良心了。 在同样的价格下&#xff0c;肯定要使用性能更强大的模型嘛 于是我准备把所有的智能体和工作流切换到doubao1.5…

UEditorPlus v4.3.0 已知问题修复,表格自适应,全屏编辑优化

UEditor 是由百度开发的所见即所得的开源富文本编辑器&#xff0c;基于MIT开源协议&#xff0c;该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器&#xff0c;主要做了样式的定制&#xff0c;更…

【核心算法篇十四】《深度解密DeepSeek量子机器学习:VQE算法加速的黑科技与工程实践》

在经典计算机逼近物理极限的今天,量子计算正以指数级加速潜力颠覆传统计算范式。想象一下,一个需要超级计算机运算千年的化学分子模拟问题,用量子计算机可能只需几分钟——这就是DeepSeek团队在VQE(Variational Quantum Eigensolver)算法加速实践中创造的奇迹。根据,VQE作…

Hackthebox- Season7- Titanic 简记 [Easy]

简记 ip重定向到 http://titanic.htb,先添加hosts 收集子域名 wfuzz -c -u http://titanic.htb/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H Host:FUZZ.titanic.htb --hl 9 ******************************************************** * Wfu…

【C语言】C语言 哈夫曼编码传输(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 C语言 哈夫曼编码传输&#xff08;源码数据文件&am…

撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法

问题&#xff1a;控件重叠 分析原因&#xff1a;因为设置了最小大小&#xff0c;所以界面中的大小不会随窗口的变化而自动变化。 处理方案&#xff1a;修改mimumSize的宽度与高度为0&#xff0c;并设置sizePolicy为Expanding&#xff0c;让其自动伸缩。 结果展示&#xff08;自…

Leetcode - 周赛436

目录 一、3446. 按对角线进行矩阵排序二、3447. 将元素分配给有约束条件的组三、3448. 统计可以被最后一个数位整除的子字符串数目四、3449. 最大化游戏分数的最小值 一、3446. 按对角线进行矩阵排序 题目链接 本题可以暴力枚举&#xff0c;在确定了每一个对角线的第一个元素…