【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 目录 必须存在。
相关推荐
Linux-18744 小时前
分布式链路追踪系统之二进制安装skywalking
elasticsearch·云原生·skywalking·分布式链路追踪系统·应用程序性能监控
一叶龙洲5 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
敖行客 Allthinker7 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu
BullSmall8 小时前
Anolis OS 8.10 完整安装 Docker CE(生产可用,解决 podman 冲突)
docker·容器·podman
keyipatience8 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
heimeiyingwang9 小时前
【架构实战】可观测性三支柱:日志、指标、链路的融合
elasticsearch·架构·kubernetes
观山岳五楼9 小时前
Ubuntu 24 怎么使用Ubuntu 20 的镜像源
linux·运维·ubuntu
辰痕~10 小时前
物理机装Linux操作系统(Ubuntu为例)
linux·ubuntu
阿里云云原生11 小时前
阿里云 AgentTeams 7月第二周产品动态
云原生
CodexDave15 小时前
数据库连接池耗尽:排查顺序与三层兜底
服务器·前端·数据库·git·云原生·容器·kubernetes