首页 > 解决方案 > 什么是 Kubernetes 出口调用流程?

问题描述

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

标签: kuberneteskubernetes-podhostshosts-file

解决方案


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

  • 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 出口的上下文中,如果 pod 的 IP 地址在集群外部不可路由(例如,如果 pod 网络是覆盖网络),则使用 NAT 允许 pod 连接到集群外部的服务。

例如,如果覆盖网络中的 pod 尝试连接到集群外部的 IP 地址,则托管该 pod 的节点使用 SNAT(源网络地址转换)将数据包的不可路由源 IP 地址映射到转发数据包之前节点的 IP 地址。然后该节点将来自相反方向的响应数据包映射回原始 pod IP 地址,因此数据包在两个方向上端到端流动,而 pod 或外部服务都不会意识到映射正在发生。

-- Docs.projectcalico.org:关于:关于 Kubernetes Egress

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

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


其他资源


推荐阅读