Kubernetes Remove Control Plane Node | Shared Grok Conversation

Skip to main content

Home page

Sign in Sign up

[root@10 ruijieproxy]# kubectl get nodes NAME STATUS ROLES AGE VERSION 10.10.15.79 Ready control-plane,master 377d v1.23.8 shol010015080 Ready control-plane,master 4d1h v1.23.8 怎么把1508的node去了

Worked for 5s

要删除节点 shol010015080(1508),按下面步骤操作(它是 control-plane 节点,操作前请确认集群有其他可用的 master,避免影响控制面):

1. 先驱逐节点上的 Pod(推荐)

Bash

CopyCopied

# 标记为不可调度
kubectl cordon shol010015080

# 驱逐 Pod(忽略 DaemonSet,强制删除)
kubectl drain shol010015080 --ignore-daemonsets --delete-emptydir-data --force

2. 从集群中删除该节点

Bash

CopyCopied

kubectl delete node shol010015080

3. (可选)在节点本机清理

如果节点还要复用或彻底下线,登录到 shol010015080 上执行:

Bash

CopyCopied

# 停止 kubelet 等服务
systemctl stop kubelet
# 如果有 kubeadm,可以重置
kubeadm reset -f
# 清理残留网络/iptables 等(可选)
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm -C

注意事项

需要我帮你写完整的一键脚本或检查当前节点状态的话,告诉我。

[root@k3s ~]# kubectl get nodes -A NAME STATUS ROLES AGE VERSION k3s Ready control-plane 2d9h v1.36.4+k3s1 为什这个没有master

Worked for 5s

这是 正常现象,不是问题。

原因说明

在 K3s 以及较新的 Kubernetes(1.20 之后)中:

所以你现在看到的:

Bash

CopyCopied

NAME   STATUS   ROLES           AGE    VERSION
k3s    Ready    control-plane   2d9h   v1.36.4+k3s1

是正确的,表示这是一个控制平面节点。


对比一下你之前的集群

你之前那个集群是较老的版本(v1.23.8),所以还能看到:

text

CopyCopied

ROLES: control-plane,master

那是旧版本的兼容写法。K3s 直接用了新标准,只显示 control-plane。


如何确认它确实是 master/控制平面?

可以执行:

Bash

CopyCopied

kubectl get nodes -o wide
# 或者更详细地看标签
kubectl get node k3s --show-labels

你会看到类似这些标签:

只要有 control-plane 就说明它是控制平面节点。

控制平面只能有一个还是多个

Worked for 3s

控制平面可以有多个,不是只能有一个。

简单说明

类型 数量 适用场景 说明
单控制平面 1 个 测试、开发、小规模集群 简单,但没有高可用,挂了整个集群就不可用
多控制平面(HA) 通常 3 个或 5 个 生产环境 推荐,有高可用,一个挂了集群还能继续工作

为什么建议多个?

和你现在的情况

你刚才那个 K3s 集群只有一个节点:

Bash

CopyCopied

k3s    Ready    control-plane

这是 单控制平面 模式,完全正常,适合测试或小规模使用。

如果你想做成高可用,可以再加 2 个(或更多)控制平面节点,变成 3 个控制平面。


总结:

需要我告诉你 K3s 怎么加多个控制平面节点吗?

1 master 3worker的集群,容器会运行在master上吗

Worked for 5s

默认情况下:不会。

在标准的 1 Master + 3 Worker 集群中,应用容器(你的业务 Pod) 默认不会 调度到 Master 节点上。

原因

Master(控制平面)节点默认会打上 污点(Taint):

Bash

CopyCopied

node-role.kubernetes.io/control-plane:NoSchedule
# 或者旧版本是
node-role.kubernetes.io/master:NoSchedule

这个污点的作用是: 禁止普通 Pod 调度到 Master 上,只允许带有对应容忍(Toleration)的系统组件运行(比如 kube-apiserver、etcd、coredns、calico 等)。

Worker 节点没有这个污点,所以你的业务容器都会跑在 3 个 Worker 上。


什么情况下会跑到 Master 上?

  1. 你主动去掉了污点(不推荐生产环境):

Bash

CopyCopied

kubectl taint nodes <master节点名> node-role.kubernetes.io/control-plane:NoSchedule-
  1. 某些发行版默认允许(比如 K3s 单节点、部分轻量级集群)。
  2. 你给 Pod 加了容忍,让它能调度到 Master。

如何确认当前情况?

执行下面命令查看:

Bash

CopyCopied

# 查看所有节点的污点
kubectl describe nodes | grep -A 5 Taints

# 或者更简洁
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints

如果 Master 有 NoSchedule 污点,业务 Pod 就不会跑上去。


总结:

需要我教你怎么强制让某些 Pod 跑到 Master,或者怎么查看当前集群的调度情况吗?

[root@10 ~]# kubectl get pods -A ^[[ANAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6d8c4cb4d-6x97t 1/1 Running 1 (2y131d ago) 2y358d
kube-system coredns-6d8c4cb4d-9n5cq 1/1 Running 1 (2y131d ago) 2y358d
kube-system etcd-10.1.10.82 1/1 Running 1 (2y131d ago) 2y358d
kube-system kube-apiserver-10.1.10.82 1/1 Running 1 (2y131d ago) 2y358d
kube-system kube-controller-manager-10.1.10.82 1/1 Running 2 (6d17h ago) 337d
kube-system kube-flannel-ds-4bx6q 1/1 Running 1 (2y131d ago) 2y358d
kube-system kube-proxy-8l246 1/1 Running 1 (2y131d ago) 2y358d
kube-system kube-scheduler-10.1.10.82 1/1 Running 5 (6d17h ago) 2y358d
kube-system nginx-ingress-lv4qm 1/1 Running 1 (2y131d ago) 2y358d
kube-system pushgateway-metrics-776b4b7fcf-tzk76 1/1 Running 1 (2y131d ago) 2y158d
monitoring kube-state-metrics-68fb5dc8ff-xt2vk 3/3 Running 3 (2y131d ago) 2y158d
monitoring node-exporter-bxnv2 2/2 Running 2 (2y131d ago) 2y158d
monitoring prometheus-adapter-77758d867b-qzlrn 1/1 Running 1 (2y131d ago) 2y158d
monitoring prometheus-k8s-0 2/2 Running 2 (2y131d ago) 2y158d
monitoring prometheus-operator-f59c8b954-v6lxj 2/2 Running 2 (2y131d ago) 2y158d
ruijie-smpplus mongo1-0 1/1 Running 5 (416d ago) 2y358d
ruijie-smpplus rg-aggregation-6469978cdb-pmfgb 2/2 Running 1 (6d17h ago) 10d
ruijie-smpplus rg-aiidentify-7767dccf85-dvbvg 1/1 Running 2 (2y131d ago) 2y358d
ruijie-smpplus rg-aitrain-5775474dd8-t9ps2 1/1 Running 2 (2y131d ago) 2y358d
ruijie-smpplus rg-authentication-55559b6f8b-sqt9k 1/1 Running 0 10d
ruijie-smpplus rg-component-548b5c4959-qfnp2 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-eportal-69c4987ffc-9d58z 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-freeradius-777dcf4f4f-7475c 1/1 Running 14 (10d ago) 10d
ruijie-smpplus rg-freeradius-777dcf4f4f-84c5m 1/1 Running 8 (10d ago) 10d
ruijie-smpplus rg-freeradius-777dcf4f4f-kx6ls 1/1 Running 8 (10d ago) 10d
ruijie-smpplus rg-freeradius-777dcf4f4f-rjf8p 1/1 Running 55 (6d21h ago) 2y277d
ruijie-smpplus rg-freeradius-777dcf4f4f-wgvjg 1/1 Running 1 (6d21h ago) 10d
ruijie-smpplus rg-frontend-client-5767c9f6c-qrtkw 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-frontend-portal-6d48c54c9-l8nvv 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-frontend-smp-6645b778b5-pk526 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-license-84cc5dd598-2vv45 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-linkage-devices-c654697c8-rc5t6 1/1 Running 2 (2y131d ago) 2y358d
ruijie-smpplus rg-linkid-5d7c684679-x2t9q 1/1 Running 0 10d
ruijie-smpplus rg-log-68f5587ccc-zx8sp 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-nodecompliance-76cc8ff4df-bg5q2 1/1 Running 2 (2y131d ago) 2y358d
ruijie-smpplus rg-nodeconnector-658cc6fd8f-vv7pw 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-nodeidentify-7548b9f8b9-k4bll 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-nodescanner-659f58677b-hxhvp 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-operations-67ccc76bf5-lrg7l 1/1 Running 1 (2y131d ago) 2y358d
ruijie-smpplus rg-rocket-0 2/2 Running 2 (2y131d ago) 2y358d
ruijie-smpplus rg-sms-middleware-879fcbbb5-gddpf 1/1 Running 1 (2y131d ago) 2y358d
[root@10 ~]# kubectl get nodes -A
NAME STATUS ROLES AGE VERSION
10.1.10.82 Ready control-plane,master 2y358d v1.23.8
[root@10 ~]# 我有一个单节点的集群,能不能给他部署一份一模一样的?不是扩充节点,而是同一个集群,ip不一样而已

Worked for 13s

可以,但要看你具体想实现哪种效果。

你现在是 单节点集群(只有 10.1.10.82 这一个 control-plane),你说的“部署一份一模一样的,不是扩充节点,而是同一个集群,ip不一样而已”,有两种常见理解:
\

1. 想在另一台机器上,再搭一个 完全独立的、一模一样的单节点集群(推荐理解)\

\

2. 想把当前这个集群的 IP 改成另一个 IP,还是同一个集群\

\

建议做法(推荐第1种)\


如果你只是想在新机器上拥有一套 功能一模一样的环境,按下面思路做最稳妥:
\

  1. 新机器重新安装 Kubernetes(建议还是用 kubeadm 装 v1.23.8,保持一致)\
  2. 安装相同的网络插件(你现在用的是 flannel)\
  3. 把现在的应用重新部署过去:\
    • 导出所有 Deployment / StatefulSet / Service / ConfigMap / Secret 等\
    • 或者直接用你们的部署脚本/Helm/YAML 重新装一遍\
  4. 数据迁移(重点):\
    • mongo1-0 这种有状态服务需要把数据拷过去\
    • Prometheus 等监控数据如果需要历史数据,也要迁移
      \

我需要你确认一下\


请告诉我你真实的目的是哪一个:

