| 运行时 |
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/
麒麟基于centos8,下载二进制的docker
https://download.docker.com/linux/centos/8/x86_64/stable/Packages/
|

安装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
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
|
参照这个网站 https://mirantis.github.io/cri-dockerd/usage/install-manually/

安装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"
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
|

初始化集群
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]
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
|

确认证书信息
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
|