什么是 Kubernetes 出口呼叫流程?

What is Kubernetes egress call flow?

我是 kubernetes 的新手。试图了解当我尝试从 kubernetes pod 内部访问 google.com 时会发生什么。
请求会直接到达 google.com(当然不会)还是在调用离开 pod 之前先在 /etc/hosts.allow 文件中进行一些 dns 查找? egress调用的流程或行程是怎样的?
PS: 我已经有默认的 coredns pod 运行.

我认为这个问题可以分为两个不同的主题:

  • DNS分辨率。
  • Pod 尝试访问外部资源时联网。

回答这两个问题可能会很长,但我会尝试为您提供一个基准并添加更深入的其他文档。


DNS 集群 inside/outside 发生的分辨率:

正如您已经说过的,您正在使用 CoreDNS。它将在您的 DNS 分辨率设置中负责。您的 Pods 将在查找本地未包含的域时查询它(例如 /etc/hosts)。在收到回复后,他们将联系外部资源(稍后会详细介绍)。

A side note!

The DNS resolution (local, query) will depend on the tool you've used. curl will check it but for example nslookup will query the DNS server directly.

您的 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 outgoing

Network Address Translation (NAT) is the process of mapping an IP address in a packet to a different IP address as the packet passes through the device performing the NAT. Depending on the use case, NAT can apply to the source or destination IP address, or to both addresses.

In the context of Kubernetes egress, NAT is used to allow pods to connect to services outside of the cluster if the pods have IP addresses that are not routable outside of the cluster (for example, if the pod network is an overlay).

For example, if a pod in an overlay network attempts to connect to an IP address outside of the cluster, then the node hosting the pod uses SNAT (Source Network Address Translation) to map the non-routable source IP address of the packet to the node’s IP address before forwarding on the packet. The node then maps response packets coming in the opposite direction back to the original pod IP address, so packets flow end-to-end in both directions, with neither pod or external service being aware the mapping is happening.

-- Docs.projectcalico.org: About: About Kubernetes Egress

简而言之,假设没有其他因素(例如您的云提供商使用的额外 NAT),您的 Pod 将尝试与 Node IP 联系外部资源(通过使用 Source NAT).

您可以通过以下方式找到有关数据包寿命的更深入的解释(某些方面 GKE 具体):


其他资源