【问题标题】:Use istio ServiceEntry resource to send traffic to internal kubernetes FQDN over external connection使用 istio ServiceEntry 资源通过外部连接将流量发送到内部 kubernetes FQDN
【发布时间】:2022-06-30 19:30:25
【问题描述】:

上下文:

我正在计划将 kubernetes 服务从一个集群迁移到另一个集群,这些集群位于单独的 GCP 项目中,但需要能够跨集群进行通信,直到所有应用都迁移过去。这些项目启用了 VPC 对等互连,以允许内部流量到内部负载均衡器(经过测试并确认没问题)。

我们在 GKE 集群中运行 Anthos 服务网格 (v1.12)。

问题:

我需要找到一种方法来执行以下操作:

  • PodA 需要迁移,并在其 ENV 中引用一个主机名,即“serviceA”
  • 在同一个集群中运行,这可以很好地解决,因为 pod 将“serviceA”解析为“serviceA.default.svc.cluster.local”(内部 kubernetes FQDN)。
  • 但是,当我在新集群上运行 PodA 时,我需要 serviceA 的主机名才能真正解析回另一个集群上的内部负载平衡器,而不是在其本地集群(和命名空间)上,因为 serviceA 仍在运行旧集群。

我正在使用 istio ServiceEntry 资源来尝试实现这一点,如下所示:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: serviceA
  namespace: default
spec:
  hosts:
  - serviceA.default.svc.cluster.local
  location: MESH_EXTERNAL
  ports:
  - number: 50051
    name: grpc
    protocol: GRPC
  resolution: STATIC
  endpoints: 
    - address: 'XX.XX.XX.XX' # IP Redacted
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: resources
  namespace: default
spec:
  hosts:
  - 'serviceA.default.svc.cluster.local'
  gateways:
    - mesh
  http:
  - timeout: 5s
    route:
    - destination:
        host: serviceA.default.svc.cluster.local

这似乎不起作用,并且在新集群中运行的 PodA 上出现 Error: 14 UNAVAILABLE: upstream request timeout 错误。

我可以确认从网格上的另一个 pod 向主机名运行 telnet 似乎可以正常工作(即不会出现连接超时或连接被拒绝)。

serviceentry 上的主机中可以使用的内容是否有限制?它必须是 .com 或 .org 地址吗?

我让它正常工作的唯一方法是在 PodA 中使用 hostAlias 为主机名添加一个 hostfile 条目,但我真的想尝试避免这样做,因为这意味着在很多地方进行相同的更改文件,我宁愿尝试使用 Istio 的 serviceentry 来尝试实现这一点。

感谢任何想法/cmets。

【问题讨论】:

  • 我想我找到了一种更好的方法,使用外部名称的 kubernetes 服务类型(文档 - kubernetes.io/docs/concepts/services-networking/service/…)基本上可以完成 HostAlias 的工作,但不是每个 pod,它是全局的。这样就行了!
  • 使用 telnet / netcat 进行测试的方式与大多数人期望使用 istio github.com/istio/istio/issues/36540的方式不同
  • @rsalmond 啊,是的,完全正确。我忘记了 istio 接受所有端口上的连接并给出误报!谢谢
  • 我认为 externalName 是您的答案,我打算对此发表评论,发现您已经找到了。

标签: kubernetes istio istio-operator


【解决方案1】:

幸运的是,我遇到了一个有类似(但不相同)问题的人,stackoverflow post 中的答案为我提供了我需要创建哪些 kubernetes(和 istio)资源的概要。

我正朝着正确的方向前进,只需要真正了解 istio 如何使用虚拟服务和服务条目。

最终结果是这样的:

apiVersion: v1
kind: Service
metadata:
  name: serviceA
  namespace: default
spec:
  type: ExternalName
  externalName: serviceA.example.com
  ports:
  - name: grpc
    protocol: TCP
    port: 50051
---
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: serviceA
  namespace: default
spec:
  hosts:
  - serviceA.example.com
  location: MESH_EXTERNAL
  ports:
  - number: 50051
    name: grpc
    protocol: TCP
  resolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: serviceA
  namespace: default
spec:
  hosts:
  - serviceA.default.svc.cluster.local
  http:
  - timeout: 5s
    route:
    - destination:
        host: serviceA.default.svc.cluster.local
    rewrite:
      authority: serviceA.example.com

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2019-03-09
    • 2018-02-26
    • 2018-04-07
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多