istio中使用serviceentry结合egressgateway实现多版本路由

假设有一个外部服务,外部服务ip为:10.10.102.90,其中32033为v1版本,32034为v2版本。

现在需要把这个服务引入到istio中,使用egressgateway转发访问该服务的流量,并且需要实现多版本路由,使得header中x-version的值为v1的路由到v1版本,x-version的值为v2的路由到v2版本。

使用serviceentry引入该服务

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: gindemo-service-entry
spec:
  endpoints:
  - address: 10.10.102.90
    labels:
      version: v1
    ports:
      http: 32033
  - address: 10.10.102.90
    labels:
      version: v2
    ports:
      http: 32034
  hosts:
  - gindemo.test.ch
  location: MESH_EXTERNAL
  ports:
  - name: http
    number: 80
    protocol: HTTP
  resolution: STATIC

定义一个egress gateway:

bash 复制代码
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: gindemo-egressgateway
spec:
  selector:
    istio: egressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - gindemo.test.ch

创建一个dr,作为流量入口,接收网格内请求外部服务的流量:

注意!该dr需要在创建在istio-system命名空间下

bash 复制代码
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: egressgateway-for-gindemo
  namespace: istio-system
spec:
  host: istio-egressgateway-1-19-6.istio-system.svc.cluster.local
  subsets:
  - name: gindemo
  trafficPolicy:
    loadBalancer:
      simple: RANDOM

创建服务的dr,声明服务的多个版本:

bash 复制代码
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: gindemo-destination-rule
spec:
  host: gindemo.test.ch
  subsets:
  - labels:
      version: v1
    name: v1
  - labels:
      version: v2
    name: v2
  trafficPolicy:
    loadBalancer:
      simple: RANDOM

创建一个vs,定义服务路由规则:

bash 复制代码
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: direct-gindemo-through-egress-gateway
spec:
  gateways:
  - gindemo-egressgateway # 接收来自网关的流量
  - mesh # 接收来自网格内的流量
  hosts:
  - gindemo.test.ch
  http:
  - match: # 该match实现将来自网格内的流量,转发到egressgateway
    - gateways:
      - mesh 
      port: 80
    route:
    - destination:
        host: istio-egressgateway-1-19-6.istio-system.svc.cluster.local
        port:
          number: 80
        subset: gindemo
      weight: 100
  - match: # 该match实现将来自egressgateway的流量转发到serviceentry
    - gateways:
      - gindemo-egressgateway
      headers:
        x-version:
          exact: v1
    route:
    - destination:
        host: gindemo.test.ch
        subset: v1
  - match: # 该match实现将来自egressgateway的流量转发到serviceentry
    - gateways:
      - gindemo-egressgateway
      headers:
        x-version:
          exact: v2
      port: 80
    route:
    - destination:
        host: gindemo.test.ch
        subset: v2
相关推荐
运维&陈同学3 小时前
【Beats01】企业级日志分析系统ELK之Metricbeat与Heartbeat 监控
运维·elk·elasticsearch·云原生·kibana·heartbeat·metricbeat
有一个好名字15 小时前
zookeeper分布式锁模拟12306买票
分布式·zookeeper·云原生
Anna_Tong18 小时前
云原生大数据计算服务 MaxCompute 是什么?
大数据·阿里云·云原生·maxcompute·odps
运维&陈同学18 小时前
【模块一】kubernetes容器编排进阶实战之基于velero及minio实现etcd数据备份与恢复
数据库·后端·云原生·容器·kubernetes·etcd·minio·velero
liuxuzxx21 小时前
Istio-2:流量治理之简单负载均衡
云原生·kubernetes·istio
小扳1 天前
微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)
java·服务器·分布式·微服务·云原生·架构
aherhuo2 天前
kubevirt网络
linux·云原生·容器·kubernetes
catoop2 天前
K8s 无头服务(Headless Service)
云原生·容器·kubernetes
小峰编程2 天前
独一无二,万字详谈——Linux之文件管理
linux·运维·服务器·云原生·云计算·ai原生
小马爱打代码2 天前
云原生服务网格Istio实战
云原生