我读过这个在文档中:
每个 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-cidr
set 或networking.podSubnet
在初始配置中设置重新初始化(请参阅--config
选项)。