【发布时间】: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