Kubernetes 集群部署实战:从模板节点到集群重建(kubeadm v1.30.2)

整理自 2026-08-05 的终端实操日志(模板节点准备,10:40—11:37)。日志部分保留原始时间戳;

📑 目录

#章节核心内容
模板节点基础环境准备hosts、swap、chrony、IPVS 内核、sysctl、containerd、nerdctl、kubeadm、补全、快照
准备节点:克隆虚拟机与网络完全克隆 3 台虚拟机,设置主机名与 netplan 静态 IP
创建集群kubeadm 下载镜像、初始化集群
配置集群配置凭据、calico 网络、节点加入、验证部署
节点管理kubectl get / describe nodes
删除节点drain → delete → reset 全流程
删除集群先删 worker 再删 master
重建集群通过 kubeadm.yml 配置文件重建
命令速查表常用命令汇总与小结

一、模板节点基础环境准备

日志实录 2026-08-05 10:40 — 11:37,在模板机 ubuntu2204 上完成 K8s 全部基础环境,最后关机打快照,后续用该快照克隆出 3 台节点。

1.1 前置准备(日志开始前已完成)

历史记录显示模板机已提前完成:

  • 替换华为云 Ubuntu 源、配置 docker-ce 源(华为云)与 kubernetes 阿里云源(v1.30 版本库)
  • 安装基础工具:vim lrzsz bash-completion open-vm-tools apt-transport-https sshpass
  • 定制 PS1 提示符(彩色 + 显示时间 \t),并开启 HISTTIMEFORMAT 历史时间记录

1.2 配置 /etc/hosts 域名解析

root@ubuntu2204 ~ 10:40:48# cat << 'EOF' >> /etc/hosts

###### kubernetes #####
10.1.8.30 master30.ningcode.cn master30
10.1.8.31 worker31.ningcode.cn worker31
10.1.8.32 worker32.ningcode.cn worker32
EOF

后续又追加了内网镜像仓库记录:192.168.46.201 hub.laoma.cloud(见 11:15 cat /etc/hosts 验证输出)。

1.3 关闭 swap

K8s 要求关闭 swap:

root@ubuntu2204 ~ 10:41:20# swapoff -a && sed -i '/^.*swap/d' /etc/fstab
root@ubuntu2204 ~ 10:41:26# rm -f /swap.img

1.4 时间同步 chrony

root@ubuntu2204 ~ 10:41:30# apt-get install -y chrony
chrony is already the newest version (4.5-1ubuntu4.2).
root@ubuntu2204 ~ 10:41:36# systemctl enable chrony --now

1.5 安装 IPVS 依赖包

root@ubuntu2204 ~ 10:42:24# apt install -y iptables ipvsadm ipset conntrack

安装结果(压缩):

The following NEW packages will be installed:
  conntrack ipset iptables ipvsadm libip4tc2 libip6tc2 ...
0 upgraded, 15 newly installed
Setting up iptables ... update-alternatives: using /usr/sbin/iptables-legacy ... (auto mode)

1.6 加载内核模块(overlay / br_netfilter / IPVS)

临时加载(立即生效):

root@ubuntu2204 ~ 10:42:53# modprobe overlay
root@ubuntu2204 ~ 10:43:11# modprobe br_netfilter
root@ubuntu2204 ~ 10:43:35# modprobe ip_vs
root@ubuntu2204 ~ 10:43:39# modprobe ip_vs_rr
root@ubuntu2204 ~ 10:43:43# modprobe ip_vs_wrr
root@ubuntu2204 ~ 10:43:49# modprobe ip_vs_lc
root@ubuntu2204 ~ 10:43:52# modprobe ip_vs_sh
root@ubuntu2204 ~ 10:43:58# modprobe nf_conntrack

模块功能说明:

  • overlay:OverlayFS 文件系统,容器运行时分层镜像必备
  • br_netfilter:允许桥接设备通过 iptables 过滤,K8s 网络通信必需
  • ip_vs*:IPVS 四层负载均衡模块,kube-proxy 的 ipvs 模式依赖(rr 轮询、wrr 加权轮询、lc 最少连接、sh 源地址哈希)
  • nf_conntrack:连接跟踪

