Kubernetes的Pod卡在“容器创建”状态

9

我有一个树莓派集群(一个主节点,3个从节点)

我的基础镜像是:raspbian stretch lite

我已经建立了一个基本的 Kubernetes 集群,其中一个主节点可以看到所有节点(kubectl get nodes),并且它们都在运行。我使用了一个 weave 网络插件进行网络通信。

当一切都准备就绪时,我尝试在我的集群上运行一个 nginx pod(首先使用一些副本,但现在只有 1 个 pod),如下所示:

kubectl run my-nginx --image=nginx

但是,某种原因导致该 pod 在状态“Container creating”中卡住了,当我运行 docker images 时,我看不到正在拉取 nginx 镜像。通常,nginx 镜像并不是那么大,所以应该已经被拉取了(15 分钟)。kubectl describe pods 给出错误,即 pod 沙盒创建失败,Kubernetes 将重新创建它。

我搜索了与此问题有关的所有内容,并尝试了 stackoverflow 上的解决方案(重启集群以重新启动、搜索 describe pods、新网络插件和 flannel),但我看不到实际问题在哪里。我在 VirtualBox 中做了完全相同的事情(只是 Ubuntu 不是 ARM),一切都正常。

起初我认为这是权限问题,因为我以普通用户身份运行所有内容,但在虚拟机中,我也做了同样的事情,但没有改变。然后我检查了 kubectl get pods --all-namespaces,以验证 weaver 网络和 kube-dns 的 pod 是否正在运行,也没有发现任何问题。

这是树莓派的防火墙问题吗?weave 网络插件与 arm 设备不兼容(即使 Kubernetes 网站上说它是)?我猜测存在一个 API 网络问题,这就是为什么我无法在节点上运行我的 pod。

[编辑]

日志文件

kubectl describe podName

>     
>     Name:           my-nginx-9d5677d94-g44l6 Namespace:      default Node: kubenode1/10.1.88.22 Start Time:     Tue, 06 Mar 2018 08:24:13
> +0000 Labels:         pod-template-hash=581233850
>                     run=my-nginx Annotations:    <none> Status:         Pending IP: Controlled By:  ReplicaSet/my-nginx-9d5677d94 Containers: 
> my-nginx:
>         Container ID:
>         Image:          nginx
>         Image ID:
>         Port:           80/TCP
>         State:          Waiting
>           Reason:       ContainerCreating
>         Ready:          False
>         Restart Count:  0
>         Environment:    <none>
>         Mounts:
>           /var/run/secrets/kubernetes.io/serviceaccount from default-token-phdv5 (ro) Conditions:   Type           Status  
> Initialized    True   Ready          False   PodScheduled   True
> Volumes:   default-token-phdv5:
>         Type:        Secret (a volume populated by a Secret)
>         SecretName:  default-token-phdv5
>         Optional:    false QoS Class:       BestEffort Node-Selectors:  <none> Tolerations:     node.kubernetes.io/not-ready:NoExecute for
> 300s
>                      node.kubernetes.io/unreachable:NoExecute for 300s Events:   Type     Reason                  Age   From               
> Message   ----     ------                  ----  ----               
>     -------   Normal   Scheduled               5m    default-scheduler   Successfully assigned my-nginx-9d5677d94-g44l6 to kubenode1   Normal  
> SuccessfulMountVolume   5m    kubelet, kubenode1  MountVolume.SetUp
> succeeded for volume "default-token-phdv5"   Warning 
> FailedCreatePodSandBox  1m    kubelet, kubenode1  Failed create pod
> sandbox.   Normal   SandboxChanged          1m    kubelet, kubenode1 
> Pod sandbox changed, it will be killed and re-created.

kubectl logs podName

Error from server (BadRequest): container "my-nginx" in pod "my-nginx-9d5677d94-g44l6" is waiting to start: ContainerCreating

journalctl -u kubelet会出现以下错误

Mar 12 13:42:45 kubeMaster kubelet[16379]: W0312 13:42:45.824314   16379 cni.go:171] Unable to update cni config: No networks found in /etc/cni/net.d
Mar 12 13:42:45 kubeMaster kubelet[16379]: E0312 13:42:45.824816   16379 kubelet.go:2104] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

问题似乎出在我的网络插件上。在我的 /etc/systemd/system/kubelet.service.d/10.kubeadm.conf 文件中,有关网络插件的标志存在吗?环境变量= kubelet_network_args --cni-bin-dir=/etc/cni/net.d --network-plugin=cni


你能添加你看到的实际错误日志吗? - stacksonstacks
谢谢您的回复。我已经编辑了我的问题并附上了日志文件。 - achahbar
2个回答

11

感谢大家对我的问题做出的回应。我现在解决了我的问题。对于将来遇到这个问题的任何人,解决方法如下。

我克隆了我的树莓派镜像,因为我想要一个basicConfig.img,以便在需要添加新节点或其中一个节点宕机时使用。

Weave network(我使用的插件)因为每个节点和主节点上的操作系统都具有相同的machine-id而感到困惑。当我删除了machine-id并创建了一个新的(并重新启动了节点)后,我的错误得到了修复。 执行此操作的命令是:

sudo rm /etc/machine-id
sudo rm /var/lib/dbus/machine-id
sudo dbus-uuidgen --ensure=/etc/machine-id

我的耐心再一次被考验了。因为我的Kubernetes设置是正常的,而我树莓派操作系统也是正常的。在Kubernetes社区的某个人的帮助下,我找到了问题所在。这再次向我们展示了IT社区的重要性和伟大之处。对未来会遇到这个问题的人们,我希望这个解决方案能够修复您的错误,并减少您搜索一个愚蠢的小东西所花费的时间。


1
我已经搜索了几天,终于找到了解决这个问题的方法。我正在使用debootstrap生成自定义的Raspbian镜像,但它们都具有相同的机器ID。感谢您发布这个答案! - Jonesinator
没问题,我理解你的困难 :D - achahbar
@SAndrew,您所说的“同一问题”是什么意思? 您遇到了什么问题? - achahbar
@achahbar 容器卡在 ContainerCreating 状态。尝试了您的命令,但没有成功。 - S Andrew
@SAndrew 我不是 Kubernetes 的专家,这是我在 Kubernetes 中的第一个设置。如果我是你,可以看一下我的旧问题(这不是我第一次为此类问题提问),有很多人给了我可能的解决方案。之后(可能你已经做到了)检查网络插件和调试,尝试另一个插件。在虚拟机中尝试,树莓派是 ARM 设备,对于 Kubernetes 来说是意外的。很抱歉我不能再帮助你了。 - achahbar

7

如果想确定问题是否与网络有关,可以查找尝试拉取图像的节点:

kubectl describe pod <name> -n <namespace>

SSH到该节点,然后在上面运行docker pull nginx。如果手动获取镜像出现问题,则可能是与网络有关。


我尝试了你的解决方案,但节点可以手动拉取镜像。 当我尝试使用kubectl describe pod(使用pod名称)时, 我收到了“failed to create sandbox”的错误信息,kubelet正在尝试重新创建沙盒。 - achahbar
我编辑了我的问题,您可以看到它尝试创建Pod沙箱并且未能成功创建。 - achahbar
请参阅 https://serverfault.com/questions/728727/kubernetes-stuck-on-containercreating。 - Chris Halcrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接