前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >istio-in-action - 06 使用 DestinationRule Subset 进行路由分组(版本控制)

istio-in-action - 06 使用 DestinationRule Subset 进行路由分组(版本控制)

作者头像
老麦
发布2022-12-24 10:20:58
6360
发布2022-12-24 10:20:58
举报
文章被收录于专栏:Go与云原生Go与云原生

当一个程序并行发布多个版本的时候, 如 prod-v1 / prod-v2

代码语言:javascript
复制
kgd
    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    toolbox   1/1     1            1           3d22h
    prod-v1   1/1     1            1           16m
    prod-v2   1/1     1            1           16m
代码语言:javascript
复制
// 两个版本的测试结果, 仅定义为 version 不一致
{
  "data": {
    "Name": "istio in action",
    "Price": 300,
    "Reviews": null
  },
  "version": "v2.0.0"  //   "version": "v1.0.0" 
}

k8s Service 依旧实现最根本的 服务级别的 Selector。

代码语言:javascript
复制
---
# Service
apiVersion: v1
kind: Service
metadata:
  labels:
    app: prod
  name: svc-prod
  namespace: myistio
spec:
  ports:
  - name: 80-8080
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: prod
  type: ClusterIP

默认情况下会根据 VirtualService 的默认规则 轮询 到后端的所有服务。

使用 subset 实现路由控制

但是在一些特定的环境下,需要对路由或者流量进行精确的认为控制。这个时候就需要对后端服务进行 分组 处理。

这个时候就可以使用 istio 的 subset 功能。subset 的定义为 Service Version (服务版本), 产生的目的就是为了在持续集成场景中, 可以通过 路由、 请求头(Header)、权重等 等方式进行路由或流量控制,以便进行 A/B 测试、金丝雀测试等。

DestinationRule 服务分组

在 vs 使用 subset 的时候, 必须依赖 DestinationRule 控制器进行 后端服务的分组。

DR 通过 label 规则对后端进行服务分组。

这样当流量达到 envoy 的以后, 进一步根据 label-> version:v1 选择真是的后端服务。

代码语言:javascript
复制
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: dr-prod
spec:
  host: svc-prod
  subsets:
  - name: subset-groupv1
    labels:
      version: v1
  - name: subset-groupv2
    labels:
      version: v2

1. 使用 流量权重 实现分组

在 同一个 路由规则下, 可以使用 权重模式 , 将流量分发到不同的后端 subset 组中。

注意: 权重值的总和必须是 100 。

代码语言:javascript
复制
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: vs-prod
  namespace: myistio
spec:
  gateways:
    - istio-tangx-in
  hosts:
    - svc-prod
    - istio.tangx.in
  http:
  - name: "v1-subset"
    route:                  # 同一个 route 下面的两个 destination
    - destination:
        host: svc-prod
        subset: subset-groupv1     # subset 的值与 DestinationRule 中定义一致
      weight: 25
    - destination:
        host: svc-prod
        subset: subset-groupv2
      weight: 75

使用如下命令进行测试

代码语言:javascript
复制
ka -f istio-samples/06-dr-subset/
ka -f istio-samples/06-dr-subset/vs/03-subset-weight.yml

2. 使用 路由重写 实现分组

路由重写 只是路由分组其中一个小的分支。同样还可以使用 header, queryParams 参数。逻辑都是类似的。

在 VirtualService 配置中, 使用多个 route 规则, 将流量转发到不同的后端组。

代码语言:javascript
复制
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: vs-prod
  namespace: myistio
spec:
  gateways:
    - istio-tangx-in
  hosts:
    - svc-prod
    - istio.tangx.in
  http:
  - name: "v2-routes"      # 路由重写分组, 是针对不同的路由匹配规则
    match:
      - uri:
          prefix: "/v2/prod"    # 新增一个路由匹配规则, 只有 uri 满足 /v2/prod 才会访问 v2 版本的 pod
    rewrite:
      uri: "/prod"
    route:
    - destination:
        host: svc-prod
        subset: subset-groupv2
  - name: "default-routes"   # 可以说是默认分组
    route:
    - destination:
        host: svc-prod
        subset: subset-groupv1

使用如下命令进行测试

代码语言:javascript
复制
ka -f istio-samples/06/
ka -f istio-samples/06/vs/02-subset-rewrite-path.yml

流量的目的地址

这里总结一下, 无论是在 VirtualService 还是在 DestinationRule 中, 流量的目的地址都是 k8s service

注意: 这里的 k8s service 指的是在 istio 以外能满足 FQDN

代码语言:javascript
复制
---
# DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
spec:
  host: svc-prod            # 目的地址是 svc
  # ....


---
# VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
  http:
  - name: "default-routes"
    route:
    - destination:
        host: svc-prod      # 目的地址是 svc
        subset: subset-groupv1
  # .....
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用 subset 实现路由控制
  • DestinationRule 服务分组
    • 1. 使用 流量权重 实现分组
      • 2. 使用 路由重写 实现分组
      • 流量的目的地址
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档