前言 :
很多人在安装 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 并不难,难的是环境的一致性 和网络连通性。
- SystemdCgroup 必须开。
- Swap 必须关。
- Sandbox 镜像 必须本地有(或能下载)。
- CNI 目录 必须存在。