istio完成金丝雀、灰度发布

本文介绍如何在已安装Istio的Kubernetes集群上实现简单灰度发布。通过自定义部署标签、配置svc、DestinationRule和VirtualService,实现新老版本流量按比例分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

1.已有集群已经安装istio
2.已经了解灰度的远离
3.对istio的概念有大致了解,比如已经完成官网的初始事例:https://istio.io/docs/examples/bookinfo/

前言

其实istio的组件很多,据我了解,各大云厂商大多是会自己用golang去自定义一些组件。所以如果要做灰度,金丝雀等,最好是直接使用大型云厂商的容器云服务。
本文主要介绍在原生的k8s集群只装了istio的情况下如何实现简介的灰度

项目背景

首先我们的项目必须是依赖deployment来实现pod的,很多老的发布方式可能会用k8s的rc来发布项目,这与istio的理念不合适。

引入概念

Gateway

Gateway:流量的入口,用来设定域名等,取代ingress
注:如果原来线上就是用的ingress,则不建议引入istio,istio必须依赖gateway来取代ingress,线上的ingress如果要替换成gateway,免不了的是大量的工作量及线上无法访问的风险。

DestinationRule:

绑定svc
根据deployment的label标签来指定subset(版本)

VirtualService:

gateway的下一层,可以绑定gateway,以及svc,把控svc的流量,打到不同的subset(版本)中,也可以设置比重,是核心

实现流程图

在这里插入图片描述

charts编写

deployments(老版本)

关键点在label,可以自定义!我这边叫canary,大家可以随意,后面subset标实出来就好

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: [deployment的名字]
  labels:
    app: [deployment的名字] #打个标签
    canary: "false" #关键点在这!自定义的标签我给一个false,用来表示老版本
spec:
  replicas: 1 #副本数
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: [deployment的名字]
    spec:
      containers:
      - name: [容器的名字]
        image: [镜像]
        ...
        #以下就省略了,什么健康检查啥的,根据要求定义
deployments(金丝雀,新版本)

新版本的label一定要跟老版本的不一样,后面才能用subset根据label不同来给流量

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: [deployment的名字]
  labels:
    app: [deployment的名字] #打个标签
    canary: "true" #关键点在这!自定义的标签我给一个false,用来表示老版本
spec:
  replicas: 1 #副本数
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: [deployment的名字]
    spec:
      containers:
      - name: [容器的名字]
        image: [镜像]
        ...
        #以下就省略了,什么健康检查啥的,根据要求定义
svc

关键点在selector,选择器,也就说所有的流量都会通过svc打到有app标签的deployment里面

apiVersion: v1
kind: Service
metadata:
  name: [svc的名字]
  labels:
    app: [svc的名字]
spec:
  ports:
  - port: 8080
    name: http
    targetPort: 8080
  selector:
    app: [deployment的label里的标签]#这里很关键,svc绑定的是所有app标签等于deployment的name的deployment
DestinationRule

关键点在于两点:
1.绑定svc,名字不要错
2.新建subset,根据label绑定到我们之前的deployment

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: [DestinationRule的名字]#随便取,后续没有绑定关系
spec:
  host: [svc的名字]#这里很关键,这里绑定了svc
  subsets: #最关键的标签
  - name: production #subset的名字
    labels:
      canary: "false" #subset要绑定的deployment的标签!,指定要到老版本
  - name: canary #subset的名字
    labels: 
      canary: "true" #subset要绑定的deployment的标签!,指定要到新版本

现在我们已经新建了两个不同版本的subset,每个subset绑定了不同的deployment

VirtualService

两个点:
1.绑定svc,名字不要错
2.绑定subset,同时指定流量

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: [VirtualService的名字]
spec:
  http:
    route:
    - destination:
        host: [svc的名字]#很关键,绑定svc
        name: production #很关键,绑定前面定义的subset
        port:
          number: 8080
        weight: 90 #很关键,把90%的流量打到老版本
    - destination:
        host: [svc的名字]#很关键,绑定svc
         name: canary #很关键,绑定前面定义的subset
         port:
           number: 8080
         weight: 10 #很关键,把10%的流量打到新版本