永久加载(重启生效,systemd-modules-load.service 自动加载):

root@ubuntu2204 ~ 10:44:03# cat > /etc/modules-load.d/k8s-net.conf << EOF
# K8s 基础网络
br_netfilter
overlay

# IPVS 必需
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_lc
ip_vs_sh
nf_conntrack
EOF

1.7 内核参数 sysctl

root@ubuntu2204 ~ 10:44:30# cat > /etc/sysctl.d/k8s.conf << 'EOF'
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF

root@ubuntu2204 ~ 10:44:44# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0

1.8 安装 containerd 与 cri-tools

root@ubuntu2204 ~ 10:45:04# apt-get install -y containerd.io=1.7.20-1 cri-tools
  • containerd.io 1.7.20(docker-ce 华为云源)
  • cri-tools 1.30.1(kubernetes 阿里云源)

1.9 配置 containerd

root@ubuntu2204 ~ 10:45:31# crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
root@ubuntu2204 ~ 10:45:33# containerd config default > /etc/containerd/config.toml
root@ubuntu2204 ~ 10:45:37# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
root@ubuntu2204 ~ 10:45:42# sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.9"|' /etc/containerd/config.toml

再用 vim /etc/containerd/config.toml(11:21:27 完成)追加镜像加速配置,核心内容:

[plugins."io.containerd.grpc.v1.cri".registry.configs."hub.laoma.cloud".tls]
  insecure_skip_verify = true

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://docker.m.daocloud.io","https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
  endpoint = ["https://k8s.m.daocloud.io","https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."hub.laoma.cloud"]
  endpoint = ["http://hub.laoma.cloud"]

完整 config.toml 内容很长,以 … 省略。

重启并验证:

root@ubuntu2204 ~ 11:22:43#  systemctl restart containerd.service
root@ubuntu2204 ~ 11:22:49# crictl pull busybox
Image is up to date for sha256:c6348fa86ba0fb2108c9334f5fe913ddc6d853313e655891f133a0127c30099f
root@ubuntu2204 ~ 11:23:17# crictl pull hub.laoma.cloud/library/busybox
Image is up to date for sha256:c6348fa86ba0fb2108c9334f5fe913ddc6d853313e655891f133a0127c30099f

1.10 安装 nerdctl 与 CNI 插件

root@ubuntu2204 ~ 11:23:48# wget http://192.168.46.200/class/course-materials/softwares/stage03/nerdctl-1.7.7-linux-amd64.tar.gz
root@ubuntu2204 ~ 11:23:56# tar -xf nerdctl-1.7.7-linux-amd64.tar.gz -C /usr/bin/

root@ubuntu2204 ~ 11:24:00# wget http://192.168.46.200/class/course-materials/softwares/stage03/cni-plugins-linux-amd64-v1.6.0.tgz
root@ubuntu2204 ~ 11:24:08# mkdir -p /opt/cni/bin
root@ubuntu2204 ~ 11:24:12# tar -xf cni-plugins-linux-amd64-v1.6.0.tgz -C /opt/cni/bin

(wget 下载过程输出以 … 省略)

配置三处镜像加速(hosts.toml):

root@ubuntu2204 ~ 11:24:20# # 配置 docker.io 镜像加速
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://registry-1.docker.io"

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]

[host."https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"]
  capabilities = ["pull", "resolve"]
EOF

root@ubuntu2204 ~ 11:24:40# # 配置 registry.k8s.io 镜像加速
mkdir -p /etc/containerd/certs.d/registry.k8s.io
cat > /etc/containerd/certs.d/registry.k8s.io/hosts.toml << EOF
server = "https://registry.k8s.io"

[host."https://k8s.m.daocloud.io"]
  capabilities = ["pull", "resolve"]

[host."https://registry.cn-hangzhou.aliyuncs.com/google_containers"]
  capabilities = ["pull", "resolve"]
  override_path = true
EOF

