从零搭建 Kubernetes 1.30 集群:基于 kubeadm 的完整部署与集群管理指南

手把手教你用 kubeadm 部署生产级 K8s 集群,并掌握节点管理、命名空间与多集群切换


写在前面

Kubernetes 作为容器编排的事实标准,已经成为云原生时代的必备技能。本文基于 Ubuntu 24.04Kubernetes 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 时,断开网络 以避免自动更新拖慢安装。
  • 分区建议:/boot 2GB,/ 剩余全部(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-proxypause

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,如有版本差异请适当调整。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