A. 在另一台服务器上,重新搭一个 独立的、一模一样的单节点集群(新 IP)

B. 想把当前这个集群的 IP 改成另一个 IP(还是原来的集群)

C. 其他想法(请补充说明)

你回复 A、B 或 C,我再给你对应的具体操作步骤。

A. 在另一台服务器上,重新搭一个独立的、一模一样的单节点集群(新 IP) , 修改IP很麻烦?那IP也不改了,我暂时不联网

Worked for 9s

明白了,你的意思是:
\

推荐方案:整机克隆(最接近“一模一样”)\


因为你要的是 一模一样(包括所有 Pod、数据、etcd、证书、配置),最稳妥的方法是直接把当前服务器的磁盘完整克隆到新服务器。
\

操作思路:\

\

  1. 把当前服务器关机(或至少停止 kubelet 和容器运行时,保证数据一致性)\
  2. 用工具把整个磁盘克隆到新服务器,常用方法:\
    • 物理机:用 Clonezilla、dd、Ghost 等工具做磁盘对拷\
    • 虚拟机:直接克隆虚拟机(VMware/Hyper-V/OpenStack 等一键克隆最方便)\
  3. 新服务器启动后:\
    • 不要联网(或把网卡禁用/拔掉网线)\
    • IP 还是原来的 10.1.10.82\
    • 启动后执行 kubectl get nodes 和 kubectl get pods -A,应该和原来几乎一模一样

      这样所有东西都会保留:
      \

如果不能整机克隆(备选方案)\


如果新服务器不能做磁盘克隆,只能重新安装,那就只能:
\

  1. 新服务器安装相同版本的 Kubernetes(v1.23.8)\
  2. 安装相同的网络插件(flannel)\
  3. 把现在所有 YAML 导出再重新部署\
  4. 手动迁移有状态数据(mongo、prometheus 等)

    这种方式 做不到完全一模一样(Pod 名称、创建时间、部分状态都会变),而且比较费时。
    \

建议你先回答我两个问题:\

\

  1. 新服务器是 物理机 还是 虚拟机?\
  2. 能不能做 整盘克隆(Clonezilla / 虚拟机克隆)?

    你告诉我这两点,我再给你对应的具体操作步骤。

    物理机,不能克隆而且不能停机

    Worked for 7s

    明白了,条件是:
    \

整体方案(推荐步骤)\

\

1. 新服务器全新安装 Kubernetes(单节点)\


建议新服务器也装 Kubernetes v1.23.8(和现在保持一致),用 kubeadm 安装。

安装时注意:
\