root@ubuntu2204 ~ 11:24:46# # 配置 hub.laoma.cloud 镜像加速
mkdir -p /etc/containerd/certs.d/hub.laoma.cloud
cat > /etc/containerd/certs.d/hub.laoma.cloud/hosts.toml << EOF
server = "http://hub.laoma.cloud"

[host."http://hub.laoma.cloud"]
  capabilities = ["pull", "resolve"]
EOF

验证拉取:

root@ubuntu2204 ~ 11:24:51# nerdctl pull busybox
docker.io/library/busybox:latest: resolving      |--------------------------------------|
index-sha256:dc2d74b2...:    done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:c6348fa8...:   done           |++++++++++++++++++++++++++++++++++++++|

1.11 安装 kubeadm / kubelet / kubectl(v1.30.2)

root@ubuntu2204 ~ 11:24:58# apt install -y kubeadm=1.30.2-1.1 kubelet=1.30.2-1.1 kubectl=1.30.2-1.1
The following additional packages will be installed:
  ebtables kubernetes-cni socat
0 upgraded, 6 newly installed
Get:1 https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb  kubeadm 1.30.2-1.1 [10.4 MB]
...
Fetched 72.6 MB in 1min 7s (1077 kB/s)

启动 kubelet:

root@ubuntu2204 ~ 11:26:58# systemctl enable kubelet --now

1.12 配置 bash 补全

root@ubuntu2204 ~ 11:27:04# mkdir /etc/bash_completion.d
root@ubuntu2204 ~ 11:27:13# crictl completion bash > /etc/bash_completion.d/crictl
root@ubuntu2204 ~ 11:28:07# nerdctl completion bash > /etc/bash_completion.d/nerdctl
root@ubuntu2204 ~ 11:28:15# echo 'export CONTAINERD_NAMESPACE=k8s.io' >> /etc/bash_completion.d/nerdctl
root@ubuntu2204 ~ 11:28:26# source /etc/bash_completion.d/nerdctl
root@ubuntu2204 ~ 11:28:58# kubectl completion bash > /etc/bash_completion.d/kubectl
root@ubuntu2204 ~ 11:29:36# kubeadm completion bash > /etc/bash_completion.d/kubeadm

export CONTAINERD_NAMESPACE=k8s.io 写进 nerdctl 补全脚本,使 nerdctl 默认使用 K8s 的 k8s.io 命名空间,与后续集群保持一致。

验证安装(子命令列表以 … 省略):

root@ubuntu2204 ~ 11:30:48# kubectl     # annotate api-resources apply ...,略
root@ubuntu2204 ~ 11:37:18# kubeadm     # certs config init join reset token version ...,略

1.13 关机打快照

root@ubuntu2204 ~ 11:37:30# #关机打快照,模板配置完成
root@ubuntu2204 ~ 11:37:48# init 0

↑ 回到目录


二、准备节点:克隆虚拟机与网络配置

笔记内容(补充自然时间戳)。采用完全克隆方式,从模板克隆出另外 3 台虚拟机:master30worker31worker32,分别设置主机名与静态网络。

节点规划:

节点主机名IP角色
master30master30.laoma.cloud10.1.8.30/24控制平面
worker31worker31.laoma.cloud10.1.8.31/24工作节点
worker32worker32.laoma.cloud10.1.8.32/24工作节点

(网关 10.1.8.2,DNS 10.1.8.2 + 223.5.5.5)

2.1 master30 节点

root@master30 ~ 16:00:12# hostnamectl set-hostname master30.laoma.cloud
root@master30 ~ 16:00:26# cat > /etc/netplan/00-installer-config.yaml <<EOF
network:
  ethernets:
    ens32:
      dhcp4: no
      addresses:
        - 10.1.8.30/24
      routes:
        - to: default
          via: 10.1.8.2
      nameservers:
        addresses:
          - 10.1.8.2
          - 223.5.5.5
  version: 2
EOF
root@master30 ~ 16:00:44# netplan apply

2.2 worker31 节点

