kubernetes pods 停留在容器创建

kubernetes pods stuck at containercreating

我有一个 raspberry pi 集群(一个主节点,3 个节点)

我的基本图像是:raspbian stretch lite

我已经设置了一个基本的 kubernetes 设置,其中主节点可以看到他的所有节点 (kubectl get nodes),并且它们都是 运行ning。 我使用 weave 网络插件进行网络通信

当一切都设置好后,我尝试在我的集群上 运行 一个 nginx pod(首先是一些副本,但现在只有 1 个 pod),如下所示 kubectl 运行 my-nginx --image=nginx

但是不知何故 pod 卡在状态 "Container creating" ,当我 运行 docker 图像时我看不到正在拉取的 nginx 图像。通常 nginx 镜像不是那么大,所以它必须在现在(15 分钟)之前被拉取。 kubectl describe pods 给出了 pod 沙箱创建失败的错误,kubernetes 将重新创建它。

我搜索了有关此问题的所有内容并尝试了 Whosebug 上的解决方案(重启以重新启动集群,搜索描述 pods,新网络插件用 flannel 尝试)但我看不到实际问题是什么. 我在 Virtual box 中做了完全相同的事情(只是 ubuntu 而不是 ARM )并且一切正常。

首先,我认为这是一个权限问题,因为我 运行 一切都是普通用户,但在 vm 中我做了同样的事情,没有任何改变。 然后我检查了 kubectl get pods --all-namespaces 以验证 weaver 网络和 kube-dns 的 pods 是 运行ning 并且那里也没有错。

这是 Raspberry pi 中的防火墙问题吗? weave 网络插件是否与 arm 设备不兼容(甚至 kubernetes 网站也说是)? 我猜有一个 api 网络问题,这就是为什么我无法在节点 运行nning 上获取我的 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 记录 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

您可以通过找到尝试拉取图像的节点来查看它是否与网络相关:

kubectl describe pod <name> -n <namespace>

SSH 到节点,运行 docker pull nginx 就可以了。如果它在手动拉取图像时遇到问题,则可能与网络有关。

谢谢大家回答我的问题。 我现在解决了我的问题。对于以后遇到我的问题的任何人,解决方案如下。

我克隆了我的 raspberry pi 图像,因为我想要一个 basicConfig.img 当我需要向我的集群添加一个新节点时,当一个节点出现故障时。

Weave 网络(我使用的插件)感到困惑,因为在每个节点和主节点上 os 具有相同的 machine-id。当我删除机器 ID 并创建一个新机器 ID(并重新启动节点)时,我的错误得到了修复。 执行此操作的命令是

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

再一次考验我的耐心。因为我的kubernetes设置正常,我的raspberry pi os也正常。我在 kubernetes 社区的某个人的帮助下创立了这个。这再次向我们展示了我们的 IT 社区是多么重要和伟大。对于未来会遇到这个问题的人。我希望这个解决方案能够解决您的错误,并减少您搜索愚蠢的小东西的时间。