在 Kuma/Envoy 中定义拆分交通路线

Defining a split traffic route in Kuma/Envoy

我正在尝试使用 Kuma 创建服务网格的演示,但在查看文档中的 example 时,我对如何配置流量流量拆分感到困惑。我有两个版本的微服务,它们 return 不同的结果取决于 Kubernetes 配置中定义的环境变量。与 pods 关联的服务由其配置配置使用哪个 pod(不确定这是否是正确的方法):

apiVersion: v1
kind: Pod
metadata:
  name: dntapi-mil
  namespace: meshdemo
  labels:
    uservice: dntapi
    format: military
spec:
  containers:
  - name: dntapi
    image: meshdemo:dntapi
    ports:
    - name: http
      containerPort: 4000
    env:
      - name: MILITARY
        value: "true"

---

apiVersion: v1
kind: Pod
metadata:
  name: dntapi-std
  namespace: meshdemo
  labels:
    uservice: dntapi
    format: standard
spec:
  containers:
  - name: dntapi
    image: meshdemo:dntapi
    ports:
    - name: http
      containerPort: 4000
    env:
      - name: MILITARY
        value: "false"

---

apiVersion: v1
kind: Service
metadata:
  name: dntapi
  namespace: meshdemo
spec:
  selector:
    uservice: dntapi
    format: military
  ports:
  - protocol: TCP
    port: 4000
    targetPort: 4000

如果我更改服务上的选择器,这从纯粹的 K8s 角度来看是有效的,但查看拆分流量的 Kuma 示例:

  conf:
    split:
      - weight: 90
        destination:
          kuma.io/service: redis_default_svc_6379
          version: '1.0'
      - weight: 10
        destination:
          kuma.io/service: redis_default_svc_6379
          version: '2.0'

当与服务关联时,“版本”指的是什么(我不得不承认我不明白为什么会有两个具有相同标识符的服务)。这些是 K8s 选择器吗?

我应该补充一点,当我使用 kuactl 检查服务时,我看到这个微服务有两个,一个没有端口名称:

dntapi-std_meshdemo_svc          Online   1/1
dntapi_meshdemo_svc_4000         Online   1/1

提前致谢。

更改您的服务定义以仅使用两种工作负载变体共有的标签(看起来应该是 uservice: dntapi)。然后在 Kuma TrafficRoute 目标中使用 format 标签作为“标签”,就像示例使用 version 标签(is/can 直接从 Kubernetes 标签派生)一样。这将允许您控制发送到标记为 format: standard 的 Pods 的流量百分比以及发送到标记为 format: military.

的 Pods 的流量百分比。

参见 https://github.com/kumahq/kuma-demo/tree/master/kubernetes 的另一个例子。向下滚动到“流量路由”部分;该示例完全符合我上面的描述。