疑难杂症

在部署k8s时,会遇到各种各样的问题,经过一两天的折腾,我终于成功拉起了一个集群,在这里,我把踩到的坑记录一下

网络问题

在国内,由于GFW的影响,下载镜像可能十分缓慢,由于懒得配置镜像源,所以我选择了外置梯子

交换分区

老生常谈了,建议去/etc/fstab把它扬了之后再swapoff -a,又或者在安装的时候就不指定交换分区……

必要模块

br_netfilter模块和overlay模块在这里是必要的,如果是临时应急,可以使用sudo modprobe暂时装载这两个模块,不过仍然建议配置开机时装载,具体措施为在/etc/modules-load.d/modules.conf里加上两行

网络配置

/etc/sysctl.conf里修改

1
2
3
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.bridge.bridge-nf-call-iptables=1

然后使用这个来重载配置:

1
sudo sysctl --system

注意,net.bridge.bridge-nf-call-iptables的配置需要在装载了br_netfilter之后才能设置

守旧的crictl

在曾经,dockershim作为docker的中间层充当容器运行时,但是现在这种做法已经被弃用了,我们现在可以直接使用containerd来平替dockershim。
不幸的是,crictl仍然会试图寻找dockershim,所以我们需要在/etc/crictl.yaml里配置

1
2
3
4
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false

欠配置的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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.1.100 # 将这里改为本机IP
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: node
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.28.0
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 # 这里加一行
# 注意,如果这里不加这一行的话,flannel会装不上
serviceSubnet: 10.96.0.0/12
scheduler: {}

然后使用这个拉集群:

1
sudo kubeadm init --config config.yaml

明明安装了flannel,但是找不到/run/flannel/subnet.env,开机启动了又消失

那就是flannel安装失败了,查看flannel的日志吧

etcd……?

不要用apt这样的包管理器直接在宿主机安装etcd,k8s的etcd是运行在pod而非直接运行在宿主机上的,如果不小心装了:

1
2
3
4
sudo systemctl stop etcd
sudo systemctl disable etcd
sudo apt purge etcd*
sudo rm -rf /var/lib/etcd

……就斩草除根吧

暂且先这样吧

注意做好以下配置就行了:

  • 确保网络通畅
  • 不要用apt安装etcd
  • 加apt gpg密钥,用apt装kubelet kubectl kubeadm containerd
  • 关交换分区
  • 装载模块
  • 配置sysctl.conf,别忘了重载
  • 创建并更改crictl.yaml
  • 改containerd.toml配置
  • 拉起集群!

最后

遇到问题不要问Deepseek,真的……