使用Istio灰度发布
灰度发布
什么叫灰度发布?
灰度发布也就是在我们发布新版本的业务的时候,不是直接将所有流量切到新版本上去,而是新旧版本共存,并且将流量逐步的从旧版本切换到新版本的过程叫做灰度发布
灰度发布的好处
灰度发布对比全量发布的好处是,先由一少部分用户体验新版本,观察新版本的情况,有没有出现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上转发流量,这里是v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
---
apiVersion: networking.istio.io/v1
kind: VirtualService # 创建虚拟服务
metadata:
name: reviewvs
spec:
hosts:
- reviews # 这里的hosts也是svc地址
http:
- route:
- destination:
host: reviews
subset: 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:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
weight: 90 # v2的权重是90%
- destination:
host: reviews
subset: v3
weight: 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版本,所以这里的流量分配会是在我们设置的数值附近浮动,而不是正好是我们设置的那个值,当然,也会出现就是我们设置的那个值的这种情况。这就是灰度发布的流程了
使用Istio灰度发布的更多相关文章
- 干货分享|使用 Istio 实现灰度发布
Kubernetes 作为基础平台,提供了强大的容器编排能力.但是在其上部署业务和服务治理上,仍然会面对一些复杂性和局限性.在服务治理上,已经有许多成熟的 ServiceMesh 框架用于扩充其能力, ...
- 如何用istio实现应用的灰度发布
Istio为用户提供基于微服务的流量治理能力.Istio允许用户按照标准制定一套流量分发规则,并且无侵入的下发到实例中,平滑稳定的实现灰度发布功能. 基于华为云的Istio服务网格技术,使得灰度发布全 ...
- k8s+istio:流量控制之灰度发布
通过Kubernetes+Istio的流量控制实现灰度发布,主要演示通过流量权重实现蓝绿,通过http自定义头实现金丝雀 准备环境 k8s和istio不想自己装的话可以在云上买个按量付费集群,用完即删 ...
- Istio 太复杂?KubeSphere基于Ingress-Nginx实现灰度发布
在 Bookinfo 微服务的灰度发布示例 中,KubeSphere 基于 Istio 对 Bookinfo 微服务示例应用实现了灰度发布.有用户表示自己的项目还没有上 Istio,要如何实现灰度发布 ...
- Istio最佳实践:在K8s上通过Istio服务网格进行灰度发布
Istio是什么? Istio是Google继Kubernetes之后的又一开源力作,主要参与的公司包括Google,IBM,Lyft等公司.它提供了完整的非侵入式的微服务治理解决方案,包含微服务的管 ...
- idou老师教你学Istio 18 : 如何用istio实现应用的灰度发布
Istio为用户提供基于微服务的流量治理能力.Istio允许用户按照标准制定一套流量分发规则,并且无侵入的下发到实例中,平滑稳定的实现灰度发布功能. 基于华为云的Istio服务网格技术,使得灰度发布全 ...
- 基于 Istio 与 Kubernetes 对应用进行灰度发布与 Tracing
灰度发布,是指在黑与白之间,能够平滑过渡的一种发布方式.通俗来说,即让产品的迭代能够按照不同的灰度策略对新版本进行线上环境的测试,灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以对新版本进行测试 ...
- 【从小白到专家】收官!Istio技术实践之九:路由控制与灰度发布
本期是Istio技术实践专题的最后一个模块,主题是Istio的路由控制与灰度发布.上一期我们讲到,虚拟服务(Virtual Service)以及目标规则(Destination Rule)是 Isti ...
- 基于 Istio 的灰度发布架构方案实践之路
作者:京东物流 赵勇萍 1. 背景介绍 灰度发布,又名金丝雀发布,是指能够平滑过渡的一种发布方式.基于系统稳定性和快速业务迭代的综合考虑,业务应用开发团队采取了新版本服务灰度上线的方式,即新版本服务并 ...
- 采用轻量ServiceMesh实现灰度发布的实践
软件总会有缺陷的,解决问题的同时往往会引入新的问题,关键是看这些问题是否在我们的控制范围内,“灰度发布”就是让问题受控的方法之一. 前言 我们的 CTO 经常说:“研发团队最首要的任务是提供稳定的服务 ...
随机推荐
- Qt编写地图综合应用30-世界地图
一.前言 世界地图也属于区域地图的一种,最开始做项目的时候只有国内的地图需求,后面有个客户他们的产品是面向国际市场,所以在大屏展示的时候,必须展示一张世界地图,所有箭头动态流向中国,当然这些都要离线使 ...
- 网络编程入门如此简单(四):一文搞懂localhost和127.0.0.1
本文由萤火架构分享,原题"localhost和127.0.0.1的区别是什么?",原文链接"juejin.cn/post/7321049446443417638" ...
- 零基础快速入门WebRTC:基本概念、关键技术、与WebSocket的区别等
本文引用自Hussein Nasser的两个视频分享,原文内容由卢冰聪翻译整理,即时通讯网收录时有大量修订和重新排版. 1.内容概述 本文是专为学习开源实时音视频工程WebRTC的入门者编写的速成指南 ...
- 即时通讯技术文集(第11期):IM通信格式的选型及Protobuf专题 [共16篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第11 期. [- 1 -] 如何选择即时通讯应用的数据传输格式 [链接] http://www. ...
- OpenMMLab AI实战营 第四课笔记
OpenMMLab AI实战营 第四课笔记 目录 OpenMMLab AI实战营 第四课笔记 目标检测与MMDetection 1.什么是目标检测 1.1 目标检测的应用 1.1.1 目标检测 in ...
- JS播放m3u8
JS播放m3u8: 利用 hls.min.js <!DOCTYPE html> <html> <head> <title>HLS Video Playb ...
- Storm基本概念
storm简介 场景 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索场景中的例子,当一个卖家发布了一条宝 ...
- ctfshow--红包一 ob混淆
上来是一段混淆的ob混淆的js代码,还会有个setinterval无限debugger反调试 点击查看代码 function _0x51ba() { const _0x4b06d7 = ['paddi ...
- Go语言【Gin框架】:JSON、AsciiJSON、PureJSON和SecureJSON的区别
在Go语言中,JSON.AsciiJSON.PureJSON 和 SecureJSON 是Gin框架用于发送JSON响应的方法. 1. c.JSON 功能:将提供的数据序列化为标准的JSON格式,并将 ...
- 玩转云端 | 网络也i人?咋变显眼包?天翼云AccessOne边缘接入来了!
你是具有"社牛"属性的"e人" 还是"社恐"属性的"i人"? 在年轻群体中火起来的 "MBTI人格测试&quo ...