root@worker31 ~ 16:03:08# hostnamectl set-hostname worker31.laoma.cloud
root@worker31 ~ 16:03:22# cat > /etc/netplan/00-installer-config.yaml <<EOF
...(同 master30,addresses 改为 10.1.8.31/24)
EOF
root@worker31 ~ 16:03:40# netplan apply

2.3 worker32 节点

root@worker32 ~ 16:06:15# hostnamectl set-hostname worker32.laoma.cloud
root@worker32 ~ 16:06:29# cat > /etc/netplan/00-installer-config.yaml <<EOF
...(同 master30,addresses 改为 10.1.8.32/24)
EOF
root@worker32 ~ 16:06:47# netplan apply

↑ 回到目录


三、创建集群

3.1 下载镜像

在 master 节点初始化前,先提前把所需镜像拉到本地(默认官方源):

root@master30 ~ 16:20:06# kubeadm config images pull --kubernetes-version=v1.30.2
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.30.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.30.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.30.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.30.2
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.11.1
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.12-0

备选方案:内网仓库

root@master30 ~ 16:27:14# kubeadm config images pull --kubernetes-version=v1.30.2 --image-repository hub.laoma.cloud/kubernetes
[config/images] Pulled hub.laoma.cloud/kubernetes/kube-apiserver:v1.30.2
...(共 7 个镜像,同上)

备选方案:阿里云仓库

root@master30 ~ 16:35:08# kubeadm config images pull --kubernetes-version=v1.30.2 --image-repository registry.aliyuncs.com/google_containers
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.30.2
...(共 7 个镜像,同上)

3.2 初始化集群

三种方式:

root@master30 ~ 16:40:00# kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16
root@master30 ~ 16:41:20# kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16 --image-repository hub.laoma.cloud/kubernetes
root@master30 ~ 16:42:10# kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16 --image-repository registry.aliyuncs.com/google_containers

初始化过程输出(节选):

