我已经初始化了一个3节点K8s集群。宿主是Raspberry Pis 4。我的目标是为我的家庭实验室提供可靠的Kubernetes部署。
在每个节点上,我安装了docker.io
、iptables
、kubelet
、kubeadm
和kubectl
。由于我使用的是docker而不是containerd
,我通过在/etc/docker/daemon.json
中设置cgroup驱动程序来启用cgroup支持:
kube01% cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}%
字符串
我已经init
了我的集群,并成功加入了工作节点,并在~/.kube/config中创建了我的配置:
kube01% kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube01 Ready control-plane 11h v1.27.3
kube02 Ready <none> 11h v1.27.3
kube03 Ready <none> 11h v1.27.3
型
运行kubectl
命令时间歇性遇到:
kube01% kubectl get nodes
The connection to the server [kube01.ip]:6443 was refused - did you specify the right host or port?
型
在某些情况下,这一点在我没有互动的情况下就可以清除。在某些情况下,我似乎必须重新启动kubelet
,尽管它表明它运行良好:
kube01% systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Wed 2023-07-05 09:02:07 PDT; 30min ago
Docs: https://kubernetes.io/docs/home/
Main PID: 725 (kubelet)
Tasks: 15 (limit: 4416)
Memory: 112.4M
CPU: 2min 47.315s
CGroup: /system.slice/kubelet.service
└─725 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.c>
Jul 05 09:33:05 kube01 kubelet[725]: I0705 09:33:05.014941 725 scope.go:115] "RemoveContainer" containerID="d01bb7bcb9c0fe9f1633647d>
Jul 05 09:33:05 kube01 kubelet[725]: E0705 09:33:05.015693 725 pod_workers.go:1294] "Error syncing pod, skipping" err="failed to \"S>
Jul 05 09:33:05 kube01 kubelet[725]: I0705 09:33:05.958592 725 status_manager.go:809] "Failed to get status for pod" podUID=7206a59a>
Jul 05 09:33:05 kube01 kubelet[725]: I0705 09:33:05.960240 725 status_manager.go:809] "Failed to get status for pod" podUID=761a171d>
Jul 05 09:33:05 kube01 kubelet[725]: I0705 09:33:05.961685 725 status_manager.go:809] "Failed to get status for pod" podUID=54993b57>
Jul 05 09:33:05 kube01 kubelet[725]: I0705 09:33:05.963287 725 status_manager.go:809] "Failed to get status for pod" podUID=8d7c8723>
Jul 05 09:33:05 kube01 kubelet[725]: I0705 09:33:05.966891 725 status_manager.go:809] "Failed to get status for pod" podUID=aa900694>
Jul 05 09:33:06 kube01 kubelet[725]: I0705 09:33:06.017001 725 scope.go:115] "RemoveContainer" containerID="f97bdc8171c54a8e9d9cb62b>
Jul 05 09:33:06 kube01 kubelet[725]: E0705 09:33:06.018166 725 pod_workers.go:1294] "Error syncing pod, skipping" err="failed to \"S>
Jul 05 09:33:06 kube01 kubelet[725]: E0705 09:33:06.020022 725 event.go:289] Unable to write event: '&v1.Event{TypeMeta:v1.TypeMeta{>
lines 1-23/23 (END)
型
搜索似乎给我指出了三个主要的解决方案,我已经确认所有这些都适用于我的情况:
1.禁用交换(通过sudo swap off -a
禁用,并确保在/etc/fstab
中未配置交换
1.已配置containerd
/docker
以支持cgroup(同上)
1.确保~/.kube/config
已正确创建和许可(同上)
我已经把头撞到这上面好几天了是否有任何其他指导来消除此间歇性错误?
**[Follow-Up]**阅读Kubernetes和Docker文档,Kubernetes似乎完全支持containerd
,并表示docker.io
不是首选。也许能找到一些变通办法,但选择不逆流而上。我把运行时移到了containerd
,现在它已经可靠了好几个小时了。如果情况稳定到明天我会跟进更多细节。
1条答案
按热度按时间e1xvtsh31#
我在这个集群上花了大约8个小时,自从迁移到
containerd
后,它在这方面一直很可靠。正如我提到的,阅读Docker的文档,这一点很突出:卸载旧版本在安装Docker Engine之前,必须首先确保卸载了所有冲突的包。
Distro维护人员在APT中提供了Docker包的非官方发行版。您必须先卸载这些软件包,然后才能安装Docker Engine的正式版本。
要卸载的非官方软件包包括:
此外,Docker Engine依赖于
containerd
和runc
。Docker Engine将这些依赖捆绑为一个捆绑包:containerd.io.如果您之前安装了containerd或runc,请卸载它们以避免与Docker Engine捆绑的版本发生冲突。tl;dr:
不要使用
containerd
以外的容器运行时