K8s集群搭建问题

发布时间 2023-04-05 19:17:56作者: 我有八千部下

警告Cgroup Driver不一致

节点加入集群会警告 docker 和 kubelet 的 Cgroup Driver 不一致,但是暂未发现影响,如图:

image-20210914180557147

解决办法:修改 docker 的 Cgroup Driver 为 systemd

vim /etc/docker/daemon.json

加下面配置,注意在上一行配置后加逗号。

"exec-opts": ["native.cgroupdriver=systemd"]

image-20211130155551621

echo "重启Docker" > /dev/null
systemctl restart docker

用这个命令查看当前 Docker Cgroup 驱动

docker info | grep Cgroup

forward策略为drop

我不确定这个会不会引发集群问题,先记录下。

解决办法:就是修改 iptables forward 策略为 ACCEPT。可以在系统中直接改,但是重启后又会复原。可以通过修改docker配置达到永久生效的目的。

vim /lib/systemd/system/docker.service
# 在[Service]标签下加入如下参数
# ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
echo "重新加载并重启" > /dev/null
systemctl daemon-reload
systemctl restart docker

用这个命令查看 iptables 策略

iptables -nL

在这里插入图片描述

重复 init/join 集群报错

  • 主节点初始化(init)失败,再次尝试报错

解决办法:在主节点执行重置操作。

echo "重置,询问时输入y回车" > /dev/null
kubeadm reset
  • 工作节点加入集群时出错了修改后再次加入报错;主节点删除了工作节点,工作节点再次加入报错等情况。如图:

image-20210914180458899

解决办法:在工作节点重置后再执行 Join 命令

echo "重置,询问时输入y回车" > /dev/null
kubeadm reset 

使用kubectl报错-1

重置集群(kubeadm reset)后,重新初始化(kubeadm init)集群,然后使用kubectl命令(如:kubectl get nodes)报错。

Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")

解决办法:删掉之前产生的配置文件,执行初始化后打印的脚本重新生成

echo "删除配置" > /dev/null
rm -rf $HOME/.kube

echo "重新生成" > /dev/null
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

其实删除配置这个在重置集群后控制台有提示。

image-20210927155143755

使用kubectl报错-2

使用kubectl命令(如:kubectl get nodes)报错,原因是没有执行初始化后打印的脚本生成配置。

error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable

解决办法:初始化后打印的脚本

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

主节点初始化报错

执行kubeadm init初始化的时候卡住,长时间后报错。

image-20211129173612543

  • 主机是云服务器

执行完上面的初始化脚本后会卡在 etcd 初始化的位置,因为 etcd 绑定端口的时候使用外网 IP,而云服务器外网 IP 并不是本机的网卡,而是网关分配的一个供外部访问的 IP,从而导致初始化进程一直重试绑定,长时间卡住后失败。

解决办法是在卡住时,另启一个命令行窗口修改初始化生成的 etcd.yaml 中的配置成示例图一样,进程会自动重试并初始化成功。

vim /etc/kubernetes/manifests/etcd.yaml

image-20210925173830217

  • 6443端口未开,比如云服务安全组入站规则没开放这个端口

查看kubelet日志(journalctl -xeu kubelet)会看到错误日志node "xxx" not found,把端口放开就好了。

image-20211129174340230

从节点Join失败

查看kubelet日志(journalctl -xeu kubelet)会看到错误日志,意思是kubelet的cgroup驱动和Docker的不一样。

"Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""

image-20211130155015475

解决办法:修改 docker 的 Cgroup Driver 为 systemd,修改方式上文有提及。