[init] Using Kubernetes version: v1.30.2
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes ... master30.laoma.cloud] and IPs [10.96.0.1 10.1.8.30]
...
[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"
[kubelet-start] Starting the kubelet
[kubelet-check] The kubelet is healthy after 502.398615ms
[api-check] The API server is healthy after 7.50265248s
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config"
[mark-control-plane] Marking the node master30.laoma.cloud as control-plane
[bootstrap-token] Using token: ybenal.6mszwb1nf8nck72g
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

初始化完成后会打印三条重要提示:① 配置 kubectl 凭据;② 部署 Pod 网络;③ 其他节点加入集群的 join 命令(务必保存,后面要用)。

选项说明:

  • --image-repository registry.aliyuncs.com/google_containers:指定镜像下载位置
  • --kubernetes-version=v1.30.2:指定版本
  • --pod-network-cidr=10.224.0.0/16:指定 Pod 网络范围(不同网络方案有各自要求)
  • --apiserver-advertise-address:指明 master 与其他节点通信的网卡 IP;多网卡时建议显式指定,不指定则自动选择有默认网关的接口

初始化过程(10 步):

  1. kubeadm 执行初始化前检查
  2. 下载组件镜像(耗时取决于网络质量)
  3. 生成 token 和证书
  4. 生成 KubeConfig(kubelet 用它和 master 通信)
  5. 安装 master 组件
  6. 安装附加组件 kube-proxy 和 CoreDNS
  7. master 初始化成功
  8. 提示如何配置 kubectl
  9. 提示如何安装 Pod 网络
  10. 提示如何注册其他节点到集群

↑ 回到目录


四、配置集群

4.1 配置凭据

  1. kubectl 默认使用 ~/.kube/config 中的凭据管理集群:
root@master30 ~ 16:44:10# mkdir -p $HOME/.kube
root@master30 ~ 16:44:15# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  1. 如果环境变量 KUBECONFIG 存在,则优先使用它指定的文件:
root@master30 ~ 16:46:30# mv .kube/config .
root@master30 ~ 16:46:40# export KUBECONFIG=/root/config
root@master30 ~ 16:46:50# kubectl get nodes
NAME                 STATUS     ROLES                  AGE    VERSION
master30.laoma.cloud   NotReady   control-plane,master   5m2s   v1.28.2

等网络配置完成后,STATUS 会由 NotReady 变更为 Ready。

  1. 还可以用 --kubeconfig 选项明确指定凭据文件(kubernetes 对凭据文件名没有要求):
root@master30 ~ 16:48:15# mv config kube.conf
root@master30 ~ 16:48:30# kubectl get nodes --kubeconfig kube.conf
  1. 恢复使用默认位置 ~/.kube/config
root@master30 ~ 16:50:00# unset KUBECONFIG
root@master30 ~ 16:50:10# mv kube.conf .kube/config

4.2 部署网络(calico)

这里采用 calico 网络。官方地址 http://projectcalico.org ,产品文档 https://projectcalico.docs.tigera.io/about/about-calico ,镜像 https://github.com/projectcalico/calico

下载 calico 配置(v3.30.7):

root@master30 ~ 16:51:30# wget http://192.168.46.200/class/course-materials/softwares/stage03/calico-3.30.7.yaml -O calico.yaml

(也可以从官方拉取:wget --no-check-certificate https://raw.githubusercontent.com/projectcalico/calico/v3.30.7/manifests/calico.yaml

修改 Pod 网络范围(与初始化时的 podSubnet 一致):

root@master30 ~ 16:53:20# kubectl get cm -n kube-system kubeadm-config -o yaml | grep podSubnet
      podSubnet: 10.224.0.0/16

root@master30 ~ 16:53:50# sed -i "s|# - name: CALICO_IPV4POOL_CIDR|- name: CALICO_IPV4POOL_CIDR|g" calico.yaml
root@master30 ~ 16:53:55# sed -i "s|#   value: \"192.*|  value: \"10.224.0.0/16\"|g" calico.yaml

修改镜像仓库(改为内网仓库):

root@master30 ~ 16:54:10# sed -i 's/docker.io/hub.laoma.cloud/g' calico.yaml
root@master30 ~ 16:54:25# grep image: calico.yaml | sort | uniq
          image: hub.laoma.cloud/calico/cni:v3.30.7
          image: hub.laoma.cloud/calico/kube-controllers:v3.30.7
          image: hub.laoma.cloud/calico/node:v3.30.7

部署 calico:

root@master30 ~ 16:55:00# kubectl apply -f calico.yaml

验证部署:

root@master30 ~ 16:57:30# kubectl get pods --all-namespaces
NAMESPACE     NAME                                         READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-56fcbf9d6b-v6qsn     1/1     Running   0          28m
kube-system   calico-node-vc9v6                            1/1     Running   0          28m
kube-system   coredns-6d8c4cb4d-9qdxg                      1/1     Running   0          43m
kube-system   coredns-6d8c4cb4d-wwfmx                      1/1     Running   0          43m
kube-system   etcd-master30.laoma.cloud                    1/1     Running   0          43m
kube-system   kube-apiserver-master30.laoma.cloud          1/1     Running   0          43m
kube-system   kube-controller-manager-master30.laoma.cloud 1/1     Running   0          43m
kube-system   kube-proxy-8b7tn                             1/1     Running   0          43m
kube-system   kube-scheduler-master30.laoma.cloud          1/1     Running   0          43m

4.3 节点加入集群

root@worker31 ~ 17:01:40# kubeadm join 10.1.8.30:6443 --token mi0yt8.1tzza4q64dr8y3pc \
	--discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: missing optional cgroups: blkio
[preflight] Reading configuration from the cluster...
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
root@worker32 ~ 17:04:20# kubeadm join 10.1.8.30:6443 --token mi0yt8.1tzza4q64dr8y3pc \
	--discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd

如果没保存初始化时打印的 join 命令,可以重新生成:

root@master30 ~ 17:07:00# kubeadm token create --print-join-command
kubeadm join 10.1.8.30:6443 --token dzpuca.8lqxqqydwskroabx --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd

4.4 验证部署

root@master30 ~ 17:10:00# kubectl cluster-info
Kubernetes control plane is running at https://10.1.8.30:6443
CoreDNS is running at https://10.1.8.30:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

root@master30 ~ 17:10:20# kubectl version
Client Version: v1.30.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.2

root@master30 ~ 17:11:00# kubectl get nodes
NAME                  STATUS   ROLES           AGE   VERSION
master30.laoma.cloud   Ready    control-plane   9h    v1.30.2
worker31.laoma.cloud   Ready    <none>          8h    v1.30.2
worker32.laoma.cloud   Ready    <none>          8h    v1.30.2

节点状态变为 Ready 需满足:网络配置完成、kubelet 服务运行、swap 关闭、SELinux 关闭。

↑ 回到目录


五、节点管理

学习参考:https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/

root@master30 ~ 17:15:00# kubectl get nodes
NAME                  STATUS   ROLES           AGE   VERSION
master30.laoma.cloud   Ready    control-plane   37h   v1.30.2
worker31.laoma.cloud   Ready    <none>          36h   v1.30.2
worker32.laoma.cloud   Ready    <none>          36h   v1.30.2

root@master30 ~ 17:16:30# kubectl describe node worker31.laoma.cloud

(describe 输出较长,以 … 省略;可查看节点资源、污点、Pod 分布等信息)

↑ 回到目录


六、删除节点

worker31 为例,三步完成:

1. drain(排空):把节点标记为不可调度(SchedulingDisabled),并驱逐上面的 Pod:

root@master30 ~ 19:30:00# kubectl drain worker31.laoma.cloud --ignore-daemonsets
node/worker31.laoma.cloud cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-v8jdn, kube-system/kube-proxy-27vl2
evicting pod kube-system/calico-kube-controllers-7cb4fd5784-jx2xl
pod/calico-kube-controllers-7cb4fd5784-jx2xl evicted
node/worker31.laoma.cloud drained

root@master30 ~ 19:30:40# kubectl get nodes
NAME                  STATUS                     ROLES           AGE   VERSION
master30.laoma.cloud   Ready                      control-plane   41h   v1.30.2
worker31.laoma.cloud   Ready,SchedulingDisabled   <none>          41h   v1.30.2
worker32.laoma.cloud   Ready                      <none>          41h   v1.30.2

2. delete(移除):从集群中删除该节点:

root@master30 ~ 19:31:30# kubectl delete node worker31.laoma.cloud
node "worker31.laoma.cloud" deleted

root@master30 ~ 19:32:00# kubectl get nodes
NAME                  STATUS   ROLES           AGE   VERSION
master30.laoma.cloud   Ready    control-plane   41h   v1.30.2
worker32.laoma.cloud   Ready    <none>          41h   v1.30.2

3. reset(重置):在被删除的 worker31 节点上执行:

root@worker31 ~ 19:35:00# kubeadm reset -f
[preflight] Running pre-flight checks
[reset] Deleted contents of the etcd data directory: /var/lib/etcd
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of directories: [/etc/kubernetes/manifests /var/lib/kubelet /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf ...]

The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d
The reset process does not reset or clean up iptables rules or IPVS tables. ...
The reset process does not clean your kubeconfig files and you must remove them manually.

↑ 回到目录


七、删除集群

删除集群流程:先删除所有 node,再删除所有 master。

  1. 删除所有 worker 节点
root@master30 ~ 19:50:00# kubectl drain worker31.laoma.cloud --ignore-daemonsets --force
root@master30 ~ 19:50:40# kubectl drain worker32.laoma.cloud --ignore-daemonsets --force
root@master30 ~ 19:51:30# kubectl delete node worker31.laoma.cloud worker32.laoma.cloud

# 重置节点(注意在各自节点上执行)
root@worker31 ~ 19:54:00# kubeadm reset -f
root@worker32 ~ 19:54:40# kubeadm reset -f
  1. 删除 master 节点
# 删除集群前先保存集群配置(重建时要用)
root@master30 ~ 19:58:00# kubectl get cm kubeadm-config -n kube-system -o yaml > kubeadm.yml

# 修改 kubeadm.yml(删除 1-3 行和 22-28 行后效果如下)
root@master30 ~ 20:00:00# vim kubeadm.yml
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: hub.laoma.cloud/kubernetes
kind: ClusterConfiguration
kubernetesVersion: v1.30.2
networking:
  dnsDomain: cluster.local
  podSubnet: 10.224.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}

root@master30 ~ 20:02:00# kubectl delete node master30.laoma.cloud
root@master30 ~ 20:03:00# kubeadm reset -f
root@master30 ~ 20:04:00# rm -fr .kube/

↑ 回到目录


八、重建集群

利用上一步保存的 kubeadm.yml 一键重建:

# 初始化集群(使用配置文件)
root@master30 ~ 20:15:00# kubeadm init --config kubeadm.yml

# 也可以使用之前的命令行方式
root@master30 ~ 20:16:20# kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16 --image-repository hub.laoma.cloud/kubernetes

# 配置凭据
root@master30 ~ 20:19:00# mkdir -p $HOME/.kube
root@master30 ~ 20:19:10# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@master30 ~ 20:19:20# sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 配置网络
root@master30 ~ 20:21:00# kubectl apply -f calico.yaml

# 节点加入集群
root@worker31 ~ 20:24:00# kubeadm join 10.1.8.30:6443 --token ky95b9.sjg0fn21pdi1m0xz \
	--discovery-token-ca-cert-hash sha256xxxxxxx
root@worker32 ~ 20:25:40# kubeadm join 10.1.8.30:6443 --token ky95b9.sjg0fn21pdi1m0xz \
	--discovery-token-ca-cert-hash sha256xxxxxxx

↑ 回到目录


九、命令速查表

模板节点环境

操作命令
关闭 swapswapoff -a && sed -i '/^.*swap/d' /etc/fstab
时间同步apt-get install -y chrony && systemctl enable chrony --now
IPVS 依赖apt install -y iptables ipvsadm ipset conntrack
加载内核模块modprobe overlay br_netfilter ip_vs ip_vs_rr ...(写入 /etc/modules-load.d/k8s-net.conf 永久生效)
内核参数sysctl -p /etc/sysctl.d/k8s.conf(bridge-nf、ip_forward、swappiness=0)
安装 containerdapt-get install -y containerd.io=1.7.20-1 cri-tools
containerd 配置containerd config default > /etc/containerd/config.toml + sed 改 SystemdCgroup/pause + 配置 registry mirrors
安装 nerdctl解压 nerdctl 到 /usr/bin,CNI 插件到 /opt/cni/bin
安装 k8s 组件apt install -y kubeadm=1.30.2-1.1 kubelet=1.30.2-1.1 kubectl=1.30.2-1.1

集群生命周期

操作命令
下载镜像kubeadm config images pull --kubernetes-version=v1.30.2
初始化kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16 [--image-repository 仓库]
配置凭据mkdir -p $HOME/.kube && cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
部署网络kubectl apply -f calico.yaml(需同步 CALICO_IPV4POOL_CIDR)
节点加入kubeadm join 10.1.8.30:6443 --token <token> --discovery-token-ca-cert-hash <hash>
重新生成 join 命令kubeadm token create --print-join-command
查看节点kubectl get nodes / kubectl describe node <节点>
排空节点kubectl drain <节点> --ignore-daemonsets [--force]
删除节点kubectl delete node <节点> + 节点上 kubeadm reset -f
删除集群先删所有 node,再删 master(先备份 kubeadm.yml)
重建集群kubeadm init --config kubeadm.yml → 凭据 → calico → join

小结

  1. 模板机一次配置(关 swap、内核模块、sysctl、containerd 加速、kubeadm 全家桶、补全),打快照后克隆出全部节点,避免重复劳动。
  2. 国内环境关键点:containerd 的 registry mirrors / certs.d 加速配置,以及 --image-repository 指定内网或阿里云仓库。
  3. calico 的 CALICO_IPV4POOL_CIDR 必须与 kubeadm init--pod-network-cidr 一致(本环境 10.224.0.0/16)。
  4. 节点运维三板斧:drain 排空 → delete 移除 → reset 重置;删除集群则先 worker 后 master。

更多推荐