首页 > 解决方案 > Istio ServiceEntry 和 VirtualService 重定向到主机

问题描述

该场景有 2 个 kubernetes 集群,配置了 Istio 复制控制平面,并在 kube-dns 中为 .global 区域转发。来自原始 pod 的请求在两个集群中的命名必须一致,这意味着不应使用直接来自原始 pod 的“.global”的用法。

考虑到这一点,我们的想法是让集群 1 中的原始 pod (bar-1.namespace1) 到达 (foo-1.namespace2),同时让 istio 将“foo-1.namespace2”的流量重定向到“ foo-1.namespace2.global”,因此它可以被指向第二个集群的 ServiceEntry 拾取。

现在,这是可行的,但只是因为当尝试访问“foo-1.namespace2”时,pod 中的 resolv.conf 中的配置将使用“.global”自动完成调用,但这是一种直接访问资源而不是直接访问资源的方法“失败”是可取的。

想法是有这个工作流程:

  1. bar-1.namespace1 tris 到达 foo-1.namespace2
  2. 与“foo-1.namespace2”主机匹配的 ServiceEntry,因此该名称存在于集群 1 中。
  3. 与“foo-1.namespace2”匹配的 VirtualService,因此它可以路由到不同的目的地,即“foo-1.namespace2.global”
  4. 匹配“foo-1.namespace2.global”的 ServiceEntry,它实际上负责向集群 2 发送流量。

我不能让这个逻辑按预期工作,因为点“2”和“3”如果存在的话似乎没有任何区别。

此时,我可以在集群之间进行通信,而无需在 pod 内使用“.global”,但这仅仅是因为“.global”是 pod /etc/resolv.conf 中的搜索域。所以第“4”点按预期工作,只是交通如何到达那里不好。

当前的配置是这样的:

ServiceEntry 的意思是“接听”电话,所以我没有收到“找不到主机”错误。

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: alias-foo-1.namespace2
  namespace: namespace1
spec:
  hosts:
  - foo-1.namespace2
  location: MESH_INTERNAL
  ports:
  - name: cockroachdb-grpc
    number: 26257
    protocol: TCP
  - name: cockroachdb-http
    number: 8080
    protocol: http
  resolution: DNS

VirtualService 旨在将目标转换为名称中带有“.global”的目标。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: redirect-foo-1.namespace2
  namespace: namespace1
spec:
  hosts:
  - foo-1.namespace2
  http:
  - route:
    - destination:
        host: foo-1.namespace2.global
    rewrite:
      authority: foo-1.namespace2.global

实际将流量发送到第二个集群的 ServiceEntry。这是有效的。

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: foo-1.namespace2-global
  namespace: namespace1
spec:
  hosts:
  - foo-1.namespace2-global
  location: MESH_INTERNAL
  ports:
  - name: cockroachdb-http
    number: 8080
    protocol: HTTP
  - name: tcp-cockroachdb
    number: 26257
    protocol: TCP
  resolution: DNS
  addresses:
  - 240.0.4.10
  endpoints:
  - address: 10.0.0.1
    ports:
      cockroachdb-http: 15443
      tcp-cockroachdb: 15443

标签: kubernetesistiocockroachdb

解决方案


推荐阅读