kubectl get nodes\
kubectl get pods -A\
```\
\
确认只有一个 control-plane 节点,且基础组件都正常。\
\
* * *\
\
#### 2\. 从原集群导出所有应用资源\
\
在 **原集群** 上执行(不影响业务):\
\
Bash\
\
CopyCopied\
\
```\
# 导出所有命名空间的资源(常用)\
kubectl get all,cm,secret,pvc,ingress,sa,role,rolebinding,clusterrole,clusterrolebinding -A -o yaml > all-resources.yaml\
\
# 更完整一点(包含更多资源)\
kubectl get deploy,sts,ds,svc,cm,secret,pvc,ingress,sa,role,rolebinding -A -o yaml > apps.yaml\
```\
\
重点关注这些命名空间:\
\
- ruijie-smpplus(你的核心业务)\
- monitoring\
- kube-system(只需要部分,比如 ingress)\
\
* * *\
\
#### 3\. 处理有状态数据(最关键)\
\
你现在有状态的服务主要是:\
\
- mongo1-0(StatefulSet)\
- prometheus-k8s-0\
- 可能还有其他 PVC\
\
因为 **原集群不能停机**,数据迁移只能用在线方式:\
\
**MongoDB 推荐方式:**\
\
Bash\
\
CopyCopied\
\
```\
# 在原集群 mongo 容器里做备份\
kubectl exec -n ruijie-smpplus mongo1-0 -- mongodump --out /tmp/mongobackup\
\
# 把备份文件拷出来\
kubectl cp ruijie-smpplus/mongo1-0:/tmp/mongobackup ./mongo-backup\
```\
\
然后把备份文件拷到新服务器,恢复进去。\
\
Prometheus 如果需要历史数据,也类似处理(或者直接放弃历史数据,重新开始)。\
\
* * *\
\
#### 4\. 在新集群重新部署\
\
1. 把导出的 YAML 拷到新服务器\
2. 修改 YAML 里可能写死的旧 IP / 旧节点名(如果有的话)\
3. 按顺序创建:\
   - 先创建 Namespace、ConfigMap、Secret、PVC\
   - 再创建 Deployment / StatefulSet / Service\
4. 恢复 Mongo 等数据\
\
* * *\
\
### 我需要你补充几个信息,方便给你更精确的命令\
\
请回答下面几个问题:\
\
1. 新服务器操作系统是什么?(CentOS / Ubuntu / 麒麟?版本?)\
2. 原集群是用 **kubeadm** 装的吗?还是其他方式?\
3. mongo1-0 的数据你是否需要完整迁移?(还是可以接受重新初始化)\
4. 新服务器现在已经装好系统了吗?网络是否已经配置成 10.1.10.82?\
\
你回复这几点后,我按你的实际情况给你一套可直接复制执行的命令。\
\
\[root@10 ~\]# cat /etc/os-release\
NAME="CentOS Linux"\
VERSION="7 (Core)"\
ID="centos"\
ID\_LIKE="rhel fedora"\
VERSION\_ID="7"\
PRETTY\_NAME="CentOS Linux 7 (Core)"\
ANSI\_COLOR="0;31"\
CPE\_NAME="cpe:/o:centos:centos:7"\
HOME\_URL=" [https://www.centos.org/](https://www.centos.org/)"\
BUG\_REPORT\_URL=" [https://bugs.centos.org/](https://bugs.centos.org/)"\
CENTOS\_MANTISBT\_PROJECT="CentOS-7"\
CENTOS\_MANTISBT\_PROJECT\_VERSION="7"\
REDHAT\_SUPPORT\_PRODUCT="centos"\
REDHAT\_SUPPORT\_PRODUCT\_VERSION="7"\
kubectl kubelet, 接受初始化,docker 版本是否有要求\
\
Worked for 15s\
\
**结论先说:**\
\
对于你要装的 **Kubernetes v1.23.8**, **Docker 是有版本要求的**,但范围比较宽松。\
\
### Docker 版本要求(K8s 1.23)\
\
| 项目 | 说明 |\
| --- | --- |\
| **推荐版本** | Docker CE **20.10.x**(最稳妥) |\
| **可用范围** | 19.03 ~ 20.10 都可以 |\
| **不推荐** | 18.x 及更老、或者 23+ 太新的版本 |\
| **是否需要 cri-dockerd** | **不需要**。K8s 1.23 还自带 dockershim,可以直接用 Docker |\
\
> 从 Kubernetes 1.24 开始才移除了 dockershim,必须用 cri-dockerd 才能继续用 Docker。你现在装 1.23.8,直接装 Docker 就行。\
\
* * *\
\
### 推荐安装组合(CentOS 7 单节点)\
\
text\
\
CopyCopied\
\
```\
操作系统:CentOS 7\
Kubernetes:v1.23.8\
容器运行时:Docker CE 20.10\
网络插件:flannel(和原集群保持一致)\
```\
\
* * *\
\
### 关于你提到的问题\
\
1. **kubectl / kubelet**\
\
用 kubeadm 安装时会自动安装对应版本的 kubectl、kubelet、kubeadm(都装 1.23.8)。\
2. **接受初始化**\
\
你已经说了 Mongo 等数据可以重新初始化,那会简单很多,不需要做数据迁移。\
3. **Docker 版本**\
\
建议直接装 **20.10**,兼容性最好。\
\
* * *\
\
### 下一步建议\
\
我可以直接给你一套在 **CentOS 7** 上安装 **Kubernetes 1.23.8 单节点** 的完整命令(包含 Docker 安装 + kubeadm 初始化 + flannel)。\
\
你确认一下:\
\
- 新服务器现在是否已经装好 CentOS 7?\
- 是否已经配置好 IP(暂时不联网也可以)?\
- 是否需要我把 **完整安装命令** 发给你?\
\
回复我“发安装命令”或补充上面信息,我马上给你可直接复制执行的步骤。\
\
\
\
\
\
\
\
35 sources\
\
Dependencies Resolved\
\
\# ===========================================================================================================================================================================\
Package                                                   Arch                      Version                                               Repository                 Size\
\
Installing:\
docker                                                    x86\_64                    2:1.13.1-210.git7d71120.el7.centos                    Extras                     17 M\
Installing for dependencies:\
atomic-registries                                         x86\_64                    1:1.22.1-33.gitb507039.el7\_8                          Extras                     36 k\
container-selinux                                         noarch                    2:2.119.2-1.911c772.el7\_8                             Extras                     40 k\
container-storage-setup                                   noarch                    0.11.0-2.git5eaf76c.el7                               Extras                     35 k\
containers-common                                         x86\_64                    1:0.1.40-11.el7\_8                                     Extras                     43 k\
docker-client                                             x86\_64                    2:1.13.1-210.git7d71120.el7.centos                    Extras                    3.9 M\
docker-common                                             x86\_64                    2:1.13.1-210.git7d71120.el7.centos                    Extras                    101 k\
fuse-overlayfs                                            x86\_64                    0.7.2-6.el7\_8                                         Extras                     54 k\
fuse3-libs                                                x86\_64                    3.6.1-4.el7                                           Extras                     82 k\
libnl                                                     x86\_64                    1.1.4-3.el7                                           Centos                    128 k\
oci-register-machine                                      x86\_64                    1:0-6.git2b44233.el7                                  Extras                    1.1 M\
oci-systemd-hook                                          x86\_64                    1:0.2.0-1.git05e6923.el7\_6                            Extras                     34 k\
oci-umount                                                x86\_64                    2:2.5-3.el7                                           Extras                     33 k\
python-dateutil                                           noarch                    1.5-7.el7                                             Centos                     85 k\
python-dmidecode                                          x86\_64                    3.12.2-4.el7                                          Centos                     83 k\
python-ethtool                                            x86\_64                    0.8-8.el7                                             Centos                     34 k\
python-inotify                                            noarch                    0.9.4-4.el7                                           Centos                     49 k\
python-pytoml                                             noarch                    0.1.14-1.git7dea353.el7                               Extras                     18 k\
python-syspurpose                                         x86\_64                    1.24.42-1.el7.centos                                  Centos                    273 k\
slirp4netns                                               x86\_64                    0.4.3-4.el7\_8                                         Extras                     81 k\
subscription-manager                                      x86\_64                    1.24.42-1.el7.centos                                  Centos                    1.1 M\
subscription-manager-rhsm                                 x86\_64                    1.24.42-1.el7.centos                                  Centos                    331 k\
subscription-manager-rhsm-certificates                    x86\_64                    1.24.42-1.el7.centos                                  Centos                    236 k\
usermode                                                  x86\_64                    1.111-6.el7                                           Centos                    193 k\
yajl                                                      x86\_64                    2.0.4-4.el7                                           Centos                     39 k\
\
\# Transaction Summary\
\
Install  1 Package (+24 Dependent packages)\
\
Total download size: 25 M\
Installed size: 87 M\
Is this ok \[y/d/N\]:  这个版本呢\
\
Worked for 4s\
\
**这个版本绝对不能用!**\
\
你现在 yum 准备安装的是:\
\
text\
\
CopyCopied\
\
```\
docker-1.13.1\
```\
\
这是 CentOS 7 自带的 **非常老的 Docker**(2017 年的版本),完全不支持 Kubernetes 1.23。\
\
### 正确做法\
\
必须安装 **Docker CE 20.10**(官方版本),不要用 CentOS 自带的这个旧包。\
\
请按下面步骤操作(先取消当前安装):\
\
1. 先按 N 取消这次安装。\
2. 然后执行以下命令安装正确的 Docker:\
\
Bash\
\
CopyCopied\
\
```\
# 1. 卸载可能已存在的旧 docker\
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine\
\
# 2. 安装依赖\
yum install -y yum-utils device-mapper-persistent-data lvm2\
\
# 3. 添加 Docker 官方仓库\
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\
\
# 4. 安装指定版本 Docker CE 20.10(推荐)\
yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io\
\
# 如果上面版本找不到,可以用这个(稍新一点也行)\
# yum install -y docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io\
```\
\
3. 安装完成后启动并设置开机自启:\
\
Bash\
\
CopyCopied\
\
```\
systemctl enable --now docker\
docker version\
```\
\
把 docker version 的输出发给我,我确认没问题后再继续下一步装 Kubernetes。\
\
kube下载地址呢\
\
Worked for 18s\
\
**Kubernetes 1.23.8 下载地址(CentOS 7 推荐用阿里云镜像)**\
\
因为官方旧仓库已经冻结,国内最稳定的是 **阿里云镜像**。\
\
### 1\. 配置 Kubernetes yum 源(推荐)\
\
Bash\
\
CopyCopied\
\
```\
cat > /etc/yum.repos.d/kubernetes.repo << EOF\
[kubernetes]\
name=Kubernetes\
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/\
enabled=1\
gpgcheck=0\
repo_gpgcheck=0\
EOF\
```\
\
### 2\. 安装指定版本(1.23.8)\
\
Bash\
\
CopyCopied\
\
```\
yum install -y kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8\
```\
\
### 3\. 设置开机自启\
\
Bash\
\
CopyCopied\
\
```\
systemctl enable kubelet\
```\
\
* * *\
\
### 备用下载方式(二进制手动下载)\
\
如果 yum 源有问题,可以直接从官方下载二进制:\
\
- kubeadm:\
\
[https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubeadm](https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubeadm)\
- kubelet:\
\
[https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubelet](https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubelet)\
- kubectl:\
\
[https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubectl](https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubectl)\
\
* * *\
\
**建议优先用上面的阿里云 yum 源**,最方便。\
\
你先执行配置源 \+ 安装命令,把结果发给我,我继续给你下一步(初始化集群)。\
\
\
\
\
\
\
\
30 sources\
\
手动的,不用源\
\
Worked for 3s\
\
好的,手动下载二进制方式(不依赖 yum 源)。\
\
### 1\. 下载 Kubernetes 1.23.8 二进制文件\
\
Bash\
\
CopyCopied\
\
```\
# 创建目录\
mkdir -p /tmp/k8s && cd /tmp/k8s\
\
# 下载三个核心组件\
curl -LO https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubeadm\
curl -LO https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubelet\
curl -LO https://dl.k8s.io/v1.23.8/bin/linux/amd64/kubectl\
\
# 赋予执行权限\
chmod +x kubeadm kubelet kubectl\
\
# 移动到系统路径\
mv kubeadm kubelet kubectl /usr/bin/\
```\
\
### 2\. 验证是否下载成功\
\
Bash\
\
CopyCopied\
\
```\
kubeadm version\
kubelet --version\
kubectl version --client\
```\
\
看到版本都是 v1.23.8 就说明成功了。\
\
* * *\
\
下载完成后把三个命令的版本输出发给我,我继续给你下一步(配置 kubelet 服务 + 初始化集群)。\
\
为什要这3个?我那个节点只看到 kubectl\
\
Worked for 8s\
\
这是正常的,很多人日常只注意到 kubectl。\
\
### 三个组件分别是干什么的?\
\
| 组件 | 作用 | 是否必须 | 说明 |\
| --- | --- | --- | --- |\
| **kubectl** | 客户端工具 | 必须 | 你平时敲的命令,用来管理集群(查 pod、部署应用等) |\
| **kubelet** | 节点代理 | **必须** | 真正干活的。负责在这台机器上启动/停止容器、上报节点状态。没有它节点就废了 |\
| **kubeadm** | 集群初始化工具 | 安装时必须 | 用来执行 kubeadm init 初始化集群。集群建好后平时不用,但安装时必须有 |\
\
* * *\
\
### 为什么你原节点只看到 kubectl?\
\
因为:\
\
1. **kubelet** 是作为系统服务在后台跑的(systemctl status kubelet),不是你平时手动敲的命令。\
2. **kubeadm** 只在初始化或加入节点时用一次,用完后很多人就不管它了。\
3. 你平时操作集群只用 kubectl,所以只注意到了它。\
\
你可以在原节点执行下面命令确认一下:\
\
Bash\
\
CopyCopied\
\
```\
which kubelet kubeadm kubectl\
systemctl status kubelet\
```\
\
会发现 kubelet 其实是存在并且在运行的。\
\
* * *\
\
**总结:**\
\
- 新机器要搭集群,这三个都要装。\
- 装好后日常主要用 kubectl,kubelet 在后台默默工作。\
\
继续下载那三个文件就行,下载完告诉我。\
\
\[root@SHOL010040066 k8s\]# kubeadm version\
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.8", GitCommit:"a12b886b1da059e0190c54d09c5eab5219dd7acf", GitTreeState:"clean", BuildDate:"2022-06-16T05:56:32Z", GoVersion:"go1.17.11", Compiler:"gc", Platform:"linux/amd64"}\
\[root@SHOL010040066 k8s\]# kubelet --version\
Kubernetes v1.23.8\
\[root@SHOL010040066 k8s\]# kubectl version --client\
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.8", GitCommit:"a12b886b1da059e0190c54d09c5eab5219dd7acf", GitTreeState:"clean", BuildDate:"2022-06-16T05:57:43Z", GoVersion:"go1.17.11", Compiler:"gc", Platform:"linux/amd64"}\
\[root@SHOL010040066 k8s\]#\
\
Worked for 5s\
\
版本正确,三个组件都已经是 **v1.23.8**,很好。\
\
接下来按顺序做下面几步。\
\
### 1\. 先确认 Docker 是否已经装好并启动\
\
请执行:\
\
Bash\
\
CopyCopied\
\
```\
docker version\
systemctl status docker\
```\
\
把结果发给我。\
\
如果 Docker 还没装好,先把 Docker CE 20.10 装上并启动,再继续。\
\
* * *\
\
### 2\. 系统基础配置(必须做)\
\
在确认 Docker 正常后,执行以下命令:\
\
Bash\
\
CopyCopied\
\
```\
# 关闭 swap(必须)\
swapoff -a\
sed -i '/swap/s/^/#/' /etc/fstab\
\
# 关闭防火墙(测试环境可直接关)\
systemctl stop firewalld\
systemctl disable firewalld\
\
# 关闭 SELinux\
setenforce 0\
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config\
\
# 加载内核模块\
modprobe br_netfilter\
modprobe overlay\
\
# 配置内核参数\
cat > /etc/sysctl.d/k8s.conf << EOF\
net.bridge.bridge-nf-call-ip6tables = 1\
net.bridge.bridge-nf-call-iptables = 1\
net.ipv4.ip_forward = 1\
EOF\
\
sysctl --system\
```\
\
* * *\
\
先执行上面的 Docker 检查和系统配置,把结果发我,我再给你下一步(配置 kubelet 服务 + kubeadm init)。\
\
\[root@SHOL010040066 k8s\]# swapoff -a\
\[root@SHOL010040066 k8s\]# sed -i '/swap/s/^/#/' /etc/fstab\
\[root@SHOL010040066 k8s\]# setenforce 0\
setenforce: SELinux is disabled\
\[root@SHOL010040066 k8s\]# modprobe br\_netfilter\
\[root@SHOL010040066 k8s\]# modprobe overlay\
\[root@SHOL010040066 k8s\]# cat > /etc/sysctl.d/k8s.conf << EOF\
\
net.bridge.bridge-nf-call-ip6tables = 1\
net.bridge.bridge-nf-call-iptables = 1\
net.ipv4.ip\_forward = 1\
EOF\
\[root@SHOL010040066 k8s\]# sysctl --system\
\
- Applying /usr/lib/sysctl.d/00-system.conf ...\
net.bridge.bridge-nf-call-ip6tables = 0\
net.bridge.bridge-nf-call-iptables = 0\
net.bridge.bridge-nf-call-arptables = 0\
- Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...\
kernel.yama.ptrace\_scope = 0\
- Applying /usr/lib/sysctl.d/50-default.conf ...\
kernel.sysrq = 16\
kernel.core\_uses\_pid = 1\
kernel.kptr\_restrict = 1\
net.ipv4.conf.default.rp\_filter = 1\
net.ipv4.conf.all.rp\_filter = 1\
net.ipv4.conf.default.accept\_source\_route = 0\
net.ipv4.conf.all.accept\_source\_route = 0\
net.ipv4.conf.default.promote\_secondaries = 1\
net.ipv4.conf.all.promote\_secondaries = 1\
fs.protected\_hardlinks = 1\
fs.protected\_symlinks = 1\
- Applying /etc/sysctl.d/99-sysctl.conf ...\
- Applying /etc/sysctl.d/k8s.conf ...\
net.bridge.bridge-nf-call-ip6tables = 1\
net.bridge.bridge-nf-call-iptables = 1\
net.ipv4.ip\_forward = 1\
- Applying /etc/sysctl.conf ...\
\[root@SHOL010040066 k8s\]# docker version\
Client: Docker Engine - Community\
Version:           20.10.24\
API version:       1.41\
Go version:        go1.19.7\
Git commit:        297e128\
Built:             Tue Apr  4 18:22:57 2023\
OS/Arch:           linux/amd64\
Context:           default\
Experimental:      true\
\
Server: Docker Engine - Community\
Engine:\
Version:          20.10.24\
API version:      1.41 (minimum version 1.12)\
Go version:       go1.19.7\
Git commit:       5d6db84\
Built:            Tue Apr  4 18:21:02 2023\
OS/Arch:          linux/amd64\
Experimental:     false\
containerd:\
Version:          1.6.33\
GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957\
runc:\
Version:          1.1.12\
GitCommit:        v1.1.12-0-g51d5e94\
docker-init:\
Version:          0.19.0\
GitCommit:        de40ad0\
\[root@SHOL010040066 k8s\]# systemctl status docker\
● docker.service - Docker Application Container Engine\
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)\
Active: active (running) since Mon 2026-09-14 13:18:00 CST; 5min ago\
     Docs: [https://docs.docker.com](https://docs.docker.com/)\
Main PID: 2267 (dockerd)\
    Tasks: 12\
Memory: 32.5M\
CGroup: /system.slice/docker.service\
           └─2267 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\
\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.003398283+08:00" level=info msg="ccResolverWrapper: sending update to cc: {\[{unix:///ru...odule=grpc\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.003408808+08:00" level=info msg="ClientConn switching balancer to "pick\_first"" module=grpc\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.036393194+08:00" level=info msg="Loading containers: start."\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.565654174+08:00" level=info msg="Default bridge (docker0) is assigned with an IP addres...P address"\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.708672502+08:00" level=info msg="Firewalld: interface docker0 already part of docker zo...returning"\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.807460260+08:00" level=info msg="Loading containers: done."\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.823175707+08:00" level=info msg="Docker daemon" commit=5d6db84 graphdriver(s)=overlay2 ...n=20.10.24\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.823296287+08:00" level=info msg="Daemon has completed initialization"\
Sep 14 13:18:00 SHOL010040066 systemd\[1\]: Started Docker Application Container Engine.\
Sep 14 13:18:00 SHOL010040066 dockerd\[2267\]: time="2026-09-14T13:18:00.856521773+08:00" level=info msg="API listen on /var/run/docker.sock"\
Hint: Some lines were ellipsized, use -l to show in full.\
\[root@SHOL010040066 k8s\]#\
\
Worked for 5s\
\
Docker 和系统配置都正常,继续下一步。\
\
### 3\. 配置 kubelet 服务\
\
因为我们是手动下载的二进制,需要自己创建 kubelet 的 systemd 服务文件:\
\
Bash\
\
CopyCopied\
\
```\
# 创建 kubelet 服务文件\
cat > /etc/systemd/system/kubelet.service << EOF\
[Unit]\
Description=kubelet: The Kubernetes Node Agent\
Documentation=https://kubernetes.io/docs/home/\
Wants=network-online.target\
After=network-online.target\
\
[Service]\
ExecStart=/usr/bin/kubelet\
Restart=always\
StartLimitInterval=0\
RestartSec=10\
\
[Install]\
WantedBy=multi-user.target\
EOF\
```\
\
Bash\
\
CopyCopied\
\
```\
# 创建 kubelet 配置目录和 drop-in\
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"\
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests"\
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"\
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"\
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"\
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"\
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"\
ExecStart=\
ExecStart=/usr/bin/kubelet \$KUBELET_KUBECONFIG_ARGS \$KUBELET_CONFIG_ARGS \$KUBELET_SYSTEM_PODS_ARGS \$KUBELET_NETWORK_ARGS \$KUBELET_DNS_ARGS \$KUBELET_AUTHZ_ARGS \$KUBELET_CADVISOR_ARGS \$KUBELET_CERTIFICATE_ARGS \$KUBELET_EXTRA_ARGS\
EOF\
```\
\
Bash\
\
CopyCopied\
\
```\
# 重新加载并启动 kubelet\
systemctl daemon-reload\
systemctl enable --now kubelet\
systemctl status kubelet\
```\
\
把 systemctl status kubelet 的结果发给我。\
\
\[root@SHOL010040066 k8s\]# systemctl status kubelet\
● kubelet.service - kubelet: The Kubernetes Node Agent\
Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)\
Drop-In: /etc/systemd/system/kubelet.service.d\
           └─10-kubeadm.conf\
Active: activating (auto-restart) (Result: exit-code) since Mon 2026-09-14 13:24:23 CST; 340ms ago\
     Docs: [https://kubernetes.io/docs/home/](https://kubernetes.io/docs/home/)\
Process: 3234 ExecStart=/usr/bin/kubelet $KUBELET\_KUBECONFIG\_ARGS $KUBELET\_CONFIG\_ARGS $KUBELET\_SYSTEM\_PODS\_ARGS $KUBELET\_NETWORK\_ARGS $KUBELET\_DNS\_ARGS $KUBELET\_AUTHZ\_ARGS $KUBELET\_CADVISOR\_ARGS $KUBELET\_CERTIFICATE\_ARGS $KUBELET\_EXTRA\_ARGS (code=exited, status=1/FAILURE)\
Main PID: 3234 (code=exited, status=1/FAILURE)\
\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: Insecure values: TLS\_ECDHE\_ECDSA\_WITH\_AES\_128\_CBC\_SHA256, TLS\_ECDHE\_ECDSA\_WITH\_RC4\_128\_SHA, TLS\_ECDHE\_RSA\_WITH\_3DES\_EDE\_CBC...\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: --tls-min-version string                                   Minimum TLS version supported. Possible values: VersionTLS10, Ve...\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: --tls-private-key-file string                              File containing x509 private key matching --tls-cert-file. (DEPR...\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: --topology-manager-policy string                           Topology Manager policy to use. Possible values: 'none', 'best-e...\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: --topology-manager-scope string                            Scope to which topology hints applied. Topology Manager collects...\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: -v, --v Level                                                  number for the log level verbosity\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: --version version\[=true\]                                   Print version information and quit\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: --vmodule pattern=N,...                                    comma-separated list of pattern=N settings for file-fi...og format)\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: --volume-plugin-dir string                                 The full path of the directory in which to search for additional...\
Sep 14 13:24:23 SHOL010040066 kubelet\[3234\]: --volume-stats-agg-period duration                         Specifies interval for kubelet to calculate and cache the volume...\
Hint: Some lines were ellipsized, use -l to show in full.\
\[root@SHOL010040066 k8s\]#\
\
Worked for 6s\
\
kubelet 现在报错是 **正常现象**。\
\
因为集群还没初始化,很多配置文件(/var/lib/kubelet/config.yaml 等)还不存在,所以它启动失败。\
\
我们先用一个 **简化版** 的服务文件,等 kubeadm init 完成后再由它自动生成正确配置。\
\
### 重新配置 kubelet 服务(简化版)\
\
Bash\
\
CopyCopied\
\
```\
# 删除之前复杂的配置\
rm -f /etc/systemd/system/kubelet.service.d/10-kubeadm.conf\
\
# 重新写一个简单的服务文件\
cat > /etc/systemd/system/kubelet.service << EOF\
[Unit]\
Description=kubelet: The Kubernetes Node Agent\
Documentation=https://kubernetes.io/docs/home/\
Wants=network-online.target\
After=network-online.target\
\
[Service]\
ExecStart=/usr/bin/kubelet\
Restart=always\
StartLimitInterval=0\
RestartSec=10\
\
[Install]\
WantedBy=multi-user.target\
EOF\
```\
\
Bash\
\
CopyCopied\
\
```\
systemctl daemon-reload\
systemctl restart kubelet\
systemctl status kubelet\
```\
\
现在 kubelet 可能还是会失败(因为还没初始化),这没关系。\
\
接下来直接执行 **kubeadm init**。\
\
请执行下面的初始化命令(单节点):\
\
Bash\
\
CopyCopied\
\
```\
kubeadm init \\
  --kubernetes-version=v1.23.8 \\
  --apiserver-advertise-address=$(hostname -I | awk '{print $1}') \\
  --pod-network-cidr=10.244.0.0/16 \\
  --image-repository registry.aliyuncs.com/google_containers\
