前言
最近准备了几台服务器,尝试一下搭建了k8s集群。在整个搭建过程中踩了几个坑也是排查了半天,网上资料也看了很多,最终总结一下自己的坑,希望能帮到同样问题的同学。
一、坑1:k8s的master节点初始化超时
Initial timeout of 40s passed
遇到这个坑的同学,大多应该是采用公网ip去进行搭建的,薅云厂商的羊毛每家都搞一个新用户买一台,然后就开始整K8S集群了,前期一切顺利的你输入到kubeadm init时,就开始傻眼了,一直超时,重试几次都不行。
问题排查:
- 当失败时,一定记得要先
kubeadm reset, 清理掉之前初始化失败的资源,避免下次因重复加载导致的问题。 - 在初始化命令后加上
--v=6打印详细日志,在初始化时可以打印出问题的日志,准确定位。当你打印日志的时候会发现日志是这样的:
GET xxx.xxx.xxx.xxx:6443/healthz?tim… in 10587 millseconds
- 我第一时间想到的是安全组的6443端口没开,当我开了之后,再一次尝试毫无疑问还是失败。
- 其实问题大多归结于我们采用的公网ip进行搭建【eg:腾讯云、华为云、阿里云各一台机器】,然而云服务主机网卡绑定的都是内网ip,你的机器VPC网络不通,所以导致一直
timeout。
解决方法:
既然是网卡ip的问题,那肯定得从ip下手, 我们可以搭建一个虚拟网卡绑定上你自己的公网ip,使用公网ip来注册集群。
ifconfig查看下自己当前的网卡。- 创建一个虚拟网卡。每台主机都需要这一步
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=<XXX.XXX.XXX.XXX> #绑定上自己的公网ip
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF
- 初始化网络
systemctl restart network - 再次
ifconfig检查一下自己的网卡 - 如果还有问题,可以设置一下
echo 1 > /proc/sys/net/ipv4/ip_forward禁止数据包转发。 - 最后别忘了试一下:master和worker机器之间是否可以ping通。
二、坑2:部署calico网络插件失败。
当你init完成主节点以后,去下载并执行calico插件时,使用
kubectl get pod -A会发现calico的4个pod一直处于pending状态,等了许久也没好。
问题排查与解决办法:
- 确认k8s版本与calico版本是否兼容:
kubectl version。 - 可以查看一下calico.yaml中需要的docker镜像版本
cat calico.yaml | grep "images"。 - 自己手动下载所需的镜像,版本一定要正确。
docker pull xxxxx。
三、坑3:join节点时失败
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "x5g4uy"
问题排查与解决:
- 加入集群的命令如下:
kubeadm join xxx.xxx.xxx.xxx:6443 --token x5g4uy.wpjjdbgra92s25pp \
--discovery-token-ca-cert-hash sha256:6255797916eaee52bf9dda9429db616fcd828436708345a308f4b917d3457a22
2.毫无疑问:token过期,这里的token周期只有24小时。
3.在master节点输入: kubeadm token create --print-join-command 获取新的令牌,采用结果生成的token即可。