使用虚拟服务在 2 个 ClusterIP k8s 服务之间拆分流量

时间:2021-02-22 22:23:49

标签: kubernetes istio

我有两个在 Kubernetes 中运行的 Pod,这些 Pod 由 ClusterIP 服务公开,假设为 nginx-1nginx-2。我想创建一个虚拟服务 nginx-split,它将 75% 的流量路由到 nginx-1,将 25% 的流量路由到 nginx-2。我从文档中了解到我应该创建一个 VirtualService 定义文件:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx
spec:
  hosts:
  - nginx-split
  http:
  - route:
    - destination:
        host: nginx-1
      weight: 75
    - destination:
        host: nginx-2
      weight: 25

VirtualService 定义是不够的,也许我还应该创建一个 ServiceEntry。问题是我不知道如何为 nginx-split 定义服务条目,因为它只是虚拟的,不应解析为(一个)IP 地址。

1 个答案:

答案 0 :(得分:0)

TRAFFIC SPLITTING:How it works enter image description here

流量分流由two Istio Objects:

处理
  • VirtualService - 定义一组在寻址主机时应用的流量路由规则。
  • DestinationRule - 定义在路由发生后应用于服务流量的策略。

我们创建了一个 VirtualService,其中列出了带有 weight 的不同变体:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: service-a
spec:
  hosts:
    - service-a
  http:
    - route:
        - destination:
            host: service-a
            subset: v1
          weight: 80
        - destination:
            host: service-a
            subset: v2
          weight: 20

然后DestinationRule负责定义流量的目的地和流量策略:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: property-business-service
spec:
  host: property-business-service
  subsets:
    - name: v1
      labels:
        version: "1.0"
    - name: v2
      labels:
        version: "1.1"