kubernetes 重复的 pod ip 地址 - pod ips 在整个集群范围内应该是唯一的吗?

kubernetes 重复的 pod ip 地址 - pod ips 在整个集群范围内应该是唯一的吗?

我读过这个在文档中

每个 Pod 都有自己的 IP 地址...节点上的 Pod 无需 NAT 即可与所有节点上的所有 Pod 进行通信。

我是否应该将其理解为“每个豆荚都有自己的独特的集群范围IP地址”?

我以为是这种情况,但我问这个问题的原因是,我按照说明初始化新集群后,发现不同节点上的 Pod 具有相同的 IP 地址这里。集群有 3 个节点test-vm{4,5,6},其中一个test-vm4是主节点,在本地虚拟网络 10.1.4.0/16 上运行。我使用 flannel 作为 CNI,并按如下方式进行设置:

kubectl patch node test-vm{4..6} -p '{ "spec": { "podCIDR": "10.244.0.0/16" } }' # Had to do this because didn't set it on cluster init. See https://stackoverflow.com/a/60944959/2038383.
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

请注意,2 个不同的 pod 中有 3 个 IP 出现了两次 - 10.244.0.{2,3,4}:

$ kubectl get pods --all-namespaces -o wide -w
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
default       curl                               1/1     Running   0          14m     10.244.0.4   test-vm6   <none>           <none>
default       my-nginx-cf54cdbf7-d6s9m           1/1     Running   0          17m     10.244.0.3   test-vm6   <none>           <none>
default       my-nginx-cf54cdbf7-twrvw           1/1     Running   0          17m     10.244.0.2   test-vm6   <none>           <none>
default       my-nginx-cf54cdbf7-xpff6           1/1     Running   0          17m     10.244.0.4   test-vm5   <none>           <none>
default       my-nginx-more-5f79688b9d-4c9jk     1/1     Running   0          3m10s   10.244.0.6   test-vm5   <none>           <none>
default       my-nginx-more-5f79688b9d-7htsn     1/1     Running   0          3m18s   10.244.0.5   test-vm5   <none>           <none>
default       my-nginx-more-5f79688b9d-gqz9b     1/1     Running   0          3m4s    10.244.0.7   test-vm5   <none>           <none>
default       nginx1                             1/1     Running   0          9s      10.244.0.8   test-vm5   <none>           <none>
kube-system   coredns-64897985d-kt82d            1/1     Running   0          41m     10.244.0.2   test-vm5   <none>           <none>
kube-system   coredns-64897985d-rd7gz            1/1     Running   0          41m     10.244.0.3   test-vm5   <none>           <none>
kube-system   etcd-test-vm4                      1/1     Running   0          41m     10.1.4.36    test-vm4   <none>           <none>
kube-system   kube-apiserver-test-vm4            1/1     Running   0          41m     10.1.4.36    test-vm4   <none>           <none>
kube-system   kube-controller-manager-test-vm4   1/1     Running   0          41m     10.1.4.36    test-vm4   <none>           <none>
kube-system   kube-flannel-ds-snkhk              1/1     Running   0          29m     10.1.4.38    test-vm6   <none>           <none>
kube-system   kube-flannel-ds-wtmqg              1/1     Running   0          29m     10.1.4.37    test-vm5   <none>           <none>
kube-system   kube-flannel-ds-x46xw              1/1     Running   0          29m     10.1.4.36    test-vm4   <none>           <none>
kube-system   kube-proxy-mjl69                   1/1     Running   0          41m     10.1.4.37    test-vm5   <none>           <none>
kube-system   kube-proxy-vz2p2                   1/1     Running   0          41m     10.1.4.36    test-vm4   <none>           <none>
kube-system   kube-proxy-xg4gg                   1/1     Running   0          41m     10.1.4.38    test-vm6   <none>           <none>
kube-system   kube-scheduler-test-vm4            1/1     Running   0          41m     10.1.4.36    test-vm4   <none>           <none>

尽管文档中说了,但所有 Pod 都无法相互通信。它们只能与同一节点上的 Pod 通信,这会导致错误。想知道这是否是出现问题的危险信号,并希望澄清关于 Pod IP 地址唯一性的这一点。

答案1

我明白了。首先,是的pod 绝对应该有一个集群范围内的唯一 IP 地址。这是 k8s 工作方式的基础。链接的 k8s 文档很糟糕,留下了一点悬而未决的问题。措辞更好的来源:

Kubernetes 等平台假设每个容器 (pod) 在集群内都有一个唯一的可路由 IP。这种模型的优点是它消除了共享单个主机 IP 带来的端口映射复杂性。——https://github.com/flannel-io/flannel#networking-details

Kubernetes 网络模型的核心要求之一是每个 Pod 都应该有自己的 IP 地址,并且集群中的每个 Pod 都应该能够使用该 IP 地址与其通信。——https://ronaknathani.com/blog/2020/08/how-a-kubernetes-pod-gets-an-ip-address/


现在的问题是,为什么我的 Pod 被分配了相同的 IP 地址?基本上,这是在 flannel CNI init 中执行的错误的(我从以下网址复制了此建议这个答案):

kubectl patch node test-vm{4..6} -p '{ "spec": { "podCIDR": "10.244.0.0/16" } }' # Had to do this because didn't set it on cluster init.

每个节点的 podCIDR 必须是唯一的。这就是 k8s 确保每个调度的 pod 都有唯一 IP 地址的方式 - 每个节点都会在其 podCIDR 中分配一些 IP。请参阅此很棒的博客文章解释它。上述操作并不等同于按预期设置。--pod-network-cidr命令行选项实际上对应于kubeadm init--pod-network-cidr集群配置 networking.podSubnet。因此,如果您需要在删除 flannel 之后进行设置,然后编辑集群配置(实际上还没有测试过这种方法,我只是使用 --pod-network-cidr 设置重新启动了):

kubectl delete -f kube-flannel.yml
kubectl edit cm -n kube-system kubeadm-config # and add setting.

设置后:

控制平面将自动为每个节点分配CIDR。——https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

如果您要设置每个节点的podCIDR设置,则每个节点的设置必须是唯一的。如果预计节点会动态地来来去去,则应避免手动设置 - 这是正常情况。


更新:上述设置方法集群配置 networking.podSubnet初始化之后实际上不起作用。即使您取消注册并重新注册所有工作节点,它也不会起作用,这很烦人。据我所知,使自动节点 podCIDR 设置起作用的唯一方法是删除集群并使用--pod-network-cidrset 或networking.podSubnet在初始配置中设置重新初始化(请参阅--config选项)。

相关内容