部署k8s-1.31版本踩坑点记录(非安装步骤)


运行时 Unix 域套接字
containerd unix:///var/run/containerd/containerd.sock
CRI-O unix:///var/run/crio/crio.sock
Docker Engine(使用 cri-dockerd) unix:///var/run/cri-dockerd.sock

来自 https://v1-31.docs.kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

安装docker 设置为开机自启动

1
2
3
4
5
6
7
离线安装下载docker 

https://docs.docker.com/engine/install/centos/#install-from-a-package

麒麟基于centos8,下载二进制的docker

https://download.docker.com/linux/centos/8/x86_64/stable/Packages/

image.png

安装cri-docker

1
2
3
4
5
6
7
8
9
10
11
12
13
不想自己编译就下载二进制 https://github.com/Mirantis/cri-dockerd

Git clone https://github.com/Mirantis/cri-dockerd.git

# 复制二进制到/usr/local/bin 下
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
# 复制下载的
install packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable --now cri-docker.socket

# systemctl status cri-docker.socket # 查看状态也要写全cri-docker.socket,不然会看见状态时dead

参照这个网站 https://mirantis.github.io/cri-dockerd/usage/install-manually/

image.png

安装kubelet kubeadm kubectl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 最新版本

curl -LO "[https://dl.k8s.io/release/**$(**curl -L -s https://dl.k8s.io/release/stable.txt**)**/bin/linux/amd64/kubectl](https://dl.k8s.io/release/$(curl -L -s https:/dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl)"

# 指定版本

curl -LO "https://dl.k8s.io/release/v1.31.1/bin/linux/amd64/kubectl"

curl -LO "https://dl.k8s.io/release/v1.31.1/bin/linux/amd64/kubelet"

curl -LO "https://dl.k8s.io/release/v1.31.1/bin/linux/amd64/kubeadm"

# 增加可执行权限复制二进制到/usr/bin下,kubelet kubeadm 也是一样的

chmod +x kubectl

mv kubectl /usr/local/bin/

来自 https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/

初始化master(离线需要注意镜像打包)

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
# 找到需要下载的镜像

[root@VM101 ~]# kubeadm config images list --kubernetes-version v1.31.1

registry.k8s.io/kube-apiserver:v1.31.1

registry.k8s.io/kube-controller-manager:v1.31.1

registry.k8s.io/kube-scheduler:v1.31.1

registry.k8s.io/kube-proxy:v1.31.1

registry.k8s.io/coredns/coredns:v1.11.3

registry.k8s.io/pause:3.10

registry.k8s.io/etcd:3.5.15-0



# 下载镜像到本地

for i in $(kubeadm config images list --kubernetes-version v1.31.1); do

docker pull $i

done

image.png

初始化集群

1
2
3
4
5
6
7
8
9
10
11
kubeadm init \

--apiserver-advertise-address=172.16.1.101 \

--kubernetes-version=v1.31.1 \

--service-cidr=10.96.0.0/12 \

--pod-network-cidr=10.244.0.0/16 \

--cri-socket=unix:///var/run/cri-dockerd.sock

配置服务

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
cat >/etc/systemd/system/kubelet.service <<'EOF'

[Unit]

Description=kubelet: The Kubernetes Node Agent

Documentation=https://kubernetes.io/docs/

After=containerd.service

Requires=containerd.service


[Service]

# 不要写死kubeconfig,因为k8s会自动生成一个 kubelet的配置

ExecStart=/usr/local/bin/kubelet

Restart=always

RestartSec=10



[Install]

WantedBy=multi-user.target

EOF

创建 kubeadm 的 drop-in(kubeadm join 会写 flags/env)

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
mkdir -p /etc/systemd/system/kubelet.service.d

cat >/etc/systemd/system/kubelet.service.d/10-kubeadm.conf <<'EOF'

[Service]

Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"

Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"

EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env

EnvironmentFile=-/etc/sysconfig/kubelet

ExecStart=

ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

EOF

!!!!! 这就是 kubeadm 的标准模式:

!!! init/join 前靠 bootstrap-kubelet.conf,join 成功后生成 kubelet.conf 并轮转证书。


# 添加完成服务,执行下面三条添加服务
systemctl daemon-reexec # 这条可以不执行,如果不正常才执行

systemctl daemon-reload

systemctl enable kubelet

重新加入命令,注意如果高版本还是用docker,要添加cri

1
2
3
4
5
# 打印加入命令
kubeadm token create --print-join-command

# 使用生成的命令加入集群
kubeadm join 172.16.1.101:6443 --tokenxxxxx --cri-socket unix:///var/run/cri-dockerd.sock

k8s 加入集群的过程

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
kubeadm join



├─① Preflight 检查(系统条件)



├─② 发现集群 & 校验 CA(discovery)



├─③ 生成 bootstrap-kubelet.conf(临时身份)



├─④ 启动 kubelet(TLS Bootstrap)



├─⑤ CSR 申请证书 → apiserver 签发



└─⑥ Node 注册成功 → Ready

Node join 过程中会生成哪些关键文件(非常重要)

文件 什么时候生成 作用
bootstrap-kubelet.conf join 初期 临时身份
kubelet.conf TLS bootstrap 成功后 正式身份
kubeadm-flags.env join 中 kubelet 启动参数
/var/lib/kubelet/pki/* join 中 kubelet 证书
/etc/cni/net.d/* CNI 正常后 网络配置

最常见的「卡点 → 根因速查表」

卡在哪 日志特征 根因
preflight FileExisting / conntrack 残留文件 / 依赖缺失
discovery x509 / timeout CA hash / 网络
TLS Bootstrap Waiting for TLS Bootstrap CSR 未批准 / kubelet 起不来
注册 Node forbidden modify node 证书身份错
NetworkNotReady cni uninitialized CNI 插件不全
Node 一直 NotReady kubelet 正常但网络不通 CNI / iptables

查看kubelet的日志

1
2
3
systemctl status kubelet --no-pager

journalctl -u kubelet -n 80 --no-pager

如果重新加入有问题, 需要清理集群然后重新 kubeadm join

1
2
3
4
5
6
7
8
9
10
11
12
13
systemctl stop kubelet

kubeadm reset -f --cri-socket unix:///var/run/cri-dockerd.sock(高版本才加)



rm -rf /etc/kubernetes

rm -rf /var/lib/kubelet/pki

rm -f /var/lib/kubelet/kubeadm-flags.env /var/lib/kubelet/config.yaml

systemctl restart containerd

快速判断有没有加入过集群

1
ls -l /var/lib/kubelet/kubeadm-flags.env /var/lib/kubelet/config.yaml  2>/dev/null

image.png

确认证书信息

1
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -subject 2>/dev/null || true

rockylinux 安装网络插件后/opt/cni/bin下没有二进制网络文件怎么解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
安装网络插件 yum install -y containernetworking-plugins(一般是这个) 或者是 yum install -y kubernetes-cni

插件被装到了 /usr/libexec/cni/,而不是 /opt/cni/bin

mkdir -p /opt/cni/bin # 一般不用创建



cp -a /usr/libexec/cni/* /opt/cni/bin/

ls -l /opt/cni/bin | egrep 'loopback|bridge|host-local|portmap'

systemctl restart cri-docker

systemctl restart kubelet

部署k8s-1.31版本踩坑点记录(非安装步骤)
https://blog.t-ao.cn/2026/01/10/部署k8s-1.31版本踩坑点记录(非安装步骤)/
作者
TAO
发布于
2026年1月10日
许可协议