从零搭建 Kubernetes 1.30 集群:基于 kubeadm 的完整部署与集群管理指南
从零搭建 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 -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg
echo "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 -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "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.list
2.3 安装基础软件包
apt update && apt install -y vim lrzsz bash-completion open-vm-tools apt-transport-https sshpass
2.4 配置静态 IP(以 master 为例)
mkdir /etc/netplan/origin
mv /etc/netplan/*yaml /etc/netplan/origin
cat > /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
EOF
chmod 600 /etc/netplan/00-static.yaml
netplan apply
2.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
EOF
2.6 关闭 swap
swapoff -a && sed -i '/^.*swap/d' /etc/fstab
rm -f /swap.img
2.7 配置时间同步
apt install -y chrony
systemctl enable chrony --now
timedatectl set-timezone Asia/Shanghai
2.8 SSH 优化与免密
echo 'UseDNS no' >> /etc/ssh/sshd_config
echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
ssh-keygen -N '' -f ~/.ssh/id_rsa -t rsa
sshpass -p password ssh-copy-id root@localhost # 替换为实际密码
2.9 加载内核模块(IPVS + 网络)
apt install -y iptables 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
EOF
2.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
EOF
sysctl -p /etc/sysctl.d/k8s.conf
三、安装 containerd 与客户端工具
3.1 安装 containerd.io
apt install -y containerd.io=1.7.20-1 cri-tools
crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
生成默认配置并修改:
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.9"|' /etc/containerd/config.toml
3.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 containerd
3.3 安装 nerdctl 和 CNI 插件
wget http://192.168.46.100/01.softwares/03.stage-3/nerdctl-1.7.7-linux-amd64.tar.gz
tar -xf nerdctl-1.7.7-linux-amd64.tar.gz -C /usr/bin/
wget http://192.168.46.100/01.softwares/03.stage-3/cni-plugins-linux-amd64-v1.6.0.tgz
mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v1.6.0.tgz -C /opt/cni/bin
3.4 配置 nerdctl 镜像加速(原生 API)
nerdctl 不读取 CRI 的 mirrors,需单独配置 certs.d:
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://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"]
capabilities = ["pull", "resolve"]
EOF
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://k8s.mirrorify.net"]
capabilities = ["pull", "resolve"]
[host."https://registry.cn-hangzhou.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
3.5 安装 kubeadm、kubelet、kubectl
apt install -y kubeadm=1.30.2-1.1 kubelet=1.30.2-1.1 kubectl=1.30.2-1.1
systemctl enable kubelet --now
3.6 配置命令补全
mkdir -p /etc/bash_completion.d
crictl completion bash > /etc/bash_completion.d/crictl
nerdctl completion bash > /etc/bash_completion.d/nerdctl
echo 'export CONTAINERD_NAMESPACE=k8s.io' >> /etc/bash_completion.d/nerdctl
kubectl completion bash > /etc/bash_completion.d/kubectl
kubeadm completion bash > /etc/bash_completion.d/kubeadm
source /etc/bash_completion.d/*
关键点:
CONTAINERD_NAMESPACE=k8s.io确保 nerdctl 默认操作 k8s 使用的命名空间,否则 kubelet 无法识别镜像。
四、克隆节点与配置网络
关闭模板机,使用 完全克隆 创建三个节点。分别启动后,修改主机名和 IP 地址(以 worker31 为例):
hostnamectl set-hostname worker31.tz.cloud
cat > /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
EOF
netplan apply
确保所有节点的 /etc/hosts 都包含三台机器的解析记录。
五、部署 Kubernetes 集群
5.1 预拉取镜像(master 节点)
kubeadm config images pull --kubernetes-version=v1.30.2
worker 节点只需拉取 kube-proxy 和 pause:
nerdctl pull registry.k8s.io/kube-proxy:v1.30.2
nerdctl pull registry.k8s.io/pause:3.9
5.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/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
5.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.yaml
sed -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 -f calico.yaml
5.5 加入 worker 节点
在 worker31 和 worker32 上执行上面保存的 join 命令。
如果忘记 token,可在 master 上重新生成:
kubeadm token create --print-join-command
5.6 验证集群
kubectl get nodes
kubectl get pods -A
所有节点状态应为 Ready,所有系统 Pod 为 Running。
六、集群管理进阶
6.1 节点管理
查看节点详情
kubectl describe node worker31.tz.cloud
维护节点(驱逐 Pod)
kubectl drain worker31.tz.cloud --ignore-daemonsets
删除节点
kubectl delete node worker31.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: v1
kind: Namespace
metadata:
name: laoma
kubectl apply -f ns-laoma.yaml
在指定命名空间操作资源
kubectl run nginx --image=nginx -n laoma
kubectl get pods -n laoma
删除 Namespace(会级联删除其中所有资源)
kubectl delete ns laoma
6.3 切换默认命名空间
使用 kubectl 命令
kubectl config set-context --current --namespace=laoma
kubectl config get-contexts # 查看当前上下文
使用 kubens 工具(更便捷)
安装:
wget https://codeload.github.com/ahmetb/kubectx/zip/refs/heads/master -O kubectx.zip
unzip kubectx.zip
cp kubectx-master/kubens /usr/local/bin/
chmod +x /usr/local/bin/kubens
cp kubectx-master/completion/kubens.bash /etc/bash_completion.d/
source /etc/bash_completion.d/kubens.bash
使用:
kubens # 列出所有命名空间
kubens kube-system # 切换到 kube-system
kubens - # 切换到上一个
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 同包):
cp kubectx-master/kubectx /usr/local/bin/
chmod +x /usr/local/bin/kubectx
cp kubectx-master/completion/kubectx.bash /etc/bash_completion.d/
使用:
kubectx # 列出所有 context
kubectx <name> # 切换
kubectx -c # 显示当前 context
kubectx -u # 取消当前 context
七、集群销毁与重建
7.1 删除所有节点
kubectl drain worker31.tz.cloud --ignore-daemonsets --force
kubectl drain worker32.tz.cloud --ignore-daemonsets --force
kubectl delete node worker31.tz.cloud worker32.tz.cloud
在 worker 节点上执行:
kubeadm reset -f
7.2 删除 master
kubectl delete node master30.tz.cloud
kubeadm reset -f
rm -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,如有版本差异请适当调整。
更多推荐

所有评论(0)