【K8s 避坑指南】2026 最新 Kubernetes v1.28 + Containerd 安装全流程(内网/离线通用版)

前言

很多人在安装 K8s 时,第一步就倒在了环境初始化上。

报错 Container runtime is not running

初始化卡在 Pulling images

Pod 状态一直是 ContainerCreating

本文基于 Ubuntu 20.04/22.04 物理机实战,总结了在 无外网权限国内网络环境 下,如何稳准狠地安装 Kubernetes v1.28 版本。拒绝盲目复制粘贴,每一行配置都有实战依据。


一、 基础环境"三板斧"

不做这一步,后续绝对报错。 无论你是 Master 还是 Worker,这三步必须固化到系统里。

1. 彻底封印 Swap

K8s 的设计理念要求内存绝对可控,Swap 会导致性能不可预测。

bash 复制代码
# 1. 临时关闭(立即生效)
sudo swapoff -a

# 2. 永久关闭(防止重启失效)
# 这一行命令会自动注释掉 /etc/fstab 里的 swap 配置
sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

# 3. 验证
free -h  # Swap 这一行必须全是 0

2. 激活内核流量转发

K8s 的网络插件(如 Flannel)需要内核支持网桥流量过滤。

bash 复制代码
# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

# 开启 IP 转发
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

3. IP 地址持久化(防止重启失联)

如果你是物理机环境,千万不要用 ifconfigip addr 临时配 IP。
建议使用 Netplan 配置静态 IP:

yaml 复制代码
# /etc/netplan/00-installer-config.yaml 示例
network:
  ethernets:
    enp3s0:  # 你的网卡名
      addresses: [10.10.10.10/24] # 你的静态IP
      # gateway4: ... (内网机器不要乱配网关,容易断网)
  version: 2

执行 sudo netplan apply 锁定配置。


二、 容器运行时:Containerd 的"驯服"

K8s v1.24+ 移除了 Docker Shim,Containerd 成为标配。这里有两个巨坑

1. 安装 Containerd

bash 复制代码
# 使用 Docker 官方源或阿里云源安装
sudo apt-get update
sudo apt-get install -y containerd.io

2. 关键配置(避坑核心)

默认的配置在国内无法使用(连不上 Google),且 Cgroup 驱动不对。

bash 复制代码
# 1. 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 2. 修改 Sandbox 镜像(解决离线/国内网络拉取失败)
# 将 registry.k8s.io 替换为阿里云镜像
sudo sed -i 's/registry.k8s.io\/pause:3.6/registry.aliyuncs.com\/google_containers\/pause:3.9/g' /etc/containerd/config.toml

# 3. 开启 SystemdCgroup(解决 Kubelet 启动失败)
# 这一步至关重要!
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# 4. 重启服务
sudo systemctl restart containerd

3. 修正 crictl

如果不做这一步,用 crictl ps 查看容器时会报错。

bash 复制代码
sudo crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock --set image-endpoint=unix:///run/containerd/containerd.sock

三、 Kubernetes 组件安装 (Kubeadm)

1. 配置阿里云源

国内直接 apt install 会超时。

bash 复制代码
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - 
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt-get update

2. 锁定安装 v1.28 版本

生产环境忌讳版本自动升级,必须锁死版本。

bash 复制代码
# 安装
sudo apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00

# 锁定
sudo apt-mark hold kubelet kubeadm kubectl

# 开机自启
sudo systemctl enable kubelet

四、 离线环境特殊处理(独家经验)

如果你的机器完全断网(Air-gapped),kubeadm init 会卡死在拉取镜像这一步。

1. 预判需要的镜像

在有网的机器上执行:

bash 复制代码
kubeadm config images list --kubernetes-version v1.28.2

你会看到它需要 pause:3.9etcdcoredns 等。

2. 离线"搬运"大法

在有网机器下载并导出,再拷贝到内网机器导入:

bash 复制代码
# 导出 (在有网机器)
sudo ctr -n k8s.io images pull registry.aliyuncs.com/google_containers/pause:3.9
sudo ctr -n k8s.io images export pause.tar registry.aliyuncs.com/google_containers/pause:3.9

# 导入 (在内网机器)
sudo ctr -n k8s.io images import pause.tar

注意 :必须导入到 k8s.io 这个 namespace,否则 K8s 即使本地有镜像也看不见!


五、 初始化集群 (Control Plane)

万事俱备,开始初始化。

bash 复制代码
sudo kubeadm init \
  --apiserver-advertise-address=10.10.10.10 \  # 你的本机静态IP
  --image-repository registry.aliyuncs.com/google_containers \ # 指定阿里云镜像
  --kubernetes-version v1.28.2 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 # 配合 Flannel 使用

成功标志:

终端输出 Your Kubernetes control-plane has initialized successfully! 并给出了 kubeadm join 命令。


六、 最后的拼图:网络插件 CNI

初始化后节点状态是 NotReady,必须安装 CNI。我们选择 Flannel。

1. 两个常见报错处理

  • 报错一Failed to create pod sandbox

  • 原因:缺少 CNI 目录。

  • 解决sudo mkdir -p /opt/cni/bin /etc/cni/net.d

  • 报错二Init:0/2 卡死

  • 原因:YAML 文件里的镜像版本(如 v0.28.0)和你本地下载的版本(如 v0.25.1)不一致。

  • 解决 :修改 kube-flannel.yml,将 image 版本号改为你本地实际有的版本。

2. 安装命令

bash 复制代码
kubectl apply -f kube-flannel.yml

总结

安装 K8s 并不难,难的是环境的一致性网络连通性

  1. SystemdCgroup 必须开。
  2. Swap 必须关。
  3. Sandbox 镜像 必须本地有(或能下载)。
  4. CNI 目录 必须存在。
相关推荐
内卷焦虑人士9 小时前
Windows安装WSL2+Ubuntu 22.04
linux·windows·ubuntu
岁岁种桃花儿9 小时前
kubenetes从入门到上天系列第二十一篇:Kubernetes安装Ingress实战
云原生·容器·kubernetes
程序员老赵11 小时前
超全 Docker 镜像源配置指南|Windows/Mac/Linux一键搞定,拉镜像再也不卡顿
linux·后端·容器
门豪杰11 小时前
Ubuntu下安装Claude Code
linux·运维·ubuntu·claude·claude code
掘根12 小时前
【微服务即时通讯】文件存储子服务
微服务·云原生·架构
一殊酒12 小时前
【Docker】Docker Desktop 安装指南及汉化教程
运维·docker·容器
0w0不秃头程序猿12 小时前
guide哥AI智能面试项目部署过程
云原生·eureka
阿里云云原生12 小时前
漫说运维:LoongCollector 性能与稳定性技术大解密
云原生
深蓝轨迹13 小时前
彻底删除VMware虚拟机并清理残留,解决虚拟网卡消失问题
windows·ubuntu·centos
²º²²এ松16 小时前
vs code连接ubuntu esp项目
linux·数据库·ubuntu