什么是 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.
简而言之,假设没有其他因素(例如您的云提供商使用的额外 NAT
),您的 Pod
将尝试与 Node IP
联系外部资源(通过使用 Source NAT
).
您可以通过以下方式找到有关数据包寿命的更深入的解释(某些方面 GKE
具体):
- Youtube.com:数据包的生命周期 [I] - Michael Rubin,Google
-
17:55
分钟左右。
其他资源
Coredns.io: Plugins: Log - 您可以修改 CoreDNS
ConfigMap
($ kubectl edit configmap -n kube-system coredns
以启用日志记录stdout ($ kubectl logs ...
) 以查看更深入的查询解析。
Speakerdeck.com: Thockin: Kubernetes and networks why is this so damn hard: Slide 57 - 关于 Kubernetes 网络的更多信息。
我是 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 examplenslookup
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.
简而言之,假设没有其他因素(例如您的云提供商使用的额外 NAT
),您的 Pod
将尝试与 Node IP
联系外部资源(通过使用 Source NAT
).
您可以通过以下方式找到有关数据包寿命的更深入的解释(某些方面 GKE
具体):
- Youtube.com:数据包的生命周期 [I] - Michael Rubin,Google
-
17:55
分钟左右。
其他资源
Coredns.io: Plugins: Log - 您可以修改
CoreDNS
ConfigMap
($ kubectl edit configmap -n kube-system coredns
以启用日志记录stdout ($ kubectl logs ...
) 以查看更深入的查询解析。Speakerdeck.com: Thockin: Kubernetes and networks why is this so damn hard: Slide 57 - 关于 Kubernetes 网络的更多信息。