```\
\
把完整输出发给我(尤其是最后有没有成功,以及 join 命令)。\
\
\[root@SHOL010040066 k8s\]# systemctl status kubelet\
● kubelet.service - kubelet: The Kubernetes Node Agent\
Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)\
Active: active (running) since Mon 2026-09-14 13:24:49 CST; 248ms ago\
     Docs: [https://kubernetes.io/docs/home/](https://kubernetes.io/docs/home/)\
Main PID: 3332 (kubelet)\
    Tasks: 12\
Memory: 24.0M\
CGroup: /system.slice/kubelet.service\
           └─3332 /usr/bin/kubelet\
\
Sep 14 13:24:49 SHOL010040066 systemd\[1\]: Started kubelet: The Kubernetes Node Agent.\
\[root@SHOL010040066 k8s\]# kubeadm init^C\
\[root@SHOL010040066 k8s\]# kubeadm init \\
\
  --kubernetes-version=v1.23.8\
  --apiserver-advertise-address=$(hostname -I \| awk '{print $1}')\
  --pod-network-cidr=10.244.0.0/16\
  --image-repository registry.aliyuncs.com/google\_containers\
\[init\] Using Kubernetes version: v1.23.8\
\[preflight\] Running pre-flight checks\
\[WARNING Firewalld\]: firewalld is active, please ensure ports \[6443 10250\] are open or your cluster may not function correctly\
\[WARNING FileExisting-socat\]: socat not found in system path\
error execution phase preflight: \[preflight\] Some fatal errors occurred:\
\[ERROR FileExisting-conntrack\]: conntrack not found in system path\
\[ERROR Port-10250\]: Port 10250 is in use\
\[preflight\] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors=...\
To see the stack trace of this error execute with --v=5 or higher\
\[root@SHOL010040066 k8s\]#\
\
Worked for 1s\
\
有几个前置检查报错,我们逐个解决。\
\
### 1\. 先解决这些问题\
\
Bash\
\
CopyCopied\
\
```\
# 关闭防火墙\
systemctl stop firewalld\
systemctl disable firewalld\
\
# 安装缺失的工具\
yum install -y conntrack-tools socat\
\
# 停止当前的 kubelet(因为 10250 端口被占用)\
systemctl stop kubelet\
```\
\
### 2\. 再次执行初始化\
\
Bash\
\
CopyCopied\
\
```\
kubeadm init \\
  --kubernetes-version=v1.23.8 \\
  --apiserver-advertise-address=$(hostname -I | awk '{print $1}') \\
  --pod-network-cidr=10.244.0.0/16 \\
  --image-repository registry.aliyuncs.com/google_containers \\
  --ignore-preflight-errors=FileExisting-conntrack,FileExisting-socat\
