我认为这个问题可以分为 2 个不同的主题:
-
DNS 分辨率。
-
Pod 尝试联系外部资源时的网络。
回答这两个问题可能会很长,但我会尝试为您提供一个基线,并添加更多更深入的文档。
DNS 在集群内部/外部发生的分辨率:
正如您已经说过的,您使用的是CoreDNS。它将在您的设置中负责您的DNS 分辨率。您的Pods 将在查找本地未包含的域时查询它(例如/etc/hosts)。收到回复后,他们会联系外部来源(稍后会详细介绍)。
附注!
DNS 分辨率(本地、查询)取决于您使用的工具。 curl 将检查它,但例如 nslookup 将直接查询 DNS 服务器。
您的CoreDNS 很可能在您的集群中的Services 之一下可用:
$ kubectl get service --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 79m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 79m
我想你可以在官方文档中找到很多有用的信息:
您也可以按照本指南获得更多实践经验:
尝试访问外部资源时的 Pod 网络:
每个 Kubernetes 解决方案在处理网络的方式上可能有所不同。请参阅您的解决方案的文档以获取更多详细信息。它的主要前提是Pod 不会“直接”与外部源通信。您可以在下面找到有关其背后原因的更多信息:
NAT 传出
网络地址转换 (NAT) 是当数据包通过执行 NAT 的设备时,将数据包中的 IP 地址映射到不同 IP 地址的过程。根据使用情况,NAT 可以应用于源 IP 地址或目标 IP 地址,或同时应用于这两个地址。
在 Kubernetes egress 的上下文中,如果 pod 的 IP 地址在集群外部不可路由(例如,如果 pod 网络是覆盖网络),则 NAT 用于允许 pod 连接到集群外部的服务.
例如,如果覆盖网络中的 pod 尝试连接到集群外部的 IP 地址,则托管该 pod 的节点使用 SNAT(源网络地址转换)来映射不可路由的源 IP 地址在转发数据包之前将数据包发送到节点的 IP 地址。然后该节点将来自相反方向的响应数据包映射回原始 pod IP 地址,因此数据包在两个方向上端到端流动,而 pod 或外部服务都不会意识到映射正在发生。
-- Docs.projectcalico.org: About: About Kubernetes Egress
简而言之,假设没有其他因素(例如您的云提供商使用的其他 NAT),您的 Pod 将尝试使用 Node IP 联系外部资源(使用 Source NAT)。
您可以通过以下方式找到有关数据包寿命的更深入解释(某些方面是GKE 特定的):
其他资源