前言
本文基于 Ubuntu 24.04 + Kubernetes 1.35.3 实战整理,从零搭建一套可用的 Kubernetes 集群环境。
k8s 在 1.24 之后正式移除了对 Docker 的支持,默认采用 containerd 作为容器运行时。本教程将基于 containerd 进行部署,并对国内环境下常见的镜像拉取问题做了优化(镜像加速、pause 镜像替换等)。
整篇内容覆盖以下关键点:
- containerd 正确配置(包括 SystemdCgroup)
- kubeadm 初始化配置优化
- 国内镜像源替换
- 网络插件 Flannel 安装
- Node 节点加入集群
适合人群:
- 想快速搭一套可用 k8s 环境的人
- 被各种初始化失败折磨过的人
- 不想在 pause 镜像上浪费人生 2 小时的人
开始安装
1. 关闭swap
bash
# k8s 要求关闭 swap,否则 kubelet 会直接拒绝启动
swapoff -a
sed -i 's|^/swap.img|#/swap.img|' /etc/fstab
rm -f /swap.img
查看一下,确保已经注释了
bash
grep swap /etc/fstab

2. 加载内核模块
bash
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
3. 设置sysctl
bash
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
sysctl --system
4. 安装容器运行时
bash
apt install -y containerd
5. 生成配置
bash
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
6. 修改关键配置
bash
# 使用 systemd 作为 cgroup 驱动(必须和 kubelet 保持一致)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 替换 pause 镜像(国内必须改,否则 kubeadm init 大概率卡死)
sed -i 's|sandbox_image = "registry.k8s.io/pause:3.8"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10.1"|' /etc/containerd/config.toml
7. 启动服务
bash
systemctl restart containerd
systemctl enable containerd
8. 添加阿里云源(懂的都懂)
bash
mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/deb/Release.key \
| sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/deb/ /" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list
apt update
9. 安装组件
bash
apt install -y kubelet=1.35.3-* kubeadm=1.35.3-* kubectl=1.35.3-*
10. 锁版本(防止系统突然"帮你升级")
bash
apt-mark hold kubelet kubeadm kubectl
11. 设置主机名
bash
hostnamectl set-hostname k8s-master
12. 配置hosts
bash
cat >> /etc/hosts << EOF
192.168.200.155 k8s-master
192.168.200.156 k8s-node1
EOF
这里的ip根据你自身情况配置,不要照抄,如果你只有一个master节点,那就把node1去掉就行了
13. 生成配置文件
bash
kubeadm config print init-defaults > kubeadm.yaml
14. 修改配置
bash
sed -i 's/advertiseAddress: .*/advertiseAddress: 192.168.200.155/' kubeadm.yaml
sed -i 's#imageRepository: .*#imageRepository: registry.aliyuncs.com/google_containers#' kubeadm.yaml
sed -i 's/^\s*name: .*$/ name: k8s-master/' kubeadm.yaml
sed -i 's/kubernetesVersion: .*/kubernetesVersion: v1.35.3/' kubeadm.yaml
sed -i '/serviceSubnet/a\ podSubnet: 10.244.0.0/16' kubeadm.yaml
注意:这里的192.168.200.155是你master节点的ip,根据你自身情况配置,不要照抄
15. 提前拉取镜像
bash
kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.35.3
我们可以通过cri工具,看一下镜像拉取成功了没有
bash
crictl images

16. 初始化
bash
kubeadm init --config kubeadm.yaml
初始化完成后,会有一串join命令,把这个记下来,一会儿node节点加入集群的时候会用到

很多人卡在这一步,一直初始化失败,需要检查一下/etc/containerd/config.toml里的pause镜像地址,是否已经改成了阿里云,而不是registry.k8s.io

17. 配置kubectl
bash
mkdir -p ~/.kube
cp /etc/kubernetes/admin.conf ~/.kube/config
chown $(id -u):$(id -g) ~/.kube/config
这时候执行kubectl get no看下节点状态,会看到k8s-master这个节点处于NotReady状态,原因是因为没有安装网络插件,所以还用不了

18. 安装网络插件flannel
bash
# 下载
curl -O https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 替换镜像源
sed -i 's|ghcr.io|ghcr.nju.edu.cn|g' kube-flannel.yml
# 部署
kubectl apply -f kube-flannel.yml
这时候我们需要等待部署完成,我们可以kubectl get po -A,来查看安装状态,当这3个的ready状态都是1/1的时候,就说网络插件安装完成了

这时候我们再查看节点状态,就会变成Ready了

到这里,k8s的master节点就安装完成了,接下来就是node节点的初始化和加入了
以下内容是node节点的操作,不是master节点的操作
19. node节点准备
在 Node 节点上重复以上1-10的步骤
20. 设置主机名
bash
hostnamectl set-hostname k8s-node1
注意,这里的hostname是k8s-node1,而不是刚刚的k8s-master
21. 设置hosts
bash
cat >> /etc/hosts << EOF
192.168.200.155 k8s-master
192.168.200.156 k8s-node1
EOF
22. 加入集群
这里的命令是刚刚master节点初始化时,控制台打印的命令
bash
kubeadm join 192.168.200.155:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:bb656d8e6b6e0b2ea38c48c40d396351d45a8a3b991d3ecb28f016fe83068322
如果不小心关掉了窗口,可以通过kubeadm token create --print-join-command来查看命令
23. 节点配置kubectl
这时候node节点还用不了kubectl,需要先创建文件夹
bash
mkdir -p ~/.kube
然后在master上执行,把配置文件复制到node节点去
bash
scp /etc/kubernetes/admin.conf root@node-ip:/root/.kube/config
这时候回到node节点,就可以正常使用kubectl了

一个基于 Ubuntu 24.04 + containerd 的 Kubernetes 集群就已经搭建完成了