k8s集群部署实战:从模板节点到集群重建(kubeadm v1.30.2)
Kubernetes 集群部署实战:从模板节点到集群重建(kubeadm v1.30.2)
📑 目录
| # | 章节 | 核心内容 |
|---|---|---|
| 一 | 模板节点基础环境准备 | 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:15cat /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 台虚拟机:
master30、worker31、worker32,分别设置主机名与静态网络。
节点规划:
| 节点 | 主机名 | IP | 角色 |
|---|---|---|---|
| master30 | master30.laoma.cloud | 10.1.8.30/24 | 控制平面 |
| worker31 | worker31.laoma.cloud | 10.1.8.31/24 | 工作节点 |
| worker32 | worker32.laoma.cloud | 10.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 步):
- kubeadm 执行初始化前检查
- 下载组件镜像(耗时取决于网络质量)
- 生成 token 和证书
- 生成 KubeConfig(kubelet 用它和 master 通信)
- 安装 master 组件
- 安装附加组件 kube-proxy 和 CoreDNS
- master 初始化成功
- 提示如何配置 kubectl
- 提示如何安装 Pod 网络
- 提示如何注册其他节点到集群
四、配置集群
4.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
- 如果环境变量
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。
- 还可以用
--kubeconfig选项明确指定凭据文件(kubernetes 对凭据文件名没有要求):
root@master30 ~ 16:48:15# mv config kube.conf
root@master30 ~ 16:48:30# kubectl get nodes --kubeconfig kube.conf
- 恢复使用默认位置
~/.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。
- 删除所有 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
- 删除 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
九、命令速查表
模板节点环境
| 操作 | 命令 |
|---|---|
| 关闭 swap | swapoff -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) |
| 安装 containerd | apt-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 |
小结
- 模板机一次配置(关 swap、内核模块、sysctl、containerd 加速、kubeadm 全家桶、补全),打快照后克隆出全部节点,避免重复劳动。
- 国内环境关键点:containerd 的 registry mirrors / certs.d 加速配置,以及
--image-repository指定内网或阿里云仓库。 - calico 的
CALICO_IPV4POOL_CIDR必须与kubeadm init的--pod-network-cidr一致(本环境 10.224.0.0/16)。 - 节点运维三板斧:drain 排空 → delete 移除 → reset 重置;删除集群则先 worker 后 master。
更多推荐
所有评论(0)