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
相关推荐
旦沐已成舟7 分钟前
K8S中修改apiserver地址
云原生·容器·kubernetes
AAA小肥杨3 小时前
探索K8s与AI的结合:PyTorch训练任务在k8s上调度实践
人工智能·pytorch·docker·ai·云原生·kubernetes
九皇叔叔6 小时前
Zookeeper 基础入门与应用场景解析
分布式·zookeeper·云原生
weixin_307779136 小时前
基于最小权限原则的云计算Amazon VPC多层应用安全架构设计
网络·安全·云原生·云计算·aws
weixin_307779138 小时前
软件演示环境动态扩展与成本优化:基于目标跟踪与计划扩展的AWS Auto Scaling策略
算法·云原生·云计算·aws
是Yu欸9 小时前
仓颉迁移实战:将 Node.js 微服务移植到 Cangjie 的工程化评测
微服务·云原生·开源·node.js·vim·gitcode·cangjie
hour_go10 小时前
DeepHunt微服务故障定位系统核心技术解析2
微服务·云原生·架构·deephunt
眠りたいです13 小时前
基于脚手架微服务的视频点播系统-脚手架开发部分(完结)elasticsearch与libcurl的简单使用与二次封装及bug修复
c++·elasticsearch·微服务·云原生·架构·bug
拾忆,想起17 小时前
Dubbo异步调用实战指南:提升微服务并发性能
java·服务器·网络协议·微服务·云原生·架构·dubbo
企鹅侠客1 天前
k8s之Headless浅谈
云原生·容器·kubernetes