```\
\
执行完把完整输出发给我。\
\
需要拉镜像?不联网的,怎么弄\
\
Worked for 3s\
\
对, **不联网** 的情况下,kubeadm init 需要的镜像必须提前准备好。\
\
### 需要的镜像列表(Kubernetes 1.23.8)\
\
text\
\
CopyCopied\
\
```\
registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.8\
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.8\
registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.8\
registry.aliyuncs.com/google_containers/kube-proxy:v1.23.8\
registry.aliyuncs.com/google_containers/pause:3.6\
registry.aliyuncs.com/google_containers/etcd:3.5.1-0\
registry.aliyuncs.com/google_containers/coredns:v1.8.6\
```\
\
* * *\
\
### 解决办法(推荐从原集群导出)\
\
**在原集群机器上操作**(有网络的那台):\
\
Bash\
\
CopyCopied\
\
```\
# 1. 查看原集群正在用的镜像\
docker images | grep -E 'kube-apiserver|kube-controller|kube-scheduler|kube-proxy|pause|etcd|coredns'\
\
# 2. 导出这些镜像(根据实际镜像名调整)\
docker save -o k8s-images.tar \\
  registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.8 \\
  registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.8 \\
  registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.8 \\
  registry.aliyuncs.com/google_containers/kube-proxy:v1.23.8 \\
  registry.aliyuncs.com/google_containers/pause:3.6 \\
  registry.aliyuncs.com/google_containers/etcd:3.5.1-0 \\
  registry.aliyuncs.com/google_containers/coredns:v1.8.6\
```\
\
如果原集群镜像名字不一样(比如是 k8s.gcr.io 或别的),先用 docker images 看实际名字,再导出。\
\
把 k8s-images.tar 拷到新机器后,在新机器执行:\
\
Bash\
\
CopyCopied\
\
```\
docker load -i k8s-images.tar\
docker images\
```\
\
确认镜像都加载成功后,再执行 kubeadm init。\
\
* * *\
\
请先在原集群执行 docker images,把相关镜像名字发给我,我帮你写准确的导出命令。\
\
addon-resizer-1.8.3.tar                        dockerImages                   kube-controller-manager-v1.23.8.tar  nodeidentify-3.3.6-p6.tar\
aggregation-3.3.6-p6-hotfix1-202309131040.tar  eoms                           kube-proxy-v1.23.8.tar               nodescanner-3.3.6-p6.tar\
aggregation-3.3.6-p6.tar                       eportal-3.3.6-p6.tar           kube-scheduler-v1.23.8.tar           operations-3.3.6-p6.tar\
aiidentify-3.3.6-p6.tar                        etcd-3.5.1-0.tar               ldap                                 pause-3.6.tar\
aitrain-3.3.6-p6.tar                           fdfs                           license-3.3.6-p6.tar                 postgres-13.6.tar\
api                                            flannel-cni-plugin-v1.1.2.tar  linkage-devices-3.3.6-p6.tar         rar\
authentication-3.3.6-p6.tar                    flannel-v0.20.2.tar            linkid-3.3.6-p6.tar                  rarlinux-x64-5.3.0.tar.gz\
authentication-api-3.3.3-p1.tar                freeradius-3.3.6-p6.tar        metrics-server\_v0.3.1.tar            rg-log-3.3.6-p6.tar\
busybox-1.30.1.tar                             frontend-client-3.3.6-p6.tar   mgob-1.0.tar                         rocketmq-4.3.0.tar\
calico\_v3.4.3.tar                              frontend-portal-3.3.6-p6.tar   mongo-4.0.24.tar                     rpms\
component-3.3.6-p6.tar                         frontend-smp-3.3.6-p6.tar      nginx-ingress-1.5.1.tar              smpplus-kad-3.3.6-p6\
coredns-v1.8.6.tar                             heapster\_v1.5.4.tar            nodecompliance-3.3.6-p6.tar          sms-middleware-3.3.6-p6.tar\
dashboard\_v1.10.1.tar                          kube-apiserver-v1.23.8.tar     nodeconnector-3.3.6-p6.tar           sourceid-kad-dlmu.r1.3.zip 你看看需要导入哪些\
\
Worked for 9s\
\
根据你列出的文件, **初始化集群必须导入** 的是这些:\
\
### 必须导入(控制平面 \+ 基础组件)\
\
text\
\
CopyCopied\
\
```\
kube-apiserver-v1.23.8.tar\
kube-controller-manager-v1.23.8.tar\
kube-scheduler-v1.23.8.tar\
kube-proxy-v1.23.8.tar\
etcd-3.5.1-0.tar\
coredns-v1.8.6.tar\
pause-3.6.tar\
```\
\
### 网络插件也建议一起导入(你原集群用的是 flannel)\
\
text\
\
CopyCopied\
\
```\
flannel-v0.20.2.tar\
flannel-cni-plugin-v1.1.2.tar\
```\
\
* * *\
\
### 导入命令\
\
在新机器上进入这些 tar 包所在的目录,执行:\
\
Bash\
\
CopyCopied\
\
```\
docker load -i kube-apiserver-v1.23.8.tar\
docker load -i kube-controller-manager-v1.23.8.tar\
docker load -i kube-scheduler-v1.23.8.tar\
docker load -i kube-proxy-v1.23.8.tar\
docker load -i etcd-3.5.1-0.tar\
docker load -i coredns-v1.8.6.tar\
docker load -i pause-3.6.tar\
docker load -i flannel-v0.20.2.tar\
docker load -i flannel-cni-plugin-v1.1.2.tar\
```\
\
导入完成后执行:\
\
Bash\
\
CopyCopied\
\
```\
docker images\
```\
\
把结果发给我,确认镜像名称和标签是否正确,然后我们再执行 kubeadm init。\
\
\[root@SHOL010040066 image\]# docker images\
REPOSITORY                                                        TAG       IMAGE ID       CREATED       SIZE\
rancher/mirrored-flannelcni-flannel-cni-plugin                    v1.1.2    7a2dcab94698   3 years ago   7.97MB\
rancher/mirrored-flannelcni-flannel                               v0.20.2   b5c6c9203f83   3 years ago   59.6MB\
registry.aliyuncs.com/google\_containers/kube-apiserver            v1.23.8   09d62ad3189b   4 years ago   135MB\
registry.aliyuncs.com/google\_containers/kube-proxy                v1.23.8   db4da8720bcb   4 years ago   112MB\
registry.aliyuncs.com/google\_containers/kube-controller-manager   v1.23.8   2b7c5a039984   4 years ago   125MB\
registry.aliyuncs.com/google\_containers/kube-scheduler            v1.23.8   afd180ec7435   4 years ago   53.5MB\
registry.aliyuncs.com/google\_containers/etcd                      3.5.1-0   25f8c7f3da61   4 years ago   293MB\
registry.aliyuncs.com/google\_containers/coredns                   v1.8.6    a4ca41631cc7   4 years ago   46.8MB\
registry.aliyuncs.com/google\_containers/pause                     3.6       6270bb605e12   5 years ago   683kB\
\
Worked for 14s\
\
镜像已经全部导入成功,很好。\
\
现在可以执行初始化了:\
\
Bash\
\
CopyCopied\
\
```\
kubeadm init \\
  --kubernetes-version=v1.23.8 \\
  --apiserver-advertise-address=$(hostname -I | awk '{print $1}') \\
  --pod-network-cidr=10.244.0.0/16 \\
  --image-repository registry.aliyuncs.com/google_containers\
