从零搭建 Kubernetes 1.30 集群:基于 kubeadm 的完整部署与集群管理指南
手把手教你用 kubeadm 部署生产级 K8s 集群,并掌握节点管理、命名空间与多集群切换
写在前面
Kubernetes 作为容器编排的事实标准,已经成为云原生时代的必备技能。本文基于Ubuntu 24.04和Kubernetes 1.30.2,使用官方推荐的kubeadm工具,从虚拟机模板准备到集群部署、网络插件安装,再到节点管理、命名空间与多集群切换,一条龙带你入门 K8s 运维。
如果你是:
- 准备 CKA/CKAD 考试的考生
- 想在生产环境自建集群的运维工程师
- 刚接触 K8s 的开发者
这篇文章将是你绝佳的实战手册。
一、环境准备
1.1 节点规划
| 节点名称 | IP | 角色 |
|---|---|---|
| master30.tz.cloud | 10.1.8.30 | master |
| worker31.tz.cloud | 10.1.8.31 | worker |
| worker32.tz.cloud | 10.1.8.32 | worker |
1.2 硬件与软件
- VMware Workstation 17
- Ubuntu 24.04 LTS(最小化安装)
- Kubernetes 1.30.2
- containerd.io 1.7.20
- nerdctl 1.7.7
- Calico 网络插件 v3.30.7
虚拟机配置:2 CPU、4GB 内存、100GB 硬盘,NAT 网络。
二、基础系统配置(模板机)
为了后续克隆节点方便,我们先准备一台干净的模板机,完成所有通用配置。
2.1 安装与分区
- 安装 Ubuntu 24.04 时,断开网络以避免自动更新拖慢安装。
- 分区建议:
/boot2GB,/剩余全部(90GB),不创建 swap。
2.2 配置软件源
使用华为云镜像加速:
cat>/etc/apt/sources.list.d/ubuntu.sources<<'EOF' Types: deb URIs: http://mirrors.huaweicloud.com/ubuntu/ Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg EOF添加 containerd 官方源(用于安装 containerd.io):
curl-fsSLhttps://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg|gpg--dearmour-o/etc/apt/trusted.gpg.d/containerd.gpgecho"deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu noble stable">/etc/apt/sources.list.d/docker-ce.list添加 Kubernetes 1.30 源(阿里云):
curl-fsSLhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key|gpg--dearmor-o/etc/apt/keyrings/kubernetes-apt-keyring.gpgecho"deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /">/etc/apt/sources.list.d/kubernetes.list2.3 安装基础软件包
aptupdate&&aptinstall-yvimlrzsz bash-completion open-vm-tools apt-transport-https sshpass2.4 配置静态 IP(以 master 为例)
mkdir/etc/netplan/originmv/etc/netplan/*yaml /etc/netplan/origincat>/etc/netplan/00-static.yaml<<EOF network: ethernets: ens33: 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 EOFchmod600/etc/netplan/00-static.yaml netplan apply2.5 配置主机名解析
cat<<'EOF'>>/etc/hosts###### kubernetes ##### 10.1.8.30 master30.tz.cloud master30 10.1.8.31 worker31.tz.cloud worker31 10.1.8.32 worker32.tz.cloud worker32 EOF2.6 关闭 swap
swapoff-a&&sed-i'/^.*swap/d'/etc/fstabrm-f/swap.img2.7 配置时间同步
aptinstall-ychrony systemctlenablechrony--nowtimedatectl set-timezone Asia/Shanghai2.8 SSH 优化与免密
echo'UseDNS no'>>/etc/ssh/sshd_configecho'StrictHostKeyChecking no'>>/etc/ssh/ssh_config ssh-keygen-N''-f~/.ssh/id_rsa-trsa sshpass-ppassword ssh-copy-id root@localhost# 替换为实际密码2.9 加载内核模块(IPVS + 网络)
aptinstall-yiptables ipvsadm ipset conntrack# 临时加载modprobe overlay br_netfilter modprobe ip_vs ip_vs_rr ip_vs_wrr ip_vs_lc ip_vs_sh nf_conntrack# 永久生效cat>/etc/modules-load.d/k8s-net.conf<<EOF br_netfilter overlay ip_vs ip_vs_rr ip_vs_wrr ip_vs_lc ip_vs_sh nf_conntrack EOF2.10 配置内核参数
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 EOFsysctl-p/etc/sysctl.d/k8s.conf三、安装 containerd 与客户端工具
3.1 安装 containerd.io
aptinstall-ycontainerd.io=1.7.20-1 cri-tools crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock生成默认配置并修改:
containerd config default>/etc/containerd/config.tomlsed-i's/SystemdCgroup = false/SystemdCgroup = true/'/etc/containerd/config.tomlsed-i's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.9"|'/etc/containerd/config.toml3.2 配置镜像加速(CRI 方式)
编辑/etc/containerd/config.toml,在[plugins."io.containerd.grpc.v1.cri".registry.mirrors]下添加:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://docker.m.daocloud.io","https://docker.1ms.run","https://docker.xuanyuan.me"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"] endpoint = ["https://k8s.m.daocloud.io","https://registry.cn-hangzhou.aliyuncs.com/google_containers"]重启 containerd:
systemctl restart containerd3.3 安装 nerdctl 和 CNI 插件
wgethttp://192.168.46.100/01.softwares/03.stage-3/nerdctl-1.7.7-linux-amd64.tar.gztar-xfnerdctl-1.7.7-linux-amd64.tar.gz-C/usr/bin/wgethttp://192.168.46.100/01.softwares/03.stage-3/cni-plugins-linux-amd64-v1.6.0.tgzmkdir-p/opt/cni/bintar-xfcni-plugins-linux-amd64-v1.6.0.tgz-C/opt/cni/bin3.4 配置 nerdctl 镜像加速(原生 API)
nerdctl 不读取 CRI 的mirrors,需单独配置certs.d:
mkdir-p/etc/containerd/certs.d/docker.iocat>/etc/containerd/certs.d/docker.io/hosts.toml<<EOF server = "https://registry-1.docker.io" [host."https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"] capabilities = ["pull", "resolve"] EOFmkdir-p/etc/containerd/certs.d/registry.k8s.iocat>/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://k8s.mirrorify.net"] capabilities = ["pull", "resolve"] [host."https://registry.cn-hangzhou.aliyuncs.com/google_containers"] capabilities = ["pull", "resolve"] override_path = true EOF3.5 安装 kubeadm、kubelet、kubectl
aptinstall-ykubeadm=1.30.2-1.1kubelet=1.30.2-1.1kubectl=1.30.2-1.1 systemctlenablekubelet--now3.6 配置命令补全
mkdir-p/etc/bash_completion.d crictl completionbash>/etc/bash_completion.d/crictl nerdctl completionbash>/etc/bash_completion.d/nerdctlecho'export CONTAINERD_NAMESPACE=k8s.io'>>/etc/bash_completion.d/nerdctl kubectl completionbash>/etc/bash_completion.d/kubectl kubeadm completionbash>/etc/bash_completion.d/kubeadmsource/etc/bash_completion.d/*关键点:
CONTAINERD_NAMESPACE=k8s.io确保 nerdctl 默认操作 k8s 使用的命名空间,否则 kubelet 无法识别镜像。
四、克隆节点与配置网络
关闭模板机,使用完全克隆创建三个节点。分别启动后,修改主机名和 IP 地址(以 worker31 为例):
hostnamectl set-hostname worker31.tz.cloudcat>/etc/netplan/00-static.yaml<<EOF network: ethernets: ens33: dhcp4: no addresses: - 10.1.8.31/24 routes: - to: default via: 10.1.8.2 nameservers: addresses: - 10.1.8.2 - 223.5.5.5 version: 2 EOFnetplan apply确保所有节点的/etc/hosts都包含三台机器的解析记录。
五、部署 Kubernetes 集群
5.1 预拉取镜像(master 节点)
kubeadm config images pull --kubernetes-version=v1.30.2worker 节点只需拉取kube-proxy和pause:
nerdctl pull registry.k8s.io/kube-proxy:v1.30.2 nerdctl pull registry.k8s.io/pause:3.95.2 初始化 master
kubeadm init --kubernetes-version=v1.30.2 --pod-network-cidr=10.224.0.0/16如果拉取镜像慢,可加
--image-repository registry.aliyuncs.com/google_containers使用阿里云镜像。
初始化成功后,会输出类似下面的 join 命令,务必保存:
kubeadm join 10.1.8.30:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>5.3 配置 kubectl 凭据
mkdir-p$HOME/.kubecp-i/etc/kubernetes/admin.conf$HOME/.kube/configchown$(id-u):$(id-g)$HOME/.kube/config5.4 安装 Calico 网络插件
wget--no-check-certificate https://raw.githubusercontent.com/projectcalico/calico/v3.30.7/manifests/calico.yaml修改calico.yaml,将CALICO_IPV4POOL_CIDR改为与初始化时一致的网段(10.224.0.0/16):
sed-i"s|# - name: CALICO_IPV4POOL_CIDR|- name: CALICO_IPV4POOL_CIDR|g"calico.yamlsed-i"s|# value:\"192.*| value:\"10.224.0.0/16\"|g"calico.yaml所有节点提前下载 Calico 镜像:
nerdctl pull docker.io/calico/cni:v3.30.7 nerdctl pull docker.io/calico/node:v3.30.7 nerdctl pull docker.io/calico/kube-controllers:v3.30.7部署:
kubectl apply-fcalico.yaml5.5 加入 worker 节点
在 worker31 和 worker32 上执行上面保存的 join 命令。
如果忘记 token,可在 master 上重新生成:
kubeadm token create --print-join-command5.6 验证集群
kubectl get nodes kubectl get pods-A所有节点状态应为Ready,所有系统 Pod 为Running。
六、集群管理进阶
6.1 节点管理
查看节点详情
kubectl describenodeworker31.tz.cloud维护节点(驱逐 Pod)
kubectl drain worker31.tz.cloud --ignore-daemonsets删除节点
kubectl deletenodeworker31.tz.cloud在被删除的节点上执行重置:
kubeadm reset-f恢复节点重新加入
节点重置后,重新执行 join 命令即可。
6.2 命名空间(Namespace)
Namespace 用于逻辑隔离资源。Kubernetes 默认有四个:
default:默认命名空间kube-system:系统组件kube-public:公共可读kube-node-lease:节点心跳
创建 Namespace
kubectl create ns laoma或使用 YAML:
apiVersion:v1kind:Namespacemetadata:name:laomakubectl apply-fns-laoma.yaml在指定命名空间操作资源
kubectl run nginx--image=nginx-nlaoma kubectl get pods-nlaoma删除 Namespace(会级联删除其中所有资源)
kubectl delete ns laoma6.3 切换默认命名空间
使用 kubectl 命令
kubectl config set-context--current--namespace=laoma kubectl config get-contexts# 查看当前上下文使用 kubens 工具(更便捷)
安装:
wgethttps://codeload.github.com/ahmetb/kubectx/zip/refs/heads/master-Okubectx.zipunzipkubectx.zipcpkubectx-master/kubens /usr/local/bin/chmod+x /usr/local/bin/kubenscpkubectx-master/completion/kubens.bash /etc/bash_completion.d/source/etc/bash_completion.d/kubens.bash使用:
kubens# 列出所有命名空间kubens kube-system# 切换到 kube-systemkubens -# 切换到上一个6.4 多集群切换(Context)
当你有多个 K8s 集群时,可以通过~/.kube/config定义多个 context。
查看当前配置
kubectl config view kubectl config get-contexts kubectl config get-clusters切换 context
kubectl config use-context<context-name>使用 kubectx 工具
安装(与 kubens 同包):
cpkubectx-master/kubectx /usr/local/bin/chmod+x /usr/local/bin/kubectxcpkubectx-master/completion/kubectx.bash /etc/bash_completion.d/使用:
kubectx# 列出所有 contextkubectx<name># 切换kubectx-c# 显示当前 contextkubectx-u# 取消当前 context七、集群销毁与重建
7.1 删除所有节点
kubectl drain worker31.tz.cloud --ignore-daemonsets--forcekubectl drain worker32.tz.cloud --ignore-daemonsets--forcekubectl deletenodeworker31.tz.cloud worker32.tz.cloud在 worker 节点上执行:
kubeadm reset-f7.2 删除 master
kubectl deletenodemaster30.tz.cloud kubeadm reset-frm-rf.kube/7.3 重建集群
可使用之前保存的kubeadm.yml(来自kubectl get cm kubeadm-config -n kube-system -o yaml清理后)或直接运行kubeadm init命令,然后重复部署网络和加入节点步骤。
八、常见问题与避坑指南
| 问题 | 解决方案 |
|---|---|
kubectl get nodes显示 NotReady | 检查网络插件是否部署成功(Calico 镜像拉取失败可手动拉取) |
kubeadm init拉取镜像超时 | 更换镜像仓库(--image-repository)或配置代理 |
| 节点加入失败(token 过期) | 在 master 重新生成 token:kubeadm token create --print-join-command |
nerdctl pull慢 | 检查/etc/containerd/certs.d加速配置是否正确 |
| K8s 无法识别镜像 | 确保 nerdctl 默认命名空间为k8s.io(见 3.6 节) |
| 删除 namespace 卡住 | 检查是否有 finalizer,可kubectl patch ns <ns> -p '{"metadata":{"finalizers":[]}}' --type=merge |
忘记admin.conf密码 | 可直接从/etc/kubernetes/admin.conf复制,或重新生成证书 |
总结
本文详细记录了从 Ubuntu 24.04 系统初始化到部署 Kubernetes 1.30 集群的全过程,包括:
- 系统基础优化与内核参数调整
- containerd 安装与镜像加速(CRI 和 nerdctl 双配置)
- kubeadm 初始化集群与 Calico 网络插件部署
- 节点管理、命名空间切换和多集群 context 管理
通过这篇实战指南,你不仅能够搭建一个生产可用的 K8s 集群,还能掌握日常运维的常用命令和排错思路。
后续可继续探索:存储卷(PV/PVC)、负载均衡(Service/Ingress)、自动伸缩(HPA)等高级主题。
如果觉得有用,欢迎收藏、评论,也欢迎关注我的 CSDN,后续会带来更多云原生干货!
本文所有命令均经过实测,基于 Kubernetes v1.30.2 + containerd 1.7.20,如有版本差异请适当调整。