云原生 day2 | 记录小白搭建k8s集群的坑

482 阅读3分钟

前言

最近准备了几台服务器,尝试一下搭建了k8s集群。在整个搭建过程中踩了几个坑也是排查了半天,网上资料也看了很多,最终总结一下自己的坑,希望能帮到同样问题的同学。

一、坑1:k8s的master节点初始化超时

Initial timeout of 40s passed

遇到这个坑的同学,大多应该是采用公网ip去进行搭建的,薅云厂商的羊毛每家都搞一个新用户买一台,然后就开始整K8S集群了,前期一切顺利的你输入到kubeadm init时,就开始傻眼了,一直超时,重试几次都不行。

问题排查:

  1. 当失败时,一定记得要先kubeadm reset, 清理掉之前初始化失败的资源,避免下次因重复加载导致的问题。
  2. 在初始化命令后加上 --v=6 打印详细日志,在初始化时可以打印出问题的日志,准确定位。当你打印日志的时候会发现日志是这样的:

GET xxx.xxx.xxx.xxx:6443/healthz?tim… in 10587 millseconds

  • 我第一时间想到的是安全组的6443端口没开,当我开了之后,再一次尝试毫无疑问还是失败。
  1. 其实问题大多归结于我们采用的公网ip进行搭建【eg:腾讯云、华为云、阿里云各一台机器】,然而云服务主机网卡绑定的都是内网ip,你的机器VPC网络不通,所以导致一直timeout

解决方法:

既然是网卡ip的问题,那肯定得从ip下手, 我们可以搭建一个虚拟网卡绑定上你自己的公网ip,使用公网ip来注册集群。

  1. ifconfig 查看下自己当前的网卡。
  2. 创建一个虚拟网卡。每台主机都需要这一步
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
  1. 初始化网络 systemctl restart network
  2. 再次ifconfig 检查一下自己的网卡
  3. 如果还有问题,可以设置一下echo 1 > /proc/sys/net/ipv4/ip_forward禁止数据包转发。
  4. 最后别忘了试一下:master和worker机器之间是否可以ping通。

二、坑2:部署calico网络插件失败。

当你init完成主节点以后,去下载并执行calico插件时,使用 kubectl get pod -A 会发现calico的4个pod一直处于pending状态,等了许久也没好。

问题排查与解决办法:

  1. 确认k8s版本与calico版本是否兼容:kubectl version
  2. 可以查看一下calico.yaml中需要的docker镜像版本 cat calico.yaml | grep "images"
  3. 自己手动下载所需的镜像,版本一定要正确。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"

问题排查与解决:

  1. 加入集群的命令如下:
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即可。