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-v1
  namespace: cherry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xiuxian01
      version: v1
      auther: cherry
  template:
    metadata:
      labels:
        app: xiuxian01
        version: v1
        auther: cherry
    spec:
      containers:
      - name: c1
        ports:
        - containerPort: 80
        image: harbor.cherry.com/istio/busybox:1.36.1
        command: ["/bin/sh","-c","echo 'c1' > /var/www/index.html;httpd -f -p 80 -h /var/www"]
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apps-v2
  namespace: cherry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xiuxian02
      version: v2
      auther: cherry
  template:
    metadata:
      labels:
        app: xiuxian02
        version: v2
        auther: cherry
    spec:
      containers:
      - name: c2
        ports:
        - containerPort: 80
        image: harbor.cherry.com/istio/busybox:1.36.1
        command: ["/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-v1
  namespace: cherry
spec:
  selector:
    #关联v1版本
    version: v1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    name: http

---

apiVersion: v1
kind: Service
metadata:
  name: apps-svc-v2
  namespace: cherry
spec:
  selector:
    #关联v2版本
    version: v2
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    name: http

---

apiVersion: v1
kind: Service
metadata:
  name: apps-svc-all
  namespace: cherry
spec:
  selector:
    #关联两个版本
    auther: cherry
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    name: 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-vs
  namespace: cherry
spec:
  # 指定vs关联的后端svc名称
  hosts:
  - apps-svc-all
  # 配置http配置
  http:
    # 定义路由信息
  - route:
      # 定义目标
    - destination:
        host: apps-svc-v1
      # 指定权重
      weight: 90
    - destination:
        host: apps-svc-v2
      weight: 10

部署客户端测试

[root@master231 istio]# cat 04-deploy-client.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apps-client
  namespace: cherry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: client-test
  template:
    metadata:
      labels:
        app: client-test
    spec:
      containers:
      - name: c1
        image: 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 -c
     72 c1
     10 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-vs
  namespace: cherry
spec:
  hosts:
  - apps-svc-all
  http:
    # 定义匹配规则
  - match:
      # 基于header信息匹配将其进行路由,header信息自定义即可。
    - headers:
        # 匹配用户名包含"cherry"的用户,这个KEY是咱们自定义的。
        username:
          # "eaxct"关键词是包含,也可以使用"prefix"进行前缀匹配。
          exact: cherry
    route:
    - 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.137
  clusterIPs:
  - 10.200.5.137
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - appProtocol: http
    name: http
    nodePort: 30003      #添加对外暴露端口
    port: 20001
    protocol: TCP
    targetPort: 20001
  - appProtocol: http
    name: http-metrics
    nodePort: 31367
    port: 9090
    protocol: TCP
    targetPort: 9090
  selector:
    app.kubernetes.io/instance: kiali
    app.kubernetes.io/name: kiali
  sessionAffinity: None
  type: NodePort    #修改网络类型
status:
  loadBalancer: {}

访问

http://10.0.0.233:30003/

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL日志undo log、redo log和binlog详解

MySQL 日志&#xff1a;undo log、redo log、binlog 有什么用&#xff1f; 一、前言 在MySQL数据库中&#xff0c;undo log、redo log和binlog这三种日志扮演着至关重要的角色&#xff0c;它们各自承担着不同的功能&#xff0c;共同保障了数据库的正常运行和数据的完整性。了解…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…

电力通信物联网应用,国密网关守护电力数据安全

电力国密网关是用于保护电力调度数据网路由器和电力系统的局域网之间通信安全的电力专用网关机&#xff0c;主要为上下级控制系统之间的广域网通信提供认证与加密服务&#xff0c;实现数据传输的机密性、完整性。 国密算法网关功能特点 身份认证&#xff1a;对接入的设备和用户…

overflow-x: auto 使用鼠标实现横向滚动,区分触摸板和鼠标滚动事件的方法

假设一个 div 的滚动只设置了 overflow-x: auto 我们发现使用鼠标的滚轮是无法左右滚动的&#xff0c;但是使用笔记本电脑的触摸板&#xff0c;或者在移动设备上是可以滚动的。所以我们需要兼容一下鼠标的横向滚动功能。 我们可以监控 wheel 事件&#xff0c;然后根据位置来计…

基于STM32单片机的智能蔬菜大棚温湿度监测系统设计

引言 在现代农业生产中&#xff0c;温湿度、光照强度和土壤湿度等环境因素对植物的生长起着至关重要的作用。智能蔬菜大棚正是基于这些因素&#xff0c;通过自动化控制和远程监控技术&#xff0c;实现对植物生长环境的精准管理&#xff0c;最终提升蔬菜的产量和质量。本文介绍…

【git-hub项目:YOLOs-CPP】本地实现05:项目移植

ok&#xff0c;经过前3个博客&#xff0c;我们实现了项目的跑通。 但是&#xff0c;通常情况下&#xff0c;我们的项目都是需要在其他电脑上也跑通&#xff0c;才对。 然而&#xff0c;经过测试&#xff0c;目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】&#xff1a; 精…

Python实战:Excel中文转拼音工具开发教程

在日常办公中&#xff0c;我们经常需要处理Excel文件&#xff0c;有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具&#xff0c;它可以自动将Excel文件中指定列的中文转换为拼音缩写。 C:\pythoncode\new\ConvertExcelcontentToPinyin…

新一代MPP数据库:StarRocks

文章目录 1.StarRocks简介2.StarRocks 在数据生态的定位3.StartRocks的使用场景3.1 实时数据仓库3.2 高并发查询3.3 日志与事件分析3.4 物联网&#xff08;IoT&#xff09;数据分析3.5 金融风控与实时监控3.6 数据湖查询加速3.7 A/B 测试与实验分析 4.StarRocks与MySQL比较4.1 …

利用 OpenCV 进行棋盘检测与透视变换

利用 OpenCV 进行棋盘检测与透视变换 1. 引言 在计算机视觉领域&#xff0c;棋盘检测与透视变换是一个常见的任务&#xff0c;广泛应用于 摄像机标定、文档扫描、增强现实&#xff08;AR&#xff09; 等场景。本篇文章将详细介绍如何使用 OpenCV 进行 棋盘检测&#xff0c;并…

kafka-保姆级配置说明(producer)

配置说明的最后一部分&#xff1b; ##指定kafka集群的列表&#xff0c;以“,”分割&#xff0c;格式&#xff1a;“host:port,host:port” ##此列表用于producer&#xff08;consumer&#xff09;初始化连接使用&#xff0c;server列表可以为kafka集群的子集 ##通过此servers列…

Windows 下 Ollama 安装deepseek本地模型

Windows 下 Ollama 安装deepseek本地模型 安装 Ollama 下载 Ollama 下载链接&#xff1a;https://ollama.org.cn/download/windows 下载完成后&#xff0c;按照提示进行安装。 安装过程 安装完成后&#xff0c;安装页面会自动关闭&#xff0c;这是正常现象。 接下来&#…

Java面试——Tomcat

优质博文&#xff1a;IT_BLOG_CN 一、Tomcat 顶层架构 Tomcat中最顶层的容器是Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个Server可以包含至少一个Service&#xff0c;用于具体提供服务。Service主要包含两个部分&#xff1a;Connector和…

MySql面试宝典【刷题系列】

文章目录 一、Mysql 的存储引擎 myisam 和 innodb 的区别。二、MySQL数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f;三、对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题&#xff1f;四、锁的优化策略…

图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF

将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中&#xff0c;我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题&#xff1a; Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…

【含开题报告+文档+PPT+源码】基于springboot加vue 前后端分离的校园新闻审核发布管理系统

开题报告 本研究旨在设计并实现一套基于SpringBoot后端框架结合Vue前端技术的校园新闻发布系统&#xff0c;该系统面向学生用户群体提供了全面的功能服务。学生用户通过身份验证登录后&#xff0c;能够便捷高效地获取校园内的各类新闻资讯&#xff0c;实时了解校内动态。系统不…

Spring BOOT 启动参数

Spring BOOT 启动参数 在Java Web的开发完成后&#xff0c;以前我们都会打包成war文件&#xff0c;然后放大web容器&#xff0c;比如tomcat、jetty这样的容器。现在基于SpringBoot开发的项目&#xff0c;我们直接打包成jar文件&#xff0c;基于内嵌的tomcat来实现一样的效果。…

探索无网用Deepseek+qwen来助力Solidworks二次开发

在本教程中&#xff0c;我们将详细介绍如何在本地环境中使用 DeepSeek 和 Qwen 模型&#xff0c;结合 AnythingLLM&#xff0c;构建一个用于 SolidWorks 二次开发的私有化智能知识库。 目录 前言 环境准备 2.1 安装 Ollama 2.2 安装 Docker Desktop DeepSeek 本地部署 3.1…

在nodejs中使用ElasticSearch(一)安装,使用

使用docker安装ElasticSearch和Kibana 1&#xff09;创建相应的data文件夹和子文件夹用来持久化ElasticSearch和kibana数据 2&#xff09;提前创建好elasticsearch配置文件 data/elasticsearch/config/elasticsearch.yml文件 # Elasticsearch Configuration # # NOTE: Elas…

Jenkins整合Jmeter实现接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改j…

宇树科技13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 Humanoid 100清单清单中…