kubernetes - 什么是 Kubernetes 出口调用流程?
问题描述
我是 Kubernetes 的新手。试图了解当我尝试google.com
从 kubernetes pod 内部访问时会发生什么。
请求会直接到达 google.com(当然不是),还是/etc/hosts.allow
在调用超出 pod 之前首先在文件中进行一些 dns 查找?出口呼叫的流程或过程是什么?
PS:我已经运行了默认的 coredns pod。
解决方案
我认为这个问题可以分为两个不同的主题:
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 或外部服务都不会意识到映射正在发生。
简而言之,假设没有其他因素(例如NAT
您的云提供商使用的其他因素),您Pod
将尝试使用Node IP
(通过使用Source NAT
)联系外部资源。
您可以通过以下方式找到有关数据包寿命的更深入解释(某些方面是GKE
具体的):
其他资源
Coredns.io:插件:日志- 您可以修改
CoreDNS
ConfigMap
($ kubectl edit configmap -n kube-system coredns
以启用记录到标准输出 ($ kubectl logs ...
) 以查看更深入的查询解析。Speakerdeck.com:Thockin:Kubernetes 和网络为什么这么难:幻灯片 57 - 更多关于 Kubernetes 网络的信息。
推荐阅读
- flutter - 在设备启动时运行后台服务
- c - 3 x 3 网格的阿贝尔沙堆的特征是什么?
- docker - docker:如何在 shell 入口点“sh -c”中使用 shell 变量?
- javascript - 将 props 传递给实现 react suspense 的 axios hook
- python - 队列空方法是否损坏?
- python - 使用 Tensorflow Keras 在 CPU 上并行训练 N 个网络
- python - 将 PYTHONPATH 添加到 .zprofile/.bash_profile
- python-3.x - 从单个列表生成多个列表
- flutter - 如何在 Visual Code 上定位 Flutter 和 Dart?
- apache-kafka - AggregationStrategy with org.apache.camel.CamelExchangeException:相关键无效