【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 地址持久化(防止重启失联)

如果你是物理机环境,千万不要用 ifconfig 或 ip 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.9、etcd、coredns 等。

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 目录 必须存在。
相关推荐
阿里云云原生8 小时前
Agent 数据飞轮平台的选型和实践
云原生
做运维的阿瑞8 小时前
云项目可观测性与成本治理:告警、日志、Dashboard 与预算标签
大数据·云原生·云计算·terraform
无人生还别怕9 小时前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
知已难寻10 小时前
01 · OpenStack的认证管理 Keystone
运维·服务器·云原生·云计算·openstack
分布式存储与RustFS10 小时前
模型权重散落在每台 GPU?用 RustFS 给 vLLM 做共享权重库
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
易点云徐源10 小时前
HP 暗影精灵 PRO 16 安装双系统后,开机直接进入 Windows,按 F9 才能进入 Ubuntu:GRUB 菜单不显示的处理方法
linux·运维·ubuntu
木雷坞11 小时前
Baserow Docker部署:导入设备借用CSV,再用表单新增登记
运维·docker·容器
fb_1234511 小时前
从探针到权限:一篇吃透 Kubernetes 健康检查、RBAC 认证授权与 Dashboard 可视化管理
云原生·容器·kubernetes
wefg112 小时前
【Docker】基本指令
运维·docker·容器
mengge.cloud12 小时前
10-28-Kubernetes健康检查认证授权与Dashboard
云原生·容器·kubernetes