至此所有svc的流量已经会按照比例分配至新老版本了

yaml中的绑定关系示意图

在这里插入图片描述
注:如果是通过k8s原生ingress来访问,以上都没生效,必须使用gateway才行

后续灰度

修改VirtualService的流量百分比,直到全部打至新版本,测试完成后删除老版本的deployments。

### 金丝雀发布灰度发布的区别 金丝雀发布(Canary Release)和灰度发布(Gray Release)是两种常见的渐进式软件部署策略,它们都旨在通过逐步上线新版本来降低全量发布带来的风险。然而,这两种策略在实现方式、流量控制逻辑以及适用场景上存在显著差异。 #### 核心定义与目标 **金丝雀发布**是一种将新版本先部署到一小部分节点或用户上的策略,这部分节点被称为“金丝雀”。这些节点会接收一部分真实的生产流量用于验证新版本的稳定性。如果监控指标显示新版本运行良好,则可以逐步扩大部署范围,直至完成全量更新。其核心目标是通过最小化影响范围来验证新版本的可靠性[^1]。 **灰度发布**则更侧重于基于特定规则(如用户ID、地理位置、设备类型等)将一部分用户定向到新版本的服务上。这种方式允许团队根据不同的维度对用户进行分组测试,从而评估新功能或变更对特定用户群体的影响。灰度发布的目标不仅是验证技术层面的稳定性,还包括业务层面的效果测试,例如用户体验改善或转化率提升[^3]。 #### 实现方式 在**金丝雀发布**中,通常采用的是按比例分配流量的方式。例如,从一个服务器开始,仅让该服务器运行新版本代码,并让它处理一小部分请求。随着测试进展顺利,这个比例会被逐渐增加直到所有服务器都被更新为新版本。这种方法依赖于负载均衡器的能力来精确控制流量分配。 相比之下,**灰度发布**可能涉及更加复杂的路由规则设定。它可以根据预设条件(比如HTTP头信息、Cookie值或者其他自定义参数)决定哪些请求应该被转发给新版本服务。这种灵活性使得灰度发布非常适合用来做A/B测试或多变量分析,以支持数据驱动的产品决策过程。 #### 技术栈支持 - **Istio** 提供了强大的细粒度流量管理能力,非常适合实施灰度发布策略。它可以基于各种属性定义非常精细的路由规则。 - **Argo Rollouts** 是专门为实现渐进式交付而设计的工具,特别适合执行金丝雀部署流程。 - **Spinnaker** 支持跨多个云平台的操作编排,在蓝绿部署方面表现出色,但也可以与其他策略结合使用。 #### 风险防控机制 两者都具备快速回滚的能力,但具体操作有所不同: - 在**金丝雀发布**过程中,一旦发现问题,可以直接停止向新版本发送更多流量甚至完全关闭新版本实例,这通常可以在秒级内完成。 - 对于**灰度发布**来说,调整路由规则即可迅速改变流量分布,同样能够达到即时响应问题的目的。 #### 适用场景 - **金丝雀发布**适用于需要高度可靠性的关键系统升级,尤其是在没有明确用户细分需求的情况下。 - **灰度发布**更适合那些希望通过特定用户群体先行试用新产品特性或者想要收集不同用户段反馈的企业应用环境。 综上所述,虽然金丝雀发布灰度发布都是为了减少直接全量上线所带来的潜在风险,但是选择哪一种方法取决于具体的业务需求和技术考量。理解两者的区别有助于更好地规划软件发布策略,确保平稳过渡的同时也能有效收集反馈优化产品。 ```yaml # 示例:使用 Istio 进行灰度发布的 VirtualService 配置片段 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: my-service spec: hosts: - my-service.example.com http: - route: - destination: host: my-service subset: v1 weight: 90 - destination: host: my-service subset: v2 weight: 10 ``` ```yaml # 示例:使用 Argo Rollouts 的金丝雀部署配置片段 apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: my-rollout spec: replicas: 5 strategy: canary: steps: - setWeight: 10 - pause: {duration: 60} - setWeight: 20 - pause: {duration: 60} ... - setWeight: 100 template: spec: containers: - name: my-container image: my-image:latest ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值