```\
\
执行完把 **完整输出** 发给我(特别是最后有没有出现 “Your Kubernetes control-plane has initialized successfully!” 以及后面的配置命令)。\
\
\[root@SHOL010040066 image\]# kubeadm init \\
\
  --kubernetes-version=v1.23.8\
  --apiserver-advertise-address=$(hostname -I \| awk '{print $1}')\
  --pod-network-cidr=10.244.0.0/16\
  --image-repository registry.aliyuncs.com/google\_containers\
\[init\] Using Kubernetes version: v1.23.8\
\[preflight\] Running pre-flight checks\
\[preflight\] Pulling images required for setting up a Kubernetes cluster\
\[preflight\] This might take a minute or two, depending on the speed of your internet connection\
\[preflight\] You can also perform this action in beforehand using 'kubeadm config images pull'\
\[certs\] Using certificateDir folder "/etc/kubernetes/pki"\
\[certs\] Generating "ca" certificate and key\
\[certs\] Generating "apiserver" certificate and key\
\[certs\] apiserver serving cert is signed for DNS names \[kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local shol010040066\] and IPs \[10.96.0.1 10.10.40.66\]\
\[certs\] Generating "apiserver-kubelet-client" certificate and key\
\[certs\] Generating "front-proxy-ca" certificate and key\
\[certs\] Generating "front-proxy-client" certificate and key\
\[certs\] Generating "etcd/ca" certificate and key\
\[certs\] Generating "etcd/server" certificate and key\
\[certs\] etcd/server serving cert is signed for DNS names \[localhost shol010040066\] and IPs \[10.10.40.66 127.0.0.1 ::1\]\
\[certs\] Generating "etcd/peer" certificate and key\
\[certs\] etcd/peer serving cert is signed for DNS names \[localhost shol010040066\] and IPs \[10.10.40.66 127.0.0.1 ::1\]\
\[certs\] Generating "etcd/healthcheck-client" certificate and key\
\[certs\] Generating "apiserver-etcd-client" certificate and key\
\[certs\] Generating "sa" key and public key\
\[kubeconfig\] Using kubeconfig folder "/etc/kubernetes"\
\[kubeconfig\] Writing "admin.conf" kubeconfig file\
\[kubeconfig\] Writing "kubelet.conf" kubeconfig file\
\[kubeconfig\] Writing "controller-manager.conf" kubeconfig file\
\[kubeconfig\] Writing "scheduler.conf" kubeconfig file\
\[kubelet-start\] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"\
\[kubelet-start\] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"\
\[kubelet-start\] Starting the kubelet\
\[control-plane\] Using manifest folder "/etc/kubernetes/manifests"\
\[control-plane\] Creating static Pod manifest for "kube-apiserver"\
\[control-plane\] Creating static Pod manifest for "kube-controller-manager"\
\[control-plane\] Creating static Pod manifest for "kube-scheduler"\
\[etcd\] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"\
\[wait-control-plane\] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s\
\[kubelet-check\] Initial timeout of 40s passed.\
卡在这里\
\
Worked for 11s\
\
卡在 \[wait-control-plane\] 是常见情况,我们来排查。\
\
请 **新开一个终端**(或者按 Ctrl+C 先中断当前命令也行),然后执行下面几条命令,把结果发给我:\
\
### 1\. 查看 kubelet 日志\
\
Bash\
\
CopyCopied\
\
```\
journalctl -u kubelet -n 50 --no-pager\
```\
\
### 2\. 查看当前容器状态\
\
Bash\
\
CopyCopied\
\
```\
docker ps -a\
```\
\
### 3\. 查看静态 Pod 清单是否生成\
\
Bash\
\
CopyCopied\
\
```\
ls -l /etc/kubernetes/manifests/\
```\
\
### 4\. 查看节点状态(可能暂时连不上)\
\
Bash\
\
CopyCopied\
\
```\
kubectl get nodes\
```\
\
把这几个命令的输出发给我,我帮你定位卡在哪里。\
\
ubernetes.io/no-op"\
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.542917    7196 docker\_service.go:264\] "Docker Info" dockerInfo=&{ID:SFTY:IQ6X:MC62:ZVW3:E6PN:3VN7:C5KU:W6XJ:K4TX:SF4C:I2O7:YVZ7 Containers:0 ContainersRunning:0 ContainersPaused:0 ContainersStopped:0 Images:9 Driver:overlay2 DriverStatus:\[\[Backing Filesystem extfs\] \[Supports d\_type true\] \[Native Overlay Diff true\] \[userxattr false\]\] SystemStatus:\[\] Plugins:{Volume:\[local\] Network:\[bridge host ipvlan macvlan null overlay\] Authorization:\[\] Log:\[awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog\]} MemoryLimit:true SwapLimit:true KernelMemory:true KernelMemoryTCP:true CPUCfsPeriod:true CPUCfsQuota:true CPUShares:true CPUSet:true PidsLimit:true IPv4Forwarding:true BridgeNfIptables:true BridgeNfIP6tables:true Debug:false NFd:27 OomKillDisable:true NGoroutines:34 SystemTime:2026-09-14T13:49:41.536247877+08:00 LoggingDriver:json-file CgroupDriver:cgroupfs CgroupVersion:1 NEventsListener:0 KernelVersion:3.10.0-1160.el7.x86\_64 OperatingSystem:CentOS Linux 7 (Core) OSVersion:7 OSType:linux Architecture:x86\_64 IndexServerAddress: [https://index.docker.io/v1/](https://index.docker.io/v1/) RegistryConfig:0xc00095c070 NCPU:8 MemTotal:16655937536 GenericResources:\[\] DockerRootDir:/home/docker HTTPProxy: HTTPSProxy: NoProxy: Name:SHOL010040066 Labels:\[\] ExperimentalBuild:false ServerVersion:20.10.24 ClusterStore: ClusterAdvertise: Runtimes:map\[io.containerd.runc.v2:{Path:runc Args:\[\] Shim:<nil>} io.containerd.runtime.v1.linux:{Path:runc Args:\[\] Shim:<nil>} runc:{Path:runc Args:\[\] Shim:<nil>}\] DefaultRuntime:runc Swarm:{NodeID: NodeAddr: LocalNodeState:inactive ControlAvailable:false Error: RemoteManagers:\[\] Nodes:0 Managers:0 Cluster:<nil> Warnings:\[\]} LiveRestoreEnabled:false Isolation: InitBinary:docker-init ContainerdCommit:{ID:d2d58213f83a351ca8f528a95fbd145f5654e957 Expected:d2d58213f83a351ca8f528a95fbd145f5654e957} RuncCommit:{ID:v1.1.12-0-g51d5e94 Expected:v1.1.12-0-g51d5e94} InitCommit:{ID:de40ad0 Expected:de40ad0} SecurityOptions:\[name=seccomp,profile=default\] ProductLicense: DefaultAddressPools:\[\] Warnings:\[\]}\
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.542945    7196 docker\_service.go:279\] "Setting cgroupDriver" cgroupDriver="cgroupfs"\
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.553114    7196 kubelet.go:422\] "Kubelet is running in standalone mode, will skip API server sync"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.560798    7196 kuberuntime\_manager.go:249\] "Container runtime initialized" containerRuntime="docker" version="20.10.24" apiVersion="1.41.0"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561127    7196 volume\_host.go:75\] "KubeClient is nil. Skip initialization of CSIDriverLister"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: W0914 13:49:41.561432    7196 csi\_plugin.go:189\] kubernetes.io/csi: kubeclient not set, assuming standalone kubelet
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: W0914 13:49:41.561451    7196 csi\_plugin.go:268\] Skipping CSINode initialization, kubelet running in standalone mode
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561638    7196 server.go:1244\] "Started kubelet"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561693    7196 kubelet.go:1461\] "No API server defined - no node status update will be sent"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: E0914 13:49:41.561715    7196 kubelet.go:1351\] "Image garbage collection failed once. Stats initialization may not have completed yet" err="failed to get imageFs info: unable to find data in memory cache"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561753    7196 server.go:177\] "Starting to listen read-only" address="0.0.0.0" port=10255
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561754    7196 server.go:150\] "Starting to listen" address="0.0.0.0" port=10250
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.563720    7196 server.go:410\] "Adding debug handlers to kubelet server"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.563850    7196 fs\_resource\_analyzer.go:67\] "Starting FS ResourceAnalyzer"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.565555    7196 volume\_manager.go:291\] "Starting Kubelet Volume Manager"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.565659    7196 desired\_state\_of\_world\_populator.go:147\] "Desired state populator starts to run"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.626006    7196 kubelet\_network\_linux.go:57\] "Initialized protocol iptables rules." protocol=IPv4
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645382    7196 cpu\_manager.go:213\] "Starting CPU manager" policy="none"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645406    7196 cpu\_manager.go:214\] "Reconciling" reconcilePeriod="10s"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645423    7196 state\_mem.go:36\] "Initialized new in-memory state store"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645605    7196 state\_mem.go:88\] "Updated default CPUSet" cpuSet=""
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645619    7196 state\_mem.go:96\] "Updated CPUSet assignments" assignments=map\[\]
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645630    7196 policy\_none.go:49\] "None policy: Start"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.646547    7196 memory\_manager.go:168\] "Starting memorymanager" policy="None"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.646570    7196 state\_mem.go:35\] "Initializing new in-memory state store"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.646736    7196 state\_mem.go:75\] "Updated machine memory state"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.647472    7196 manager.go:610\] "Failed to read data from checkpoint" checkpoint="kubelet\_internal\_checkpoint" err="checkpoint is not found"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.647755    7196 plugin\_manager.go:114\] "Starting Kubelet Plugin Manager"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.686468    7196 kubelet\_network\_linux.go:57\] "Initialized protocol iptables rules." protocol=IPv6
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.686522    7196 status\_manager.go:157\] "Kubernetes client is nil, not starting status manager"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.686541    7196 kubelet.go:2028\] "Starting kubelet main sync loop"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: E0914 13:49:41.686591    7196 kubelet.go:2052\] "Skipping pod synchronization" err="PLEG is not healthy: pleg has yet to be successful"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.766744    7196 reconciler.go:157\] "Reconciler: start to sync state"
\[root@SHOL010040066 ~\]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
\[root@SHOL010040066 ~\]# ls -l /etc/kubernetes/manifests/
total 16
-rw------- 1 root root 2294 Sep 14 13:49 etcd.yaml
-rw------- 1 root root 3362 Sep 14 13:49 kube-apiserver.yaml
-rw------- 1 root root 2878 Sep 14 13:49 kube-controller-manager.yaml
-rw------- 1 root root 1464 Sep 14 13:49 kube-scheduler.yaml
\[root@SHOL010040066 ~\]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
\[root@SHOL010040066 ~\]#

Worked for 11s

问题找到了:静态 Pod 的 yaml 已经生成,但 **kubelet 没有把它们启动起来**(docker ps -a 是空的)。

### 先检查一下关键配置

请执行下面几条命令,把结果发给我:

Bash

CopyCopied

1. 看 kubelet 启动参数

cat /var/lib/kubelet/kubeadm-flags.env

2. 看 apiserver 的镜像是否正确

grep image: /etc/kubernetes/manifests/kube-apiserver.yaml

3. 看 kubelet 配置里的 cgroup 驱动

grep cgroup /var/lib/kubelet/config.yaml

4. 再看一次最新的 kubelet 日志(重点看有没有报错)

journalctl -u kubelet -n 30 --no-pager | tail -30


另外,我们强制重启一下 kubelet,让它重新加载静态 Pod:

Bash

CopyCopied

systemctl restart kubelet sleep 5 docker ps -a


把以上命令的输出都发给我。

\[root@SHOL010040066 ~\]# # 1. 看 kubelet 启动参数
\[root@SHOL010040066 ~\]# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET\_KUBEADM\_ARGS="--network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google\_containers/pause:3.6"
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 2. 看 apiserver 的镜像是否正确
\[root@SHOL010040066 ~\]# grep image: /etc/kubernetes/manifests/kube-apiserver.yaml
    image: registry.aliyuncs.com/google\_containers/kube-apiserver:v1.23.8
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 3. 看 kubelet 配置里的 cgroup 驱动
\[root@SHOL010040066 ~\]# grep cgroup /var/lib/kubelet/config.yaml
cgroupDriver: systemd
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 4. 再看一次最新的 kubelet 日志(重点看有没有报错)
\[root@SHOL010040066 ~\]# journalctl -u kubelet -n 30 --no-pager \| tail -30
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.560798    7196 kuberuntime\_manager.go:249\] "Container runtime initialized" containerRuntime="docker" version="20.10.24" apiVersion="1.41.0"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561127    7196 volume\_host.go:75\] "KubeClient is nil. Skip initialization of CSIDriverLister"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: W0914 13:49:41.561432    7196 csi\_plugin.go:189\] kubernetes.io/csi: kubeclient not set, assuming standalone kubelet
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: W0914 13:49:41.561451    7196 csi\_plugin.go:268\] Skipping CSINode initialization, kubelet running in standalone mode
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561638    7196 server.go:1244\] "Started kubelet"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561693    7196 kubelet.go:1461\] "No API server defined - no node status update will be sent"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: E0914 13:49:41.561715    7196 kubelet.go:1351\] "Image garbage collection failed once. Stats initialization may not have completed yet" err="failed to get imageFs info: unable to find data in memory cache"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561753    7196 server.go:177\] "Starting to listen read-only" address="0.0.0.0" port=10255
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.561754    7196 server.go:150\] "Starting to listen" address="0.0.0.0" port=10250
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.563720    7196 server.go:410\] "Adding debug handlers to kubelet server"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.563850    7196 fs\_resource\_analyzer.go:67\] "Starting FS ResourceAnalyzer"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.565555    7196 volume\_manager.go:291\] "Starting Kubelet Volume Manager"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.565659    7196 desired\_state\_of\_world\_populator.go:147\] "Desired state populator starts to run"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.626006    7196 kubelet\_network\_linux.go:57\] "Initialized protocol iptables rules." protocol=IPv4
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645382    7196 cpu\_manager.go:213\] "Starting CPU manager" policy="none"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645406    7196 cpu\_manager.go:214\] "Reconciling" reconcilePeriod="10s"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645423    7196 state\_mem.go:36\] "Initialized new in-memory state store"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645605    7196 state\_mem.go:88\] "Updated default CPUSet" cpuSet=""
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645619    7196 state\_mem.go:96\] "Updated CPUSet assignments" assignments=map\[\]
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.645630    7196 policy\_none.go:49\] "None policy: Start"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.646547    7196 memory\_manager.go:168\] "Starting memorymanager" policy="None"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.646570    7196 state\_mem.go:35\] "Initializing new in-memory state store"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.646736    7196 state\_mem.go:75\] "Updated machine memory state"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.647472    7196 manager.go:610\] "Failed to read data from checkpoint" checkpoint="kubelet\_internal\_checkpoint" err="checkpoint is not found"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.647755    7196 plugin\_manager.go:114\] "Starting Kubelet Plugin Manager"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.686468    7196 kubelet\_network\_linux.go:57\] "Initialized protocol iptables rules." protocol=IPv6
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.686522    7196 status\_manager.go:157\] "Kubernetes client is nil, not starting status manager"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.686541    7196 kubelet.go:2028\] "Starting kubelet main sync loop"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: E0914 13:49:41.686591    7196 kubelet.go:2052\] "Skipping pod synchronization" err="PLEG is not healthy: pleg has yet to be successful"
Sep 14 13:49:41 SHOL010040066 kubelet\[7196\]: I0914 13:49:41.766744    7196 reconciler.go:157\] "Reconciler: start to sync state"
\[root@SHOL010040066 ~\]# systemctl restart kubelet
\[root@SHOL010040066 ~\]# sleep 5
\[root@SHOL010040066 ~\]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
\[root@SHOL010040066 ~\]#

Worked for 3s

**找到根本原因了!**

**cgroup 驱动不一致**:

- Docker 用的是:cgroupfs
- kubelet 配置的是:systemd

这会导致静态 Pod 无法启动。

### 立即修复

Bash

CopyCopied

1. 修改 kubelet 配置,改成 cgroupfs

sed -i 's/cgroupDriver: systemd/cgroupDriver: cgroupfs/' /var/lib/kubelet/config.yaml

2. 确认修改成功

grep cgroupDriver /var/lib/kubelet/config.yaml

3. 重启 kubelet

systemctl restart kubelet

4. 等待几秒后查看容器

sleep 8 docker ps -a


把 docker ps -a 的结果发给我。

如果能看到 kube-apiserver、etcd 等容器起来了,就说明问题解决了。

Worked for 3s

还是没起来。我们继续深入查。

请执行下面这些命令:

Bash

CopyCopied

1. 确认静态 Pod 路径配置

grep staticPodPath /var/lib/kubelet/config.yaml

2. 查看完整的 kubelet 配置(重点看几个关键项)

cat /var/lib/kubelet/config.yaml | grep -E 'staticPodPath|cgroupDriver|podCIDR|address'

3. 手动尝试用 docker 启动一个 pause 容器测试

docker run -d --name test-pause registry.aliyuncs.com/google_containers/pause:3.6 docker ps -a

4. 查看最新 kubelet 日志有没有新的报错

journalctl -u kubelet -n 50 --no-pager | grep -E 'error|Error|failed|Failed|static|manifest' -i


把结果发给我。

\[root@SHOL010040066 ~\]# # 1. 确认静态 Pod 路径配置
\[root@SHOL010040066 ~\]# grep staticPodPath /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 2. 查看完整的 kubelet 配置(重点看几个关键项)
\[root@SHOL010040066 ~\]# cat /var/lib/kubelet/config.yaml \| grep -E 'staticPodPath\|cgroupDriver\|podCIDR\|address'
cgroupDriver: cgroupfs
staticPodPath: /etc/kubernetes/manifests
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 3. 手动尝试用 docker 启动一个 pause 容器测试
\[root@SHOL010040066 ~\]# docker run -d --name test-pause registry.aliyuncs.com/google\_containers/pause:3.6
beb80228bccf1e8b45ecd9169cf1289842c448b520f9565ab099a0ad2f7d2fad

docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: time="2026-09-14T13:54:20+08:00" level=fatal msg="failed to set gateway while updating gateway: route for the gateway 127.17.0.1 could not be found: invalid argument": unknown.
\[root@SHOL010040066 ~\]# docker ps -a
CONTAINER ID   IMAGE                                               COMMAND    CREATED                  STATUS    PORTS     NAMES
beb80228bccf   registry.aliyuncs.com/google\_containers/pause:3.6   "/pause"   Less than a second ago   Created             test-pause
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 4. 查看最新 kubelet 日志有没有新的报错
\[root@SHOL010040066 ~\]# journalctl -u kubelet -n 50 --no-pager \| grep -E 'error\|Error\|failed\|Failed\|static\|manifest' -i
Sep 14 13:53:34 SHOL010040066 kubelet\[8534\]: I0914 13:53:34.276881    8534 docker\_service.go:264\] "Docker Info" dockerInfo=&{ID:SFTY:IQ6X:MC62:ZVW3:E6PN:3VN7:C5KU:W6XJ:K4TX:SF4C:I2O7:YVZ7 Containers:0 ContainersRunning:0 ContainersPaused:0 ContainersStopped:0 Images:9 Driver:overlay2 DriverStatus:\[\[Backing Filesystem extfs\] \[Supports d\_type true\] \[Native Overlay Diff true\] \[userxattr false\]\] SystemStatus:\[\] Plugins:{Volume:\[local\] Network:\[bridge host ipvlan macvlan null overlay\] Authorization:\[\] Log:\[awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog\]} MemoryLimit:true SwapLimit:true KernelMemory:true KernelMemoryTCP:true CPUCfsPeriod:true CPUCfsQuota:true CPUShares:true CPUSet:true PidsLimit:true IPv4Forwarding:true BridgeNfIptables:true BridgeNfIP6tables:true Debug:false NFd:25 OomKillDisable:true NGoroutines:34 SystemTime:2026-09-14T13:53:34.271110058+08:00 LoggingDriver:json-file CgroupDriver:cgroupfs CgroupVersion:1 NEventsListener:0 KernelVersion:3.10.0-1160.el7.x86\_64 OperatingSystem:CentOS Linux 7 (Core) OSVersion:7 OSType:linux Architecture:x86\_64 IndexServerAddress: [https://index.docker.io/v1/](https://index.docker.io/v1/) RegistryConfig:0xc000174770 NCPU:8 MemTotal:16655937536 GenericResources:\[\] DockerRootDir:/home/docker HTTPProxy: HTTPSProxy: NoProxy: Name:SHOL010040066 Labels:\[\] ExperimentalBuild:false ServerVersion:20.10.24 ClusterStore: ClusterAdvertise: Runtimes:map\[io.containerd.runc.v2:{Path:runc Args:\[\] Shim:<nil>} io.containerd.runtime.v1.linux:{Path:runc Args:\[\] Shim:<nil>} runc:{Path:runc Args:\[\] Shim:<nil>}\] DefaultRuntime:runc Swarm:{NodeID: NodeAddr: LocalNodeState:inactive ControlAvailable:false Error: RemoteManagers:\[\] Nodes:0 Managers:0 Cluster:<nil> Warnings:\[\]} LiveRestoreEnabled:false Isolation: InitBinary:docker-init ContainerdCommit:{ID:d2d58213f83a351ca8f528a95fbd145f5654e957 Expected:d2d58213f83a351ca8f528a95fbd145f5654e957} RuncCommit:{ID:v1.1.12-0-g51d5e94 Expected:v1.1.12-0-g51d5e94} InitCommit:{ID:de40ad0 Expected:de40ad0} SecurityOptions:\[name=seccomp,profile=default\] ProductLicense: DefaultAddressPools:\[\] Warnings:\[\]}
Sep 14 13:53:34 SHOL010040066 kubelet\[8534\]: E0914 13:53:34.295322    8534 kubelet.go:1351\] "Image garbage collection failed once. Stats initialization may not have completed yet" err="failed to get imageFs info: unable to find data in memory cache"
Sep 14 13:53:34 SHOL010040066 kubelet\[8534\]: I0914 13:53:34.373406    8534 manager.go:610\] "Failed to read data from checkpoint" checkpoint="kubelet\_internal\_checkpoint" err="checkpoint is not found"

Worked for 5s

**问题定位到了!**

Docker 本身已经坏了,连最简单的 pause 容器都启动不了:

text

CopyCopied

failed to set gateway while updating gateway: route for the gateway 127.17.0.1 could not be found


这是 Docker 网络(docker0 网桥)出了问题。

### 修复 Docker 网络

请按顺序执行:

Bash

CopyCopied

1. 停止 Docker

systemctl stop docker

2. 清理可能有问题的网络

ip link delete docker0 2>/dev/null || true iptables -t nat -F iptables -t filter -F iptables -t mangle -F iptables -F iptables -X

3. 重新启动 Docker

systemctl start docker

4. 再次测试能否启动容器

docker rm -f test-pause 2>/dev/null || true docker run -d --name test-pause registry.aliyuncs.com/google_containers/pause:3.6

5. 查看结果

docker ps -a


把最后的 docker ps -a 结果发给我。

\[root@SHOL010040066 ~\]# # 1. 停止 Docker
\[root@SHOL010040066 ~\]# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 2. 清理可能有问题的网络
\[root@SHOL010040066 ~\]# ip link delete docker0 2>/dev/null \|\| true
\[root@SHOL010040066 ~\]# iptables -t nat -F
\[root@SHOL010040066 ~\]# iptables -t filter -F
\[root@SHOL010040066 ~\]# iptables -t mangle -F
\[root@SHOL010040066 ~\]# iptables -F
\[root@SHOL010040066 ~\]# iptables -X
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 3. 重新启动 Docker
\[root@SHOL010040066 ~\]# systemctl start docker
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 4. 再次测试能否启动容器
\[root@SHOL010040066 ~\]# docker rm -f test-pause 2>/dev/null \|\| true
test-pause
\[root@SHOL010040066 ~\]# docker run -d --name test-pause registry.aliyuncs.com/google\_containers/pause:3.6
2e1362b27c113360a2378387ab3aed1fd78d46c60bed68873dc0b43f008ccfed
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: time="2026-09-14T13:54:40+08:00" level=fatal msg="failed to set gateway while updating gateway: route for the gateway 127.17.0.1 could not be found: invalid argument": unknown.
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 5. 查看结果
\[root@SHOL010040066 ~\]# docker ps -a
CONTAINER ID   IMAGE                                               COMMAND    CREATED        STATUS    PORTS     NAMES
2e1362b27c11   registry.aliyuncs.com/google\_containers/pause:3.6   "/pause"   1 second ago   Created             test-pause
\[root@SHOL010040066 ~\]#

Worked for 4s

问题还在。错误里的网关是 127.17.0.1(注意是 127 开头,不正常,正常应该是 172.17.0.1)。

这说明 Docker 的网络配置被改过或者有冲突。

请执行下面命令,把结果发给我:

Bash

CopyCopied

1. 查看 Docker 网络

docker network ls docker network inspect bridge

2. 查看 Docker 配置文件

cat /etc/docker/daemon.json 2>/dev/null || echo "没有 daemon.json"

3. 查看当前路由和 docker0

ip addr show docker0 ip route | grep -E 'docker|172.17|127.17'

4. 查看是否有自定义网络配置

ls -l /etc/docker/


\[root@SHOL010040066 ~\]# docker network inspect bridge
\[\
    {\
        "Name": "bridge",\
        "Id": "ee978ca346c0cdf9326d4d90da95663d49e361dcdb5d691cb90b5a8ace529431",\
        "Created": "2026-09-14T13:54:40.075504512+08:00",\
        "Scope": "local",\
        "Driver": "bridge",\
        "EnableIPv6": false,\
        "IPAM": {\
            "Driver": "default",\
            "Options": null,\
            "Config": \[\
                {\
                    "Subnet": "127.17.0.0/24",\
                    "Gateway": "127.17.0.1"\
                }\
            \]\
        },\
        "Internal": false,\
        "Attachable": false,\
        "Ingress": false,\
        "ConfigFrom": {\
            "Network": ""\
        },\
        "ConfigOnly": false,\
        "Containers": {},\
        "Options": {\
            "com.docker.network.bridge.default\_bridge": "true",\
            "com.docker.network.bridge.enable\_icc": "true",\
            "com.docker.network.bridge.enable\_ip\_masquerade": "true",\
            "com.docker.network.bridge.host\_binding\_ipv4": "0.0.0.0",\
            "com.docker.network.bridge.name": "docker0",\
            "com.docker.network.driver.mtu": "1500"\
        },\
        "Labels": {}\
    }\
\]
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 2. 查看 Docker 配置文件
\[root@SHOL010040066 ~\]# cat /etc/docker/daemon.json 2>/dev/null \|\| echo "没有 daemon.json"
{
"registry-mirrors": \[" [https://registry.docker-cn.com](https://registry.docker-cn.com/)", " [https://hub-mirror.c.163.com](https://hub-mirror.c.163.com/)", " [https://3r8alx0a.mirror.aliyuncs.com](https://3r8alx0a.mirror.aliyuncs.com/)"\],
"insecure-registries":\[\],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
"data-root": "/home/docker",
"bip":"127.17.0.1/24"
}
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 3. 查看当前路由和 docker0
\[root@SHOL010040066 ~\]# ip addr show docker0
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:35:5a:a2:f4 brd ff:ff:ff:ff:ff:ff
    inet 127.17.0.1/24 brd 127.17.0.255 scope global docker0
       valid\_lft forever preferred\_lft forever
    inet6 fe80::42:35ff:fe5a:a2f4/64 scope link
       valid\_lft forever preferred\_lft forever
\[root@SHOL010040066 ~\]# ip route \| grep -E 'docker\|172.17\|127.17'
127.17.0.0/24 dev docker0 proto kernel scope link src 127.17.0.1
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 4. 查看是否有自定义网络配置
\[root@SHOL010040066 ~\]# ls -l /etc/docker/
total 8
-rw-r--r-- 1 root root 369 Sep 14 13:36 daemon.json
-rw------- 1 root root 244 Sep 14 13:18 key.json
\[root@SHOL010040066 ~\]#

Worked for 15s

**找到根因了!**

/etc/docker/daemon.json 里有这一行:

JSON

CopyCopied

"bip":"127.17.0.1/24"


这是把 Docker 网桥地址设置成了 127.17.0.1(回环地址段),这是 **非法的**,所以容器无法启动。

### 修复方法

Bash

CopyCopied

1. 修改 daemon.json,把 bip 改成正常的地址

cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://registry.docker-cn.com", "https://hub-mirror.c.163.com", "https://3r8alx0a.mirror.aliyuncs.com"], "insecure-registries":[], "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-size": "10m", "max-file": "3" }, "data-root": "/home/docker", "bip": "172.17.0.1/16" } EOF


Bash

CopyCopied

2. 重启 Docker

systemctl restart docker

3. 测试容器能否启动

docker rm -f test-pause 2>/dev/null || true docker run -d --name test-pause registry.aliyuncs.com/google_containers/pause:3.6 docker ps -a


把最后的 docker ps -a 结果发给我。

\[root@SHOL010040066 ~\]# systemctl restart docker

\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 3. 测试容器能否启动
\[root@SHOL010040066 ~\]# docker rm -f test-pause 2>/dev/null \|\| true
test-pause
\[root@SHOL010040066 ~\]# docker run -d --name test-pause registry.aliyuncs.com/google\_containers/pause:3.6
87f8fac72af2692548109eb7272bde210484df0c98b4b6862561a03bebda319c
\[root@SHOL010040066 ~\]# docker ps -a
CONTAINER ID   IMAGE                                               COMMAND    CREATED                  STATUS                  PORTS     NAMES
87f8fac72af2   registry.aliyuncs.com/google\_containers/pause:3.6   "/pause"   Less than a second ago   Up Less than a second             test-pause
\[root@SHOL010040066 ~\]# docker ps -a
CONTAINER ID   IMAGE                                               COMMAND    CREATED         STATUS         PORTS     NAMES
87f8fac72af2   registry.aliyuncs.com/google\_containers/pause:3.6   "/pause"   3 seconds ago   Up 3 seconds             test-pause
\[root@SHOL010040066 ~\]#

Worked for 2s

Docker 已经修好了!容器可以正常启动。

现在让 kubelet 重新拉起控制平面组件:

Bash

CopyCopied

1. 清理测试容器

docker rm -f test-pause

2. 重启 kubelet

systemctl restart kubelet

3. 等待 10 秒后查看容器

sleep 10 docker ps -a


把 docker ps -a 的结果发给我,应该能看到 etcd、kube-apiserver 等容器了。

\[root@SHOL010040066 ~\]# # 1. 清理测试容器
\[root@SHOL010040066 ~\]# docker rm -f test-pause
test-pause
\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 2. 重启 kubelet
\[root@SHOL010040066 ~\]# systemctl restart kubelet

\[root@SHOL010040066 ~\]#
\[root@SHOL010040066 ~\]# # 3. 等待 10 秒后查看容器
\[root@SHOL010040066 ~\]# sleep 10
\[root@SHOL010040066 ~\]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
\[root@SHOL010040066 ~\]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
\[root@SHOL010040066 ~\]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2026-09-14 13:56:23 CST; 15s ago
     Docs: [https://kubernetes.io/docs/home/](https://kubernetes.io/docs/home/)
Main PID: 10130 (kubelet)
    Tasks: 17
Memory: 32.8M
CGroup: /system.slice/kubelet.service
           └─10130 /usr/bin/kubelet

Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.727740   10130 state\_mem.go:36\] "Initialized new in-memory state store"
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.727907   10130 state\_mem.go:88\] "Updated default CPUSet" cpuSet=""
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.727945   10130 state\_mem.go:96\] "Updated CPUSet assignments" assignments=map\[\]
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.727957   10130 policy\_none.go:49\] "None policy: Start"
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.728814   10130 memory\_manager.go:168\] "Starting memorymanager" policy="None"
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.728850   10130 state\_mem.go:35\] "Initializing new in-memory state store"
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.728994   10130 state\_mem.go:75\] "Updated machine memory state"
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.729646   10130 manager.go:610\] "Failed to read data from checkpoint" checkpoint="kubelet\_internal...not found"
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.729934   10130 plugin\_manager.go:114\] "Starting Kubelet Plugin Manager"
Sep 14 13:56:23 SHOL010040066 kubelet\[10130\]: I0914 13:56:23.852902   10130 reconciler.go:157\] "Reconciler: start to sync state"
Hint: Some lines were ellipsized, use -l to show in full.
\[root@SHOL010040066 ~\]#

Free tier limit reached

Try again later or upgrade to SuperGrok for much higher limits and premium features.

Sign up for free

Sign in to continue conversation

Kubernetes Remove Control Plane Node \| Shared Grok Conversation

StripeM-Inner