前言本文基于Ubuntu 24.04 Kubernetes 1.35.3实战整理从零搭建一套可用的 Kubernetes 集群环境。k8s 在 1.24 之后正式移除了对 Docker 的支持默认采用containerd作为容器运行时。本教程将基于 containerd 进行部署并对国内环境下常见的镜像拉取问题做了优化镜像加速、pause 镜像替换等。整篇内容覆盖以下关键点containerd 正确配置包括 SystemdCgroupkubeadm 初始化配置优化国内镜像源替换网络插件 Flannel 安装Node 节点加入集群适合人群想快速搭一套可用 k8s 环境的人被各种初始化失败折磨过的人不想在 pause 镜像上浪费人生 2 小时的人开始安装1. 关闭swap# k8s 要求关闭 swap否则 kubelet 会直接拒绝启动 swapoff -a sed -i s|^/swap.img|#/swap.img| /etc/fstab rm -f /swap.img查看一下确保已经注释了grep swap /etc/fstab2. 加载内核模块cat EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter3. 设置sysctlcat 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 --system4. 安装容器运行时apt install -y containerd5. 生成配置mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml6. 修改关键配置# 使用 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.toml7. 启动服务systemctl restart containerd systemctl enable containerd8. 添加阿里云源懂的都懂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 update9. 安装组件apt install -y kubelet1.35.3-* kubeadm1.35.3-* kubectl1.35.3-*10. 锁版本防止系统突然“帮你升级”apt-mark hold kubelet kubeadm kubectl11. 设置主机名hostnamectl set-hostname k8s-master12. 配置hostscat /etc/hosts EOF 192.168.200.155 k8s-master 192.168.200.156 k8s-node1 EOF这里的ip根据你自身情况配置不要照抄如果你只有一个master节点那就把node1去掉就行了13. 生成配置文件kubeadm config print init-defaults kubeadm.yaml14. 修改配置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. 提前拉取镜像kubeadm config images pull \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.35.3我们可以通过cri工具看一下镜像拉取成功了没有crictl images16. 初始化kubeadm init --config kubeadm.yaml初始化完成后会有一串join命令把这个记下来一会儿node节点加入集群的时候会用到很多人卡在这一步一直初始化失败需要检查一下/etc/containerd/config.toml里的pause镜像地址是否已经改成了阿里云而不是registry.k8s.io17. 配置kubectlmkdir -p ~/.kube cp /etc/kubernetes/admin.conf ~/.kube/config chown $(id -u):$(id -g) ~/.kube/config这时候执行kubectl get no看下节点状态会看到k8s-master这个节点处于NotReady状态原因是因为没有安装网络插件所以还用不了18. 安装网络插件flannel# 下载 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. 设置主机名hostnamectl set-hostname k8s-node1注意这里的hostname是k8s-node1而不是刚刚的k8s-master21. 设置hostscat /etc/hosts EOF 192.168.200.155 k8s-master 192.168.200.156 k8s-node1 EOF22. 加入集群这里的命令是刚刚master节点初始化时控制台打印的命令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需要先创建文件夹mkdir -p ~/.kube然后在master上执行把配置文件复制到node节点去scp /etc/kubernetes/admin.conf rootnode-ip:/root/.kube/config这时候回到node节点就可以正常使用kubectl了一个基于 Ubuntu 24.04 containerd 的 Kubernetes 集群就已经搭建完成了