我是kubernetes的新手。试图理解当我试图从kubernetes pod内部访问google.com
时会发生什么
请求是否会直接到达google.com(当然不是(,或者在调用离开pod之前,先在/etc/hosts.allow
文件中进行一些dns查找?出口呼叫的流程或行程是什么
PS:我已经运行了默认的coredns pod。
我认为这个问题可以分为两个不同的主题:
DNS
分辨率- 尝试联系外部来源时的
Pod
网络
回答这两个问题可能会很长时间,但我会尝试给你一个基线,并添加更多更深入的文档。
集群内外发生的DNS
分辨率:
正如您已经说过的,您正在使用CoreDNS
。它将在您的设置中负责您的DNS
分辨率。在查找本地未包含的域(例如/etc/hosts
(时,Pods
将对其进行查询。在他们收到回复后,他们将联系外部来源(稍后会详细介绍(。
旁注!
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
我想你可以在官方文件中找到很多有用的信息:
- Kubernetes.io:文档:概念:服务网络:Dns pod服务
您也可以按照本指南获得更多动手体验:
- Kubernetes.io:文档:任务:管理集群:DNS调试解决方案
尝试联系外部来源时的Pod网络:
每个Kubernetes解决方案在处理网络的具体方式上可能有所不同。有关更多详细信息,请访问解决方案的文档。其主要前提是CCD_;直接";与外部资源进行通信。下面你可以找到更多关于其背后原因的信息:
NAT传出
网络地址转换(NAT(是在数据包通过执行NAT的设备时,将数据包中的IP地址映射到不同的IP地址的过程。根据使用情况,NAT可以应用于源或目标IP地址,也可以应用于这两个地址。
在Kubernetes egress的上下文中,NAT用于允许pod连接到集群外的服务,如果pod的IP地址在集群外不可路由(例如,如果pod网络是覆盖层(。
例如,如果覆盖网络中的pod试图连接到集群之外的IP地址,则托管pod的节点在转发数据包之前使用SNAT(源网络地址转换(将数据包的不可路由源IP地址映射到节点的IP地址。然后,节点将来自相反方向的响应数据包映射回原始pod IP地址,因此数据包在两个方向上端到端地流动,pod或外部服务都不知道映射正在发生。
--Docs.projectcalico.org:关于:关于Kubernetes出口
简而言之,假设没有其他因素(如云提供商使用的其他NAT
(,您的Pod
将尝试使用Node IP
联系外部来源(通过使用Source NAT
(。
您可以通过以下方式找到关于数据包寿命的更深入的解释(某些方面是GKE
特定的(:
- Youtube.com:包的生命[I]-Michael Rubin,谷歌-大约在
17:55
分钟
其他资源
Coredns.io:Plugins:Log-您可以修改
CoreDNS
ConfigMap
($ kubectl edit configmap -n kube-system coredns
(以启用到stdout($ kubectl logs ...
(的日志记录,以查看更深入的查询解决方案。Speakerdeck.com:Tockin:Kubernetes和网络为什么这么难:幻灯片57-更多关于Kubernete网络的信息。