重启节点后,pods 由于编织 IP 不足而卡在 containerCreating 状态
After rebooting nodes, pods stuck in containerCreating state due to insufficient weave IP
我在 1.11 上部署了 3 节点 Kubernetes 集群,其中部署了 2.5.1 版的 kubeadm 和 weave(CNI) 运行ning。我提供 128 个 IP 的 IP 范围的编织 CIDR。两次重启节点后,一些 pods 卡在 containerCreating
状态。
一旦你 运行 kubectl describe pod <pod_name>
你会看到以下错误:
Events:
Type Reason Age From Message
---- ------ ---- ----
-------
Normal SandboxChanged 20m (x20 over 1h) kubelet, 10.0.1.63 Pod sandbox changed, it will be killed and re-created.
Warning FailedCreatePodSandBox 30s (x25 over 1h) kubelet, 10.0.1.63 Failed create pod sandbox: rpc error: code = DeadlineExceeded desc = context deadline exceeded
如果我检查有多少容器 运行ning 以及分配给这些容器的 IP 地址有多少,我可以看到 24 个容器:
[root@ip-10-0-1-63 centos]# weave ps | wc -l
26
在该节点编织的 IP 总数为 42。
[root@ip-10-0-1-212 centos]# kubectl exec -n kube-system -it weave-net-6x4cp -- /home/weave/weave --local status ipam
Defaulting container name to weave.
Use 'kubectl describe pod/weave-net-6x4cp -n kube-system' to see all of the containers in this pod.
6e:0d:f3:d7:f5:49(10.0.1.63) 42 IPs (32.8% of total) (42 active)
7a:24:6f:3c:1b:be(10.0.1.212) 40 IPs (31.2% of total)
ee:00:d4:9f:9d:79(10.0.1.43) 46 IPs (35.9% of total)
您可以看到所有 42 个 IP 都处于活动状态,因此没有更多 IP 可用于分配给新容器。但是在 42 个中只有 26 个实际上分配给了容器,我不确定剩余的 IP 在哪里。它发生在所有三个节点上。
下面是编织状态的输出供您参考:
[root@ip-10-0-1-212 centos]# weave status
Version: 2.5.1 (version 2.5.2 available - please upgrade!)
Service: router
Protocol: weave 1..2
Name: 7a:24:6f:3c:1b:be(10.0.1.212)
Encryption: disabled
PeerDiscovery: enabled
Targets: 3
Connections: 3 (2 established, 1 failed)
Peers: 3 (with 6 established connections)
TrustedSubnets: none
Service: ipam
Status: waiting for IP(s) to become available
Range: 192.168.13.0/25
DefaultSubnet: 192.168.13.0/25
如果您需要更多信息,我很乐意提供。有什么线索吗?
不确定我们是否遇到同样的问题。
但是在我重新启动节点之前。我需要先 drain
它。因此,该节点中的所有 pods 都将被驱逐。我们可以安全地重启节点。
该节点启动后。您需要再次uncordon
。该节点将再次可用于调度 Pod。
我的参考https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/
我猜 16 个 IP 已保留用于 Pods 重用目的。这些是基于 CIDR 范围的每个节点的最大值 pods。
Maximum Pods per Node CIDR Range per Node
8 /28
9 to 16 /27
17 to 32 /26
33 to 64 /25
65 to 110 /24
以防万一您正在编织 IP 已用完并且某些 IP 在重启后未释放。您可以删除文件 /var/lib/weave/weave-netdata.db
并重新开始编织 pods.
对于我的情况,我添加了一个 systemd 脚本,该脚本在每次重新启动或关闭系统时都会删除 /var/lib/weave/weave-netdata.db
文件,一旦系统启动,它就会为所有 pods 分配新的 Ip,并且weave IP exhaust 再也见不到了。
将其张贴在这里希望其他人会发现它对他们的用例有用。
我在 1.11 上部署了 3 节点 Kubernetes 集群,其中部署了 2.5.1 版的 kubeadm 和 weave(CNI) 运行ning。我提供 128 个 IP 的 IP 范围的编织 CIDR。两次重启节点后,一些 pods 卡在 containerCreating
状态。
一旦你 运行 kubectl describe pod <pod_name>
你会看到以下错误:
Events:
Type Reason Age From Message
---- ------ ---- ----
-------
Normal SandboxChanged 20m (x20 over 1h) kubelet, 10.0.1.63 Pod sandbox changed, it will be killed and re-created.
Warning FailedCreatePodSandBox 30s (x25 over 1h) kubelet, 10.0.1.63 Failed create pod sandbox: rpc error: code = DeadlineExceeded desc = context deadline exceeded
如果我检查有多少容器 运行ning 以及分配给这些容器的 IP 地址有多少,我可以看到 24 个容器:
[root@ip-10-0-1-63 centos]# weave ps | wc -l
26
在该节点编织的 IP 总数为 42。
[root@ip-10-0-1-212 centos]# kubectl exec -n kube-system -it weave-net-6x4cp -- /home/weave/weave --local status ipam
Defaulting container name to weave.
Use 'kubectl describe pod/weave-net-6x4cp -n kube-system' to see all of the containers in this pod.
6e:0d:f3:d7:f5:49(10.0.1.63) 42 IPs (32.8% of total) (42 active)
7a:24:6f:3c:1b:be(10.0.1.212) 40 IPs (31.2% of total)
ee:00:d4:9f:9d:79(10.0.1.43) 46 IPs (35.9% of total)
您可以看到所有 42 个 IP 都处于活动状态,因此没有更多 IP 可用于分配给新容器。但是在 42 个中只有 26 个实际上分配给了容器,我不确定剩余的 IP 在哪里。它发生在所有三个节点上。
下面是编织状态的输出供您参考:
[root@ip-10-0-1-212 centos]# weave status
Version: 2.5.1 (version 2.5.2 available - please upgrade!)
Service: router
Protocol: weave 1..2
Name: 7a:24:6f:3c:1b:be(10.0.1.212)
Encryption: disabled
PeerDiscovery: enabled
Targets: 3
Connections: 3 (2 established, 1 failed)
Peers: 3 (with 6 established connections)
TrustedSubnets: none
Service: ipam
Status: waiting for IP(s) to become available
Range: 192.168.13.0/25
DefaultSubnet: 192.168.13.0/25
如果您需要更多信息,我很乐意提供。有什么线索吗?
不确定我们是否遇到同样的问题。
但是在我重新启动节点之前。我需要先 drain
它。因此,该节点中的所有 pods 都将被驱逐。我们可以安全地重启节点。
该节点启动后。您需要再次uncordon
。该节点将再次可用于调度 Pod。
我的参考https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/
我猜 16 个 IP 已保留用于 Pods 重用目的。这些是基于 CIDR 范围的每个节点的最大值 pods。
Maximum Pods per Node CIDR Range per Node
8 /28
9 to 16 /27
17 to 32 /26
33 to 64 /25
65 to 110 /24
以防万一您正在编织 IP 已用完并且某些 IP 在重启后未释放。您可以删除文件 /var/lib/weave/weave-netdata.db
并重新开始编织 pods.
对于我的情况,我添加了一个 systemd 脚本,该脚本在每次重新启动或关闭系统时都会删除 /var/lib/weave/weave-netdata.db
文件,一旦系统启动,它就会为所有 pods 分配新的 Ip,并且weave IP exhaust 再也见不到了。
将其张贴在这里希望其他人会发现它对他们的用例有用。