Kubernetes 集群安装部署完整指南(Ubuntu 24.04 + K8s v1.28)
环境说明 :本文基于实际生产部署经验整理,使用 Ubuntu 24.04 LTS + Kubernetes v1.28.15 + containerd 1.7.28 + Calico 3.26.1 的经过验证的稳定组合,详细记录了 3 节点集群的完整安装过程,包含踩坑记录与解决方案,适合作为生产或学习环境的参考手册。
目录
- 一、软件版本选择
- 二、环境规划
- [2.1 节点规划](#2.1 节点规划)
- [2.2 网络规划](#2.2 网络规划)
- [2.3 端口规划](#2.3 端口规划)
- 三、前置准备:操作系统配置
- [3.1 安装 Ubuntu 24.04 LTS](#3.1 安装 Ubuntu 24.04 LTS)
- [3.2 配置静态 IP](#3.2 配置静态 IP)
- [3.3 配置 hosts 文件](#3.3 配置 hosts 文件)
- [3.4 配置 SSH 免密登录](#3.4 配置 SSH 免密登录)
- 四、所有节点:基础环境配置
- [4.1 禁用 Swap](#4.1 禁用 Swap)
- [4.2 配置内核参数](#4.2 配置内核参数)
- [4.3 安装 containerd(关键版本)](#4.3 安装 containerd(关键版本))
- [4.4 配置 containerd](#4.4 配置 containerd)
- [4.5 安装 Kubernetes 工具](#4.5 安装 Kubernetes 工具)
- [五、Master 节点:初始化集群](#五、Master 节点:初始化集群)
- [5.1 执行 kubeadm init](#5.1 执行 kubeadm init)
- [5.2 配置 kubectl](#5.2 配置 kubectl)
- [5.3 安装 Calico CNI 网络插件](#5.3 安装 Calico CNI 网络插件)
- [六、Worker 节点:加入集群](#六、Worker 节点:加入集群)
- 七、验证集群状态
- 八、部署测试应用
- [8.1 部署 Nginx 服务](#8.1 部署 Nginx 服务)
- [8.2 部署 Kubernetes Dashboard](#8.2 部署 Kubernetes Dashboard)
- 九、常见问题与解决方案
- 十、附录:版本兼容性速查表
一、软件版本选择
重要说明:Kubernetes 各组件之间的版本兼容性问题是安装过程中最常见的踩坑点,务必使用经过验证的版本组合。
✅ 推荐稳定版本组合(已验证)
| 组件 | 版本 | 备注 |
|---|---|---|
| 操作系统 | Ubuntu 24.04 LTS (Noble Numbat) | 内核 6.8,LTS 长期支持 |
| Kubernetes | v1.28.15 | 稳定版,社区支持良好 |
| containerd | 1.7.28 | 关键!必须使用 1.7.x 系列 |
| kubeadm | 1.28.15-1.1 | 与 K8s 版本保持一致 |
| kubelet | 1.28.15-1.1 | 与 K8s 版本保持一致 |
| kubectl | 1.28.15-1.1 | 与 K8s 版本保持一致 |
| Calico CNI | 3.26.1 | 网络插件 |
| CoreDNS | 1.10.1(自动) | K8s 自带,无需单独安装 |
❌ 不兼容版本说明(避免踩坑)
| 版本组合 | 问题描述 | 结论 |
|---|---|---|
| containerd 2.2.x + K8s v1.28 | containerd 2.x 默认生成 config v3 格式,而 K8s 1.28 的 kubelet 不支持,导致 API Server 启动崩溃 | ❌ 不可用 |
| K8s v1.32.x | 镜像源 registry.k8s.io 部分镜像在国内拉取困难,且与 containerd 1.7 存在兼容问题 |
❌ 不建议 |
| containerd 1.6.x + Ubuntu 24.04 | 包管理器不提供 1.6.x,且 systemd 兼容性差 | ❌ 不可用 |
核心原则:永远使用官方文档中记录的兼容版本矩阵,不要追新。
二、环境规划
2.1 节点规划
本文以 3 节点集群(1 Master + 2 Worker)为例,适用于开发测试及小型生产环境。
| 节点名称 | 角色 | IP 地址 | CPU | 内存 | 存储 | 说明 |
|---|---|---|---|---|---|---|
| k8s-master1 | Control Plane | 192.168.118.221 | 4 核 | 6 GB | 100 GB SSD | 集群控制节点 |
| k8s-master2 | Worker | 192.168.118.222 | 4 核 | 6 GB | 100 GB SSD | 工作节点 1 |
| k8s-worker1 | Worker | 192.168.118.223 | 4 核 | 6 GB | 100 GB SSD | 工作节点 2 |
集群总资源:
- 总 CPU:12 核 / 总内存:18 GB / 总存储:300 GB
- 工作负载可用:约 7.5 核 / 约 10.5 GB
节点最低配置要求:
- CPU:≥ 2 核
- 内存:≥ 2 GB(推荐 4 GB 以上)
- 存储:≥ 20 GB
- 网络:节点间可互通
2.2 网络规划
| 网络段 | CIDR | 说明 |
|---|---|---|
| 节点网络 | 192.168.118.0/24 | 物理/虚拟机网络 |
| Pod 网络 | 10.244.0.0/16 | Pod 间通信(Calico 管理) |
| Service 网络 | 10.96.0.0/12 | ClusterIP 服务地址段 |
| NodePort 范围 | 30000-32767 | 对外暴露服务端口范围 |
⚠️ 注意:三个网络段不能重叠,且不能与宿主机现有网络冲突。
2.3 端口规划
Master 节点需要开放的端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 6443 | TCP | Kubernetes API Server |
| 2379-2380 | TCP | etcd 服务端与客户端通信 |
| 10250 | TCP | Kubelet API |
| 10251 | TCP | kube-scheduler |
| 10252 | TCP | kube-controller-manager |
Worker 节点需要开放的端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 10250 | TCP | Kubelet API |
| 30000-32767 | TCP | NodePort 服务 |
三、前置准备:操作系统配置
3.1 安装 Ubuntu 24.04 LTS
从 Ubuntu 官网 下载 Ubuntu 24.04 LTS Server ISO 镜像,安装时注意以下事项:
- 选择 Ubuntu Server(minimized) 版本,节省系统资源
- 安装时不要选择安装额外软件包(后续按需安装)
- 建议使用 LVM 分区,便于后续扩容
- 记住安装时设置的用户名和密码(本文示例:
ubuntu/ubuntu)
安装完成后,更新系统:
bash
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y curl wget vim git net-tools
3.2 配置静态 IP
以下操作在每个节点上分别执行,根据节点角色修改对应 IP 地址。
Ubuntu 24.04 使用 Netplan 管理网络配置,配置文件位于 /etc/netplan/ 目录。
步骤 1:查看当前网络接口名称
bash
ip addr show
# 记录网卡名称,通常为 ens33、enp0s3 或 eth0 等
步骤 2:备份并编辑 Netplan 配置
bash
# 备份现有配置
sudo cp /etc/netplan/*.yaml /etc/netplan/backup_$(date +%Y%m%d).yaml
# 创建新的静态IP配置文件
sudo vim /etc/netplan/01-static-ip.yaml
k8s-master1(192.168.118.221)配置:
yaml
network:
version: 2
renderer: networkd
ethernets:
ens33: # 根据实际网卡名称修改
dhcp4: no
addresses:
- 192.168.118.221/24
routes:
- to: 0.0.0.0/0
via: 192.168.118.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114
k8s-master2(192.168.118.222)配置:
yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.118.222/24
routes:
- to: 0.0.0.0/0
via: 192.168.118.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114
k8s-worker1(192.168.118.223)配置:
yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.118.223/24
routes:
- to: 0.0.0.0/0
via: 192.168.118.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114
步骤 3:应用网络配置
bash
# 检查配置语法
sudo netplan generate
# 应用配置(断连风险,建议在控制台操作)
sudo netplan apply
# 验证 IP 地址
ip addr show | grep "inet "
步骤 4:验证网络连通性
bash
# 测试网关连通性
ping -c 3 192.168.118.1
# 测试外网连通性
ping -c 3 8.8.8.8
3.3 配置 hosts 文件
在所有节点上执行,确保节点间域名解析正常。
bash
sudo vim /etc/hosts
添加以下内容:
192.168.118.221 k8s-master1
192.168.118.222 k8s-master2
192.168.118.223 k8s-worker1
验证解析:
bash
ping -c 2 k8s-master1
ping -c 2 k8s-master2
ping -c 2 k8s-worker1
3.4 配置 SSH 免密登录
在 Master 节点配置到其他节点的免密登录,方便后续管理:
bash
# 在 k8s-master1 上生成密钥对
ssh-keygen -t rsa -b 4096 -C "k8s-master1" -f ~/.ssh/id_rsa -N ""
# 将公钥复制到各节点
ssh-copy-id ubuntu@k8s-master1
ssh-copy-id ubuntu@k8s-master2
ssh-copy-id ubuntu@k8s-worker1
四、所有节点:基础环境配置
⚠️ 以下所有步骤需要在 3 个节点上分别执行 ,可以通过 SSH 逐一操作,或使用
for循环批量执行。
批量执行方式(在 master1 上操作):
bash
for ip in 192.168.118.221 192.168.118.222 192.168.118.223; do
echo "=== 配置节点 $ip ==="
ssh ubuntu@$ip "sudo -i bash -s" << 'EOF'
# 将后续命令粘贴到此处
EOF
done
4.1 禁用 Swap
Kubernetes 要求必须禁用 Swap,否则 kubelet 会启动失败。
bash
# 立即禁用
sudo swapoff -a
# 永久禁用(注释掉 fstab 中的 swap 行)
sudo sed -i '/swap/s/^/#/' /etc/fstab
# 验证(输出为空表示已禁用)
sudo swapon --show
free -h | grep Swap
4.2 配置内核参数
Kubernetes 需要加载特定的内核模块并调整网络参数:
bash
# 加载必要的内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 配置 sysctl 参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 立即生效
sudo sysctl --system
# 验证配置
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
预期输出:
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
4.3 安装 containerd(关键版本)
🔴 关键步骤 :Ubuntu 24.04 默认软件源提供的 containerd 版本为 2.2.x,必须降级到 1.7.28,否则会导致 API Server 崩溃。
步骤 1:检查当前 containerd 版本
bash
# 如果 containerd 已安装,查看版本
containerd --version 2>/dev/null || echo "未安装"
步骤 2:安装指定版本的 containerd
bash
# 更新包索引
sudo apt-get update
# 安装指定版本(--allow-downgrades 允许降级)
sudo apt-get install -y --allow-downgrades containerd=1.7.28-0ubuntu1~24.04.2
# 锁定版本,防止自动升级
sudo apt-mark hold containerd
# 验证版本
containerd --version
# 应输出: containerd github.com/containerd/containerd 1.7.28 ...
💡 版本查询 :如果提示版本不存在,可以通过
apt-cache madison containerd查看可用版本列表。
4.4 配置 containerd
🔴 关键步骤:如果从 2.x 降级到 1.7.x,必须重新生成配置文件。旧的 config v3 格式与 K8s 1.28 不兼容。
bash
# 创建配置目录
sudo mkdir -p /etc/containerd
# 生成默认配置(关键:必须用新安装的 1.7.x 生成,不能沿用旧配置)
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# 启用 SystemdCgroup(Kubernetes 推荐使用 systemd 作为 cgroup 驱动)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 验证修改生效
grep "SystemdCgroup" /etc/containerd/config.toml
# 应输出: SystemdCgroup = true
# 重启并设置开机自启
sudo systemctl restart containerd
sudo systemctl enable containerd
# 验证运行状态
sudo systemctl status containerd
可选:配置国内镜像加速(网络受限环境推荐)
bash
# 编辑 containerd 配置
sudo vim /etc/containerd/config.toml
# 找到 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 部分
# 添加以下内容(Docker Hub 镜像加速):
# [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
# endpoint = ["https://mirror.ccs.tencentyun.com"]
4.5 安装 Kubernetes 工具
需要在节点上安装
kubeadm、kubelet、kubectl三个工具。
步骤 1:添加 Kubernetes 官方软件源(v1.28)
bash
# 安装依赖工具
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# 创建密钥存储目录
sudo mkdir -p /etc/apt/keyrings
# 下载并导入 GPG 公钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg --yes
# 添加 APT 软件源
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
# 更新包索引
sudo apt-get update
步骤 2:安装指定版本
bash
# 查看可用版本(可选)
apt-cache madison kubeadm | head -5
# 安装 1.28.15 版本
sudo apt-get install -y \
kubeadm=1.28.15-1.1 \
kubelet=1.28.15-1.1 \
kubectl=1.28.15-1.1
# 锁定版本,防止意外升级
sudo apt-mark hold kubeadm kubelet kubectl
# 验证版本
kubeadm version
kubectl version --client
kubelet --version
预期输出:
kubeadm version: &Version{Major:1, Minor:28, GitVersion:v1.28.15, ...}
Client Version: v1.28.15
Kubernetes v1.28.15
步骤 3:启动 kubelet
bash
sudo systemctl enable kubelet
sudo systemctl start kubelet
# 注意:此时 kubelet 会反复重启(因为集群还未初始化),这是正常现象
五、Master 节点:初始化集群
以下步骤仅在 k8s-master1 节点执行。
5.1 执行 kubeadm init
bash
sudo kubeadm init \
--kubernetes-version=v1.28.15 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.118.221 \
--service-cidr=10.96.0.0/12
参数说明:
| 参数 | 说明 |
|---|---|
--kubernetes-version |
指定 K8s 版本,防止自动选择最新版 |
--pod-network-cidr |
Pod 网络地址段,需与 Calico 配置保持一致 |
--apiserver-advertise-address |
API Server 对外广播地址,使用 Master 节点 IP |
--service-cidr |
Service 网络地址段 |
初始化成功输出示例:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You can now join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.118.221:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxx
🔴 重要 :请立即保存
kubeadm join命令,Worker 节点加入集群时需要用到!Token 默认有效期为 24 小时。
5.2 配置 kubectl
bash
# 为当前用户配置 kubectl 访问凭证
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 验证 kubectl 可用
kubectl cluster-info
kubectl get nodes
可选:配置 kubectl 命令补全
bash
# 安装 bash-completion
sudo apt-get install -y bash-completion
# 添加到 .bashrc
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc
# 立即生效
source ~/.bashrc
5.3 安装 Calico CNI 网络插件
⚠️ 必须 在所有节点加入集群前安装 CNI 插件,否则节点会一直处于
NotReady状态。
bash
# 应用 Calico 配置清单
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# 等待 Calico 相关 Pod 启动(约 1-2 分钟)
watch kubectl get pods -n kube-system
# 验证 Calico Pod 均为 Running 状态
kubectl get pods -n kube-system | grep calico
预期输出:
calico-kube-controllers-xxxx 1/1 Running 0 2m
calico-node-xxxxx 1/1 Running 0 2m
网络受限时的替代方案(手动下载):
bash
# 下载 YAML 文件
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# 应用本地文件
kubectl apply -f calico.yaml
六、Worker 节点:加入集群
以下步骤在 k8s-master2 和 k8s-worker1 上分别执行。
步骤 1:清理旧状态(如果是全新安装可跳过)
bash
# 如果节点之前加入过其他集群,先清理
sudo kubeadm reset -f
sudo rm -rf /etc/kubernetes/pki /etc/kubernetes/manifests
sudo rm -rf $HOME/.kube
步骤 2:执行加入命令(使用 master 初始化时输出的 join 命令)
bash
# 替换为实际的 token 和 hash 值
sudo kubeadm join 192.168.118.221:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxx
Token 已过期时重新获取(在 master1 执行):
bash
# 生成新的加入命令(token 有效期 24 小时)
kubeadm token create --print-join-command
步骤 3:在 Master 节点验证节点加入成功
bash
# 在 k8s-master1 上执行
kubectl get nodes
# 等待所有节点变为 Ready 状态(约 2-3 分钟)
watch kubectl get nodes
预期输出:
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane 10m v1.28.15
k8s-master2 Ready <none> 2m v1.28.15
k8s-worker1 Ready <none> 1m v1.28.15
七、验证集群状态
以下命令在 k8s-master1 上执行:
bash
# 查看节点状态
kubectl get nodes -o wide
# 查看所有系统 Pod(应全部为 Running)
kubectl get pods -A
# 查看集群信息
kubectl cluster-info
# 查看组件状态
kubectl get componentstatuses
# 查看节点资源使用情况(需要 Metrics Server)
kubectl top nodes
健康集群的预期状态:
NAME STATUS ROLES VERSION INTERNAL-IP
k8s-master1 Ready control-plane v1.28.15 192.168.118.221
k8s-master2 Ready <none> v1.28.15 192.168.118.222
k8s-worker1 Ready <none> v1.28.15 192.168.118.223
# 系统 Pod 数量:13 个,均为 Running 状态
NAMESPACE NAME READY STATUS
kube-system calico-kube-controllers-xxx 1/1 Running
kube-system calico-node-xxx (x3) 1/1 Running
kube-system coredns-xxx (x2) 1/1 Running
kube-system etcd-k8s-master1 1/1 Running
kube-system kube-apiserver-k8s-master1 1/1 Running
kube-system kube-controller-manager-k8s-master1 1/1 Running
kube-system kube-proxy-xxx (x3) 1/1 Running
kube-system kube-scheduler-k8s-master1 1/1 Running
八、部署测试应用
8.1 部署 Nginx 服务
bash
# 创建 3 副本的 Nginx 部署
kubectl create deployment nginx \
--image=nginx:1.25.5 \
--replicas=3
# 暴露为 NodePort 服务
kubectl expose deployment nginx \
--port=80 \
--type=NodePort \
--name=nginx-service
# 查看服务信息(获取 NodePort 端口号)
kubectl get svc nginx-service
# 查看 Pod 分布情况
kubectl get pods -o wide
访问验证:
bash
# 获取 NodePort
NGINX_PORT=$(kubectl get svc nginx-service -o jsonpath='{.spec.ports[0].nodePort}')
echo "访问地址: http://192.168.118.221:$NGINX_PORT"
# 使用 curl 测试
curl -s http://192.168.118.221:$NGINX_PORT | grep "<title>"
# 应输出: <title>Welcome to nginx!</title>
8.2 部署 Kubernetes Dashboard
bash
# 部署 Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 创建管理员 ServiceAccount
kubectl create serviceaccount admin-user -n kubernetes-dashboard
# 绑定 cluster-admin 角色
kubectl create clusterrolebinding admin-user \
--clusterrole=cluster-admin \
--serviceaccount=kubernetes-dashboard:admin-user
# 将 Dashboard Service 改为 NodePort 暴露
kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard \
-p '{"spec":{"type":"NodePort","ports":[{"port":443,"targetPort":8443,"nodePort":30443}]}}'
# 验证 Dashboard Pod 状态
kubectl get pods -n kubernetes-dashboard
# 生成登录 Token(有效期 100 年)
kubectl -n kubernetes-dashboard create token admin-user --duration=87600h
访问 Dashboard:
- URL:
https://192.168.118.221:30443(浏览器会提示不安全,点击继续) - 选择 Token 登录方式,粘贴上一步生成的 Token
九、常见问题与解决方案
问题 1:containerd 启动失败 - "config version 3 not supported"
错误信息:
FATA[0000] Failed to load config file: config version "3" is not supported, only version "2" is supported
原因:从 containerd 2.x 降级到 1.7.x 后,原有配置文件格式不兼容。
解决方案:
bash
# 删除旧配置,重新生成(必须使用 1.7.x 版本的 containerd 生成)
sudo rm -f /etc/containerd/config.toml
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl status containerd # 验证状态正常
问题 2:kubeadm join 报端口占用 - "port is already in use"
错误信息:
[ERROR Port-10250]: Port 10250 is in use
原因:节点之前加入过集群,kubelet 残留进程仍在运行。
解决方案:
bash
# 彻底重置节点状态
sudo kubeadm reset -f
# 清理残留目录
sudo rm -rf /etc/kubernetes/pki
sudo rm -rf /etc/kubernetes/manifests
sudo rm -rf /var/lib/etcd
sudo rm -rf $HOME/.kube
# 重启 kubelet
sudo systemctl restart kubelet
问题 3:节点长时间 NotReady
错误信息:
NAME STATUS ROLES
k8s-master1 NotReady control-plane
排查步骤:
bash
# 步骤 1:查看节点详细信息
kubectl describe node k8s-master1 | grep -A 10 "Conditions:"
# 步骤 2:检查 kubelet 日志
sudo journalctl -u kubelet -f --no-pager | tail -50
# 步骤 3:检查 containerd 状态
sudo systemctl status containerd
# 步骤 4:检查 Calico Pod 状态
kubectl get pods -n kube-system | grep calico
常见原因及解决:
| 原因 | 解决方案 |
|---|---|
| CNI 插件未安装 | kubectl apply -f calico.yaml |
| Calico Pod 未就绪 | kubectl delete pod -n kube-system -l k8s-app=calico-node |
| containerd 异常 | 参见问题 1 解决方案 |
| 网络不通(Pod CIDR 冲突) | 检查网络规划,确保无地址段冲突 |
问题 4:镜像拉取失败 - "failed to pull image"
错误信息:
Failed to pull image "registry.k8s.io/kube-apiserver:v1.28.15": rpc error
原因 :国内无法访问 registry.k8s.io。
解决方案一:配置代理
bash
# 为 containerd 配置 HTTP 代理
sudo mkdir -p /etc/systemd/system/containerd.service.d
cat <<EOF | sudo tee /etc/systemd/system/containerd.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://your-proxy:port"
Environment="HTTPS_PROXY=http://your-proxy:port"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8"
EOF
sudo systemctl daemon-reload
sudo systemctl restart containerd
解决方案二:使用国内镜像源(推荐)
bash
# 预先拉取镜像(使用阿里云镜像源)
kubeadm config images pull \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.28.15
# 初始化时指定镜像仓库
sudo kubeadm init \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.118.221
问题 5:kubeadm init 卡住 - 超时或 etcd 未启动
错误信息:
[wait-control-plane] Waiting for the kubelet to boot up the control plane
[kubelet-check] Initial timeout of 40s passed.
排查步骤:
bash
# 查看 kubelet 日志
sudo journalctl -u kubelet -n 100 --no-pager
# 常见原因:Swap 未关闭
sudo swapon --show # 输出为空才正常
# 常见原因:containerd 配置错误
sudo systemctl status containerd
# 常见原因:节点时间不同步(etcd 对时间敏感)
timedatectl status
sudo apt-get install -y ntp
sudo systemctl enable ntp && sudo systemctl start ntp
问题 6:kubectl 无法连接 - "The connection to the server was refused"
错误信息:
The connection to the server 192.168.118.221:6443 was refused
解决方案:
bash
# 检查 kubeconfig 是否正确配置
ls -la ~/.kube/config
# 如果未配置,重新执行
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 检查 API Server 是否运行
sudo systemctl status kube-apiserver 2>/dev/null || \
kubectl get pod -n kube-system kube-apiserver-k8s-master1
问题 7:Dashboard 登录 Token 失效
解决方案:重新生成 Token
bash
# 生成新 Token(有效期 24 小时)
kubectl -n kubernetes-dashboard create token admin-user
# 或生成长期有效 Token(有效期 100 年)
kubectl -n kubernetes-dashboard create token admin-user --duration=87600h
常见问题速查表
| 问题现象 | 可能原因 | 快速解决 |
|---|---|---|
| containerd 启动失败,提示 config version 3 | 2.x 降级后配置不兼容 | containerd config default 重新生成配置 |
| kubeadm join 端口被占用 | 旧 kubelet 残留 | kubeadm reset -f 后重试 |
| 节点 NotReady | CNI 未安装 | 确认 Calico 所有 Pod 为 Running |
| 镜像拉取超时 | registry.k8s.io 无法访问 | 使用阿里云镜像源或配置代理 |
| kubeadm init 超时 | Swap 未关闭 / containerd 异常 | 检查 swap 和 containerd 状态 |
| kubectl 连接被拒绝 | kubeconfig 未配置 | 复制 admin.conf 到 ~/.kube/config |
| Pod 一直 Pending | 资源不足 / 节点污点 | kubectl describe pod 查看 Events |
| DNS 解析失败 | CoreDNS 未就绪 | kubectl get pods -n kube-system |
十、附录:版本兼容性速查表
Kubernetes 与 containerd 兼容矩阵
| K8s 版本 | containerd 推荐版本 | 说明 |
|---|---|---|
| v1.28.x | 1.7.x | 本文使用,稳定 |
| v1.29.x | 1.7.x / 2.0.x | 需测试 |
| v1.30.x | 1.7.x / 2.0.x | 需测试 |
| v1.32.x | 2.0.x+ | 部分镜像拉取问题 |
实际验证的最终集群状态
# 节点状态(2026-05-29 验证)
NAME STATUS ROLES VERSION
k8s-master1 Ready control-plane v1.28.15
k8s-master2 Ready <none> v1.28.15
k8s-worker1 Ready <none> v1.28.15
# 版本组合(已验证)
K8s: v1.28.15
containerd: 1.7.28
Calico: 3.26.1
OS: Ubuntu 24.04 LTS
# 系统 Pod:13 个,全部 Running
# 部署服务:
# nginx NodePort 31441 3副本 nginx:1.25.5
# Dashboard NodePort 30443 1副本 v2.7.0
参考资料
文档版本 :1.0
最后更新 :2026-06-01
适用版本 :Ubuntu 24.04 LTS + Kubernetes v1.28.15
验证环境 :3 节点集群(4C6G/节点)
作者说明:本文基于真实生产部署过程整理,所有踩坑记录均来自实际操作,如有问题欢迎在评论区交流。
如果本文对你有帮助,欢迎点赞收藏 👍