K8s集群搭建问题
警告Cgroup Driver不一致
节点加入集群会警告 docker 和 kubelet 的 Cgroup Driver 不一致,但是暂未发现影响,如图:
解决办法:修改 docker 的 Cgroup Driver 为 systemd
vim /etc/docker/daemon.json
加下面配置,注意在上一行配置后加逗号。
"exec-opts": ["native.cgroupdriver=systemd"]
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
- 工作节点加入集群时出错了修改后再次加入报错;主节点删除了工作节点,工作节点再次加入报错等情况。如图:
解决办法:在工作节点重置后再执行 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
其实删除配置这个在重置集群后控制台有提示。
使用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
初始化的时候卡住,长时间后报错。
- 主机是云服务器
执行完上面的初始化脚本后会卡在 etcd 初始化的位置,因为 etcd 绑定端口的时候使用外网 IP,而云服务器外网 IP 并不是本机的网卡,而是网关分配的一个供外部访问的 IP,从而导致初始化进程一直重试绑定,长时间卡住后失败。
解决办法是在卡住时,另启一个命令行窗口修改初始化生成的 etcd.yaml 中的配置成示例图一样,进程会自动重试并初始化成功。
vim /etc/kubernetes/manifests/etcd.yaml
- 6443端口未开,比如云服务安全组入站规则没开放这个端口
查看kubelet日志(journalctl -xeu kubelet
)会看到错误日志node "xxx" not found
,把端口放开就好了。
从节点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\""
解决办法:修改 docker 的 Cgroup Driver 为 systemd,修改方式上文有提及。