gpt4 book ai didi

networking - 为 Kubernetes 设置网络

转载 作者:行者123 更新时间:2023-12-01 04:35:10 24 4
gpt4 key购买 nike

我正在阅读 Kubernetes "Getting Started from Scratch" Guide并到达了可怕的Network Section ,他们说:

Kubernetes imposes the following fundamental requirements on any networking implementation
(barring any intentional network segmentation policies):
* all containers can communicate with all other containers without NAT
* all nodes can communicate with all containers (and vice-versa) without NAT
* the IP that a container sees itself as is the same IP that others see it as

我的第一个困惑来源是:这与“标准”Docker 模型有何不同Docker 有何不同 w.r.t.这 3 个 Kubernetes 要求?

文章接着总结了 GCE 如何实现这些要求:

For the Google Compute Engine cluster configuration scripts, we use advanced routing to assign each VM a subnet (default is /24 - 254 IPs). Any traffic bound for that subnet will be routed directly to the VM by the GCE network fabric. This is in addition to the "main" IP address assigned to the VM, which is NAT'ed for outbound internet access. A linux bridge (called cbr0) is configured to exist on that subnet, and is passed to docker's --bridge flag.

我的问题是:本段针对以上 3 项中的哪些要求?更重要的是,它如何达到要求?我想我只是不明白 1-subnet-per-VM 如何实现:容器-容器通信、节点-容器通信和静态 IP。


而且,作为奖励/延伸问题:为什么 Marathon 没有遇到与 Kubernetes 在这里解决的相同的网络问题?

最佳答案

Docker 的标准 networking configurationchosen defaults 中为您挑选一个容器子网.只要它不与主机上的任何接口(interface)冲突,Docker 就可以接受。

然后,Docker 插入一个 iptables MASQUERADE 规则,允许容器使用主机的默认接口(interface)与外部世界对话。

Kubernetes 的 3 要求违反了以下事实:仅根据主机上使用的地址选择子网,这强制要求使用 MASQUERADE 规则对所有容器流量进行 NAT。

考虑以下 3 主机 Docker 设置(为了突出显示而做的有点刻意):

主持人1:

eth0:10.1.2.3

docker0:172.17.42.1/16

容器-A:172.17.42.2

主持人2:

eth0:10.1.2.4

docker0:172.17.42.1/16

容器-B:172.17.42.2

主持人3:

eth0:172.17.42.2

docker0:172.18.42.1

假设 container-B 想要访问 container-A 端口 80 上的 HTTP 服务。您可以让 docker 在 Host 1 的某处公开 container-A 的端口 80。然后 container-B 可能会向 10.1.2.3:43210 发出请求。这将在 container-A 的端口 80 上接收,但看起来像是来自 10.1.2.4 上的某个随机端口,因为 Host 2 .这违反了所有容器在没有 NAT 的情况下进行通信并且容器看到与其他容器相同的 IP 要求。尝试直接从 Host 2 访问 container-A 的服务,您的节点可以在不违反 NAT 的情况下与容器通信。

现在,如果这些容器中的任何一个想要与 Host 3 通信,它们就是 SOL(只是一个一般性的论点,要小心使用自动分配的 docker0 子网)。

GCE/AWS/Flannel/... 上的 Kubernetes 方法是 assign每个主机 VM 都是从平面专用网络中划分出来的子网。没有子网与 VM 地址或彼此重叠。这让容器和 VM 可以进行 NATless 通信。

关于networking - 为 Kubernetes 设置网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32852216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com