使用Istio灰度发布

news/2025/3/17 16:55:56/文章来源:https://www.cnblogs.com/fsdstudy/p/18777161

目录
  • 灰度发布
    • 1. Istio
      • 1.1 Istio介绍
      • 1.2 Istio是如何工作的
    • 2. 安装Istio
      • 2.1 环境
      • 2.2 得到二进制文件
      • 2.3 安装istio
    • 3. 部署bookinfo模拟业务
      • 3.1 v1页面
      • 3.2 v2页面
      • 3.3 v3页面
    • 4. 模拟灰度发布
      • 4.1 业务版本v2
      • 4.2 灰度发布到v3版本
    • 5. Kiali
      • 5.1 安装普罗米修斯
      • 5.2 修改svc类型

灰度发布

什么叫灰度发布?

灰度发布也就是在我们发布新版本的业务的时候,不是直接将所有流量切到新版本上去,而是新旧版本共存,并且将流量逐步的从旧版本切换到新版本的过程叫做灰度发布

灰度发布的好处

灰度发布对比全量发布的好处是,先由一少部分用户体验新版本,观察新版本的情况,有没有出现bug,服务错误之类的问题,如果遇到了这种问题,可以直接将流量给切回旧版本,因为体验新版本的用户不是特别多,所以不会造成特别大的事故,而如果使用全量发布,等到发布完之后发现业务有bug,这时候所有在用的用户都受到了这个bug的影响,此时回退版本的影响肯定是大于灰度发布造成的影响的

1. Istio

1.1 Istio介绍

Istio 是一种开源服务网格,可透明地分层到现有的分布式应用程序上。 Istio 的强大功能提供了一种统一且更高效的方式来保护、连接和监控服务。 Istio 是实现负载均衡、服务到服务身份验证和监控的途径 - 几乎无需更改服务代码。它为您提供:

  • 使用双向 TLS 加密、强大的基于身份的身份验证和鉴权在集群中保护服务到服务通信
  • HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡
  • 使用丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制
  • 支持访问控制、限流和配额的可插入策略层和配置 API
  • 集群内所有流量(包括集群入口和出口)的自动指标、日志和链路追踪

1.2 Istio是如何工作的

Istio 使用代理来拦截您的所有网络流量,从而根据您设置的配置允许使用一系列应用程序感知功能。

控制平面采用您所需的配置及其对服务的视图,并动态地编程代理服务器,并根据规则或环境的变化对其进行更新。

数据平面是服务之间的通信。如果没有服务网格,网络就无法理解正在发送的流量,也无法根据流量类型、流量来源或目的地做出任何决策。

Istio 支持两种数据平面模式:

  • Sidecar 模式,它会与您在集群中启动的每个 Pod 一起部署一个 Envoy 代理,或者与在虚拟机上运行的服务一同运行。
  • Ambient 模式,它使用每个节点的四层代理,并且可选地使用每个命名空间的 Envoy 代理来实现七层功能。

2. 安装Istio

安装Istio之前我们需要有一个Kubetnetes集群,自行部署一个集群即可

我是用Istioctl方式去安装,也可以使用helm安装,自行查阅官方文档即可

2.1 环境

k8s版本 IP地址
1.28.2 192.168.200.156

2.2 得到二进制文件

由于二进制压缩包是在github上的,所以国内下载会很慢甚至是无法下载,所以我这里使用了我自己的github下载代理

[root@master ~]# wget https://github.030814.xyz/https://github.com/istio/istio/releases/download/1.25.0/istio-1.25.0-linux-amd64.tar.gz

等待下载结束,版本可以更换为自己想安装的版本

然后解压文件,并移动二进制文件到环境变量下

[root@master ~]# tar -zxvf istio-1.25.0-linux-amd64.tar.gz -C /opt
[root@master ~]# cd /opt/istio-1.25.0/
[root@master istio-1.25.0]# mv bin/istioctl /usr/local/bin/

2.3 安装istio

我们现在可以使用istioctl来安装了

[root@master istio-1.25.0]# cd
[root@master ~]# istioctl install --set profile=demo 

这里由于我的是学习环境,所以我安装的是demo,demo会安装所有的组件,如果是生产环境建议安装default,缺什么组件再自行安装即可,等待安装完成即可

❗ detected Calico CNI with 'bpfConnectTimeLoadBalancing=TCP'; this must be set to 'bpfConnectTimeLoadBalancing=Disabled' in the Calico configuration
This will install the Istio 1.25.0 profile "demo" into the cluster. Proceed? (y/N) y
✔ Istio core installed ⛵️                                                                                                                                     
✔ Istiod installed 🧠                                                                                                                                        
✔ Egress gateways installed 🛫                                                                                                                               
✔ Ingress gateways installed 🛬                                                                                                                              
✔ Installation complete 

出现这个就是安装完成了,我们可以查看一下pod

[root@master ~]# kubectl get pods -n istio-system 
NAME                                    READY   STATUS    RESTARTS      AGE
istio-egressgateway-6567d885cb-799dg    1/1     Running   0             51s
istio-ingressgateway-6688b98758-x7dsw   1/1     Running   0             51s
istiod-5f89f8b9ff-5dvjk                 1/1     Running   0             53s

这几个pod都running了说明已经没问题了

3. 部署bookinfo模拟业务

安装完成之后我们需要对某个命名空间开启sidecar的自动注入,因为sidecar会拦截流量并分流,如果我们没有开启这个那么istio是无法管理流量的走向的

[root@master ~]# kubectl label ns default istio-injection=enabled

接下来我们使用官方提供的bookinfo来模拟业务,因为bookinfo是由多个语言,并且每个业务也是由多个版本的,所以我们来模拟一下灰度发布

[root@master ~]# kubectl apply -f /opt/istio-1.25.0/samples/bookinfo/platform/kube/bookinfo.yaml 

接下来我们等待pod都运行

[root@master ~]# kubectl get pods 
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-649d7678b5-nh782       2/2     Running   0          6s
productpage-v1-5c5fb9b4b4-qgsjt   2/2     Running   0          6s
ratings-v1-794db9df8f-bj9bh       2/2     Running   0          6s
reviews-v1-7f9f5df695-h5jhp       2/2     Running   0          6s
reviews-v2-65c9797659-ld965       2/2     Running   0          6s
reviews-v3-84b8cc6647-mzzjc       2/2     Running   0          6s

所有的pod都是running并且ready都是2/2之后说明bookinfo就部署好了,接下来我们访问

[root@master ~]# kubectl apply -f /opt/istio-1.25.0/samples/bookinfo/platform/kube/productpage-nodeport.yaml
service/productpage configured

将productpage页面映射出去我们使用浏览器访问

[root@master ~]# kubectl get svc 
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
details       ClusterIP   10.101.159.198   <none>        9080/TCP         2m34s
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP          40h
productpage   NodePort    10.105.75.208    <none>        9080:31592/TCP   2m34s
ratings       ClusterIP   10.106.211.56    <none>        9080/TCP         2m34s
reviews       ClusterIP   10.110.28.147    <none>        9080/TCP         2m34s

这里可以看到映射出来的端口是31592,那我们到浏览器访问这个端口

这里我们就访问到了bookinfo的界面了,刚刚也说过了,它是由多个版本构成的,那么现在我们进行刷新页面

3.1 v1页面

3.2 v2页面

3.3 v3页面

这样就是3个版本的页面了,多进行刷新就可以看到了

4. 模拟灰度发布

4.1 业务版本v2

现在我们模拟业务版本是v2,然后需要使用灰度发布到v3版本,先来编写一个yaml文件,让所有的流量都走向v2

文件名为 v2.yaml

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:name: reviewsdr
spec:host: reviews                  # 指定reviews的svc地址,可以通过kubectl get svc得到subsets:- name: v1                     # 指定等会需要往带有哪些标签的pod上转发流量,这里是v1labels:version: v1- name: v2labels:version: v2- name: v3labels:version: v3
---
apiVersion: networking.istio.io/v1    
kind: VirtualService            # 创建虚拟服务
metadata:name: reviewvs 
spec:hosts: - reviews                    # 这里的hosts也是svc地址http:- route:- destination:host: reviewssubset: v2            # 指定v2版本

然后我们apply这个文件

[root@master istio]# kubectl apply -f v2.yaml 

回到浏览器刷新页面,现在你无论如何去刷新,他都是黑色的星星,也就是v2版本

4.2 灰度发布到v3版本

我们只需要对刚刚的yaml文件进行修改即可

[root@master istio]# vim v2-v3.yaml
[root@master istio]# cat v2-v3.yaml 
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:name: reviewvs
spec:hosts:- reviewshttp:- route:- destination:host: reviewssubset: v2weight: 90                   # v2的权重是90%- destination:host: reviewssubset: v3weight: 10                   # v3的权重是10%

现在根据我们定义的规则,就是会有10%的用户会看到v3的版本,也就是红星那个页面,接下来我们apply

[root@master istio]# kubectl apply -f v2-v3.yaml 
virtualservice.networking.istio.io/reviewvs configured

回到浏览器刷新页面,多刷新几次

你会看到有很多次是黑色星星,只有极少数是红星,这就是那极少部分用户所看到的页面,后续我们只需要更改刚刚的yaml文件里面的权重值即可,知道完全发布v3版本

5. Kiali

刚刚我们实现了灰度发布,但是我们看不到流量的走向,我想要可视化的界面,也是有的,那就是Kiali

5.1 安装普罗米修斯

Kiali是需要依赖于普罗米修斯采集到的数据的,所有我们需要先部署一个监控,但是部署也是非常的简单,我们之前下载的istio的包里面就有

[root@master ~]# cd /opt/istio-1.25.0/samples/addons/
[root@master ~]# kubectl apply -f .

由于我是采用的安装整个目录的yaml文件,所以会安装一些其他的组件,我们不管即可

[root@master addons]# kubectl get pods -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
grafana-58856dc744-2k8ds                1/1     Running   0          2m4s
istio-egressgateway-6567d885cb-799dg    1/1     Running   0          34m
istio-ingressgateway-6688b98758-x7dsw   1/1     Running   0          34m
istiod-5f89f8b9ff-5dvjk                 1/1     Running   0          34m
jaeger-6bf648bcdc-j4tjv                 1/1     Running   0          2m4s
kiali-c584b499b-h8xc4                   1/1     Running   0          2m3s
loki-0                                  0/2     Pending   0          2m3s
prometheus-7fb6d49999-hsxt7             2/2     Running   0          2m3s

我们可以看到普罗米修斯以及我们kiali界面都被安装好了并且running了,接下来我们访问图形化界面

5.2 修改svc类型

现在kiali的svc类型是clusterIP,集群外是无法访问的,所以我们需要将svc改为nodeport

[root@master addons]# kubectl edit -n istio-system svc kiali 

将这个地方原本的类型改为NodePort即可

然后我们查看端口访问

[root@master addons]# kubectl get svc -n istio-system  |grep kiali
kiali                  NodePort       10.106.227.72    <none>        20001:32239/TCP,9090:30962/TCP  

我们可以看到将pod的20001端口使用32239端口映射了,接下来我们访问32239即可

这个就是他的界面了,接下来我们点击旁边的第二个

然后选择命名空间

这个时候页面还没有任何的东西,是因为没有持续的流量,所以我们来写一个脚本让他一直发请求

[root@master addons]# watch -n 1 curl -o /dev/null -s -w %{http_code} localhost:31592/productpage

注意自己替换一个端口,回到浏览器

选择所展示的就是这样的了,我们来调整一些参数

将展示的参数给勾选一个,意思就是展示所分配的流量,可以看到大部分流量是在v2版本上的,有一少部分流量是在v3版本

因为我们设置的权重是90%和10%,但是他工作起来也并不可能一定就是10个人里面9个人是v2版本,1个人是v3版本,所以这里的流量分配会是在我们设置的数值附近浮动,而不是正好是我们设置的那个值,当然,也会出现就是我们设置的那个值的这种情况。这就是灰度发布的流程了

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

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

相关文章

304跳转如何避免

1.什么是304跳转 当浏览器发起请求时,如果资源(index.html或者js)没有改变(例如文件没有被修改),服务器就会返回 304 状态码,表示该资源自上次请求以来没有被修改过,客户端可以继续使用本地缓存的副本,而不需要重新下载资源。 2. 如何避免304跳转 2.1 如果是nginx代理# …

LiveGBS国标GB28181国标平台分布式集群部署 以及多服务器动态负载均衡的技术方案在智慧工地、平安城市、智慧交通、智慧城市、交通枢纽、跨区域联网监控视频平台等大型视频流媒体项目如何实现

@目录1、大型容灾GB28181国标流媒体服务1.1、需求背景1.2、高可用分布式方案2、方案详解2.1、 百万路视频接入2.2、几百上千路高并发请求播放2.3、信令服务主备方式 1、大型容灾GB28181国标流媒体服务 1.1、需求背景 大型视频监控平台项目的常见需求高并发 高可用性 容灾备份 跨…

变量、常量及其初始化和命名规范

变量:public class HelloWorld250316 { //实例变量 从属于对象,如果不自行初始化,这个类型的默认值 0 0.0 u000,布尔类型默认false //除了基本类型,其余的默认值都是null String name; int age; public static void main(String[] args) { int a=10; System.out.println(a…

必剪使用指南

必剪使用指南 目录必剪使用指南下载快捷键文件剪辑编辑显示标记下载 必剪官网:https://bcut.bilibili.cn/.快捷键 文件新建草稿:ctrl + n 保存草稿:ctrl + s 导入:ctrl + i 导出:ctrl + e 退出:ctl + q剪辑分割工具:c 选择工具:v 分割:x编辑复制:ctrl + c 剪切:ctrl…

python运算注意点

1、整除// 9//2得出为4,被除数在前。 取余% 9%2得出1 2、round()函数,表示四舍五入,奇进偶不进 例:round(3.5)为4 round(6.5)为6 3、赋值 多变量赋值,直接用,隔开。 赋值加运算(先运算再赋值,也就是先乘2*3=6,直接赋值给b)4、逻辑运算符有一种优化机制,短…

Bernoulli Equation

伯努利方程 伯努利方程并非一个独立的定律,而是在不同条件下由 Navier-Stokes 动量方程(式1)和能量方程(式2)推导而来的。 \[\rho\left(\frac{\partial u_{j}}{\partial t} + u_{i}\frac{\partial u_{j}}{\partial x_{i}}\right)=-\frac{\partial p}{\partial x_{j}}+\rho…

社区演讲-基于.NET 技术栈的研发过程管理和智能化探索

Hi all 2024年11月23日,我作为【项目管理实践探索者大会】专题讲师,给社区分享了主题《基于.NET 技术栈的研发过程管理和智能化探索》 现场参与人数:100+ 演讲议题介绍: 体系建设:如何设计一个合适的研发过程管理体系 平台提效:通过.NET技术构建任务驱动+流程驱动,释放研…

halcon 深度学习教程(二)halcon基于深度学习的OCR检测

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18777081深度学习教程目录如下,还在继续更新完善中 深度学习系列教程目录 本篇非常简单,但是非常好用的OCR识别,传统的OCR识别方法一大堆各种各样的操作,麻烦的要死。halcon 22版本开始支持深度学习OCR,并且…

[ SpringMVC ] SpringMVC如何通过是否有@RestController注解来判断返回ModelAndView还是Json

引言之前在面试的遇到面试官问我SpringMVC的执行流程,我那时候回答的是SpringMVC的DispatcherServlet的dodispatch方法找到ControllerMethod之后将返回值通过convert成Json返回响应体,事后想了一下回答的其实并不正确,因为SpringMVC之前学习的时候有使用ModelAndView返回视图,我…

从HR+AI到AI+HR,企业人力资源AI进程已过半

一、人力资源管理智能化应势而上,核心价值受企业管理层肯定 过往各项研究表明,AI 已经被广泛应用于企业经营的各个环节中。根据易路于2023 年发布的《AI 在企业人力资源中的应用白皮书1.0》(以下简称《白皮书1.0》),我们可以明确感受到:AI 已不同程度应用于招聘管理、员工…

multi-object tracking in the dark

创新点:构建LMOT数据集:开发了一种双摄像头系统,同步采集明暗视频帧,形成高度对齐的低光视频对,并提供高质量的多目标跟踪标注。该数据集包含大量城市户外场景视频,涵盖多种动态物体,为模型训练和评估提供了丰富的数据支持。 提出LTrack方法:引入自适应低通下采样模块(…

LGP11831_1 [UPTS 2025] 追忆 学习笔记

LGP11831_1 [UPTS 2025] 追忆 学习笔记 Luogu Link 前言 又幻想了……唉! 幻想自己场切这道题,最后标准分上升至 \(\text{598pts}\),翻掉了 \(\text{yyz}\),不至于一点脸不要。 本题解基本借鉴这篇题解。 题意简述 给定一个 \(n\) 点 \(m\) 边的简单有向图 \(G\),有 \(m\)…