k8s 踩坑记 - 1
疑难杂症
在部署k8s时,会遇到各种各样的问题,经过一两天的折腾,我终于成功拉起了一个集群,在这里,我把踩到的坑记录一下
网络问题
在国内,由于GFW的影响,下载镜像可能十分缓慢,由于懒得配置镜像源,所以我选择了外置梯子
交换分区
老生常谈了,建议去/etc/fstab把它扬了之后再swapoff -a,又或者在安装的时候就不指定交换分区……
必要模块
br_netfilter模块和overlay模块在这里是必要的,如果是临时应急,可以使用sudo modprobe暂时装载这两个模块,不过仍然建议配置开机时装载,具体措施为在/etc/modules-load.d/modules.conf里加上两行
网络配置
在/etc/sysctl.conf里修改
1 | net.ipv4.ip_forward=1 |
然后使用这个来重载配置:
1 | sudo sysctl --system |
注意,net.bridge.bridge-nf-call-iptables的配置需要在装载了br_netfilter之后才能设置
守旧的crictl
在曾经,dockershim作为docker的中间层充当容器运行时,但是现在这种做法已经被弃用了,我们现在可以直接使用containerd来平替dockershim。
不幸的是,crictl仍然会试图寻找dockershim,所以我们需要在/etc/crictl.yaml里配置
1 | runtime-endpoint: unix:///var/run/containerd/containerd.sock |
欠配置的containerd
在容器被拉起时,当时我发现etcd和apiserver相继挂掉从而导致了整个集群崩盘的现象,后经查证,这是因为我的虚拟机使用的是Ubuntu Server 22.04 LTS,而这个系统默认使用systemd,所以我们需要在containerd的配置文件/etc/containerd/config.toml里确认SystemdCgroup = true
注意,在新版本containerd中,要设置的是[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]下的SystemdCgroup = true,而不是旧版本中的[plugins."io.containerd.grpc.v1.cri"],这里面记录的是
顺便一提,这个目录和文件默认不存在,所以要先生成默认的,复制到对应目录,然后再改:
1 | containerd config default > config.toml |
集群配置
于我而言,我不喜欢使用各种参数把kubeadm后面的参数拼的比我的屏幕还长,或者搞砸了之后想要看看哪里改错的时候按↑键找之前的命令找半天,所以我推荐使用配置文件来写配置
先使用这个生成配置:
1 | kubeadm config print init-defaults > config.yaml |
然后按照以下内容更改
1 | apiVersion: kubeadm.k8s.io/v1beta3 |
然后使用这个拉集群:
1 | sudo kubeadm init --config config.yaml |
明明安装了flannel,但是找不到/run/flannel/subnet.env,开机启动了又消失
那就是flannel安装失败了,查看flannel的日志吧
etcd……?
不要用apt这样的包管理器直接在宿主机安装etcd,k8s的etcd是运行在pod而非直接运行在宿主机上的,如果不小心装了:
1 | sudo systemctl stop etcd |
……就斩草除根吧
暂且先这样吧
注意做好以下配置就行了:
- 确保网络通畅
- 不要用apt安装etcd
- 加apt gpg密钥,用apt装kubelet kubectl kubeadm containerd
- 关交换分区
- 装载模块
- 配置
sysctl.conf,别忘了重载 - 创建并更改crictl.yaml
- 改containerd.toml配置
- 拉起集群!
最后
遇到问题不要问Deepseek,真的……