【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 目录 必须存在。
相关推荐
阿里云云原生1 天前
阿里云获评 Agentic AI 开发平台领导者,函数计算 AgentRun 赢下关键分!
云原生
蝎子莱莱爱打怪2 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀2 天前
Docker部署Nacos
docker·容器
缓解AI焦虑2 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
阿里云云原生2 天前
MSE Nacos Prompt 管理:让 AI Agent 的核心配置真正可治理
微服务·云原生
阿里云云原生2 天前
当 AI Agent 接管手机:移动端如何进行观测
云原生·agent
阿里云云原生2 天前
AI 原生应用开源开发者沙龙·深圳站精彩回顾 & PPT下载
云原生
阿里云云原生2 天前
灵感启发:日产文章 100 篇,打造“实时热点洞察”引擎
云原生
1candobetter2 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
~莫子2 天前
Haproxy七层负载详解+实验详细代码
云原生