在企业级DevOps仿真实验环境中,Kubernetes(简称K8s)作为容器编排的核心工具,是实现服务自动化部署、伸缩和管理的关键。本文将基于Ubuntu 22.04系统,详细讲解K8s v1.28.2单节点集群的完整搭建流程,采用containerd作为容器运行时、Flannel作为网络插件,步骤清晰且附带详细命令和验证方法,新手也能顺利上手完成搭建。
先明确本次搭建的环境信息,确保实验环境与本文一致,避免因环境差异导致搭建失败:
- 系统版本:Ubuntu 22.04
- 节点信息:ControlNodeA(IP:192.168.0.151)
- K8s版本:v1.28.2
- 容器运行时:containerd
- 网络插件:Flannel
一、系统基础准备:安装依赖与环境初始化
搭建K8s集群前,首先需要完成系统基础配置,安装必要的依赖工具,确保后续操作顺利进行。打开终端,执行以下命令更新软件源并安装基础工具,包括证书、curl、gnupg等,这些都是后续配置软件源和安装组件的基础。
|---------------------------------------------------------------------------------------------------------------------|
| bash # 更新软件源、安装基础工具 sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release bash-completion |

二、关闭Swap分区:K8s集群的强制要求
Kubernetes要求必须关闭Swap分区,否则会影响集群的稳定性和性能(Swap会导致内存交换,影响容器运行效率)。这里提供临时关闭和永久关闭两种方式,确保重启系统后Swap依然处于关闭状态。
|-------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 临时关闭Swap(立即生效,重启后失效) sudo swapoff -a # 永久关闭Swap(注释配置文件,永久生效) sudo sed '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab | sudo tee /etc/fstab |
三、加载内核模块:满足容器网络依赖
容器网络的正常运行需要依赖overlay和br_netfilter两个内核模块,我们需要将这两个模块写入配置文件,确保开机自动加载,同时立即加载模块使其当前生效。
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 写入模块配置(安全tee写法,无覆盖风险) cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF # 立即加载模块 sudo modprobe overlay sudo modprobe br_netfilter |
四、配置系统网络参数:保障集群网络通信
为了让K8s集群能够正常通信,需要配置系统网络参数,开启桥接网络的iptables转发功能,这些参数是K8s网络正常工作的前提,配置后立即生效。
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 写入网络配置(安全tee写法,避免直接修改文件出错) 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 |

五、安装并配置containerd:核心容器运行时
containerd是K8s官方推荐的容器运行时,负责管理容器的生命周期,相比Docker更轻量、更贴合K8s的需求。本节将完成containerd的安装、配置,并优化镜像源,避免国内网络环境导致的下载超时问题。
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 1. 安装containerd sudo apt update && sudo apt install -y containerd # 2. 生成默认配置并修改关键参数 sudo mkdir -p /etc/containerd # 生成默认配置文件 sudo containerd config default | sudo tee /etc/containerd/config.toml # 修改SystemdCgroup为true(适配K8s的系统级资源管理) sudo sed 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml | sudo tee /etc/containerd/config.toml.tmp > /dev/null sudo mv /etc/containerd/config.toml.tmp /etc/containerd/config.toml # 修改sandbox镜像(替换为阿里云镜像,解决国内下载慢问题) sudo sed "s|sandbox = '.*'|sandbox = 'registry.aliyuncs.com/google_containers/pause:3.9'|" /etc/containerd/config.toml | sudo tee /etc/containerd/config.toml.tmp > /dev/null sudo mv /etc/containerd/config.toml.tmp /etc/containerd/config.toml # 验证配置是否修改成功 grep 'sandbox' /etc/containerd/config.toml grep 'SystemdCgroup' /etc/containerd/config.toml # 3. 重启并设置containerd开机自启 sudo systemctl daemon-reload sudo systemctl enable --now containerd sudo systemctl restart containerd |

配置完成后,我们安装crictl工具(K8s提供的容器运行时命令行工具),用于管理containerd容器,这里使用国内高速镜像下载,提升下载速度。
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 下载crictl(国内高速镜像,避免github访问超时) wget https://ghproxy.net/https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.30.0/crictl-v1.30.0-linux-amd64.tar.gz -O crictl.tar.gz # 解压到系统命令目录(确保全局可执行) sudo tar zxvf crictl.tar.gz -C /usr/local/bin/ # 删除安装包,清理环境 rm -f crictl.tar.gz |
安装完成后,立即验证crictl是否安装成功,执行以下命令,若输出版本号则说明安装正常。
|-----------------------|
| bash crictl --version |

接下来配置crictl与containerd的连接,确保crictl能够正常管理containerd容器,配置完成后进行测试。
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 配置crictl连接containerd sudo crictl config runtime-endpoint unix:///run/containerd/containerd.sock sudo crictl config image-endpoint unix:///run/containerd/containerd.sock # 测试连接是否正常(输出一大段JSON即为正常) sudo crictl info |

六、配置Kubernetes阿里云软件源:解决密钥与404问题
由于K8s官方源在国内访问较慢,且容易出现密钥失效、404等问题,本文采用阿里云镜像源,同时导入正确格式的GPG密钥,确保软件源配置无误。
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 1. 导入正确格式的GPG密钥(解决"当前不支持该文件类型"报错) curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg \ | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-aliyun.gpg # 2. 添加K8s软件源(指定签名密钥,避免验证失败) echo "deb [signed-by=/etc/apt/trusted.gpg.d/kubernetes-aliyun.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" \ | sudo tee /etc/apt/sources.list.d/kubernetes.list # 3. 更新源(无报错即为配置成功) sudo apt update |

软件源配置完成后,安装指定版本的K8s核心组件(kubelet、kubeadm、kubectl),并锁定版本,防止系统自动升级导致版本不兼容。
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 安装指定版本的K8s核心组件(与本文K8s版本v1.28.2对应) sudo apt install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00 # 锁定版本,防止自动升级 sudo apt-mark hold kubelet kubeadm kubectl |

七、预拉取阿里云镜像:避免集群初始化超时
K8s集群初始化时,需要拉取多个核心镜像,若直接从官方源拉取,国内网络环境下容易超时失败。因此,我们提前从阿里云镜像源拉取所需镜像,确保初始化过程顺利。
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash sudo crictl pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2 sudo crictl pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2 sudo crictl pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2 sudo crictl pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0 sudo crictl pull registry.aliyuncs.com/google_containers/coredns:v1.10.1 sudo crictl pull registry.aliyuncs.com/google_containers/pause:3.9 |
八、初始化Kubernetes集群:核心操作步骤
镜像预拉取完成后,执行K8s集群初始化命令,指定APIServer的广告地址(即当前节点IP)、K8s版本和Pod网络段,使用阿里云镜像仓库避免超时。
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash sudo kubeadm init \ --apiserver-advertise-address=192.168.0.151 \ --kubernetes-version=v1.28.2 \ --pod-network-cidr=10.244.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers |

重要提示:初始化成功后,终端会输出一条kubeadm join命令,务必复制保存好!这条命令用于后续其他节点加入集群(单节点集群可暂时忽略,但建议保存备用)。
九、配置kubectl认证:允许普通用户访问集群
集群初始化完成后,默认只有root用户能通过kubectl访问集群,我们需要配置普通用户的认证权限,方便后续操作(无需每次都使用sudo)。
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 创建kubectl配置目录 mkdir -p HOME/.kube # 复制集群认证文件到当前用户目录 sudo cp -i /etc/kubernetes/admin.conf HOME/.kube/config # 授权当前用户访问配置文件 sudo chown (id -u):(id -g) HOME/.kube/config chmod 600 HOME/.kube/config |
十、安装网络插件Flannel:确保节点Ready
K8s集群初始化后,节点处于NotReady状态,原因是未安装网络插件,Pod之间无法通信。本文采用Flannel网络插件,使用国内镜像地址下载,速度更快,执行以下命令即可完成安装。
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 安装Flannel网络插件(国内镜像加速,秒级下载) kubectl apply -f https://ghproxy.net/https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml |
安装完成后,等待1-2分钟,Flannel插件会自动部署完成,节点状态会自动变为Ready。
十一、集群验证:确认搭建成功
完成以上所有步骤后,我们需要验证集群是否正常运行,主要检查节点状态和系统Pod状态,两者均正常则说明集群搭建成功。
|---------------------------------------------------------------------------------------------------------|
| bash # 查看节点状态(显示Ready即为正常) kubectl get nodes # 查看系统Pod状态(全部Running即为正常) kubectl get pods -n kube-system |


若执行命令后,节点状态为Ready,kube-system命名空间下的所有Pod均为Running状态,说明Kubernetes单节点集群已成功搭建完成,可以开始后续的DevOps实验和容器部署操作了。
总结
本文详细讲解了Ubuntu 22.04系统下K8s v1.28.2单节点集群的完整搭建流程,从系统准备、容器运行时配置,到集群初始化、网络插件安装,每一步都附带详细命令和注意事项,同时解决了国内网络环境下镜像下载慢、密钥报错等常见问题。
本文为"搭建DevOps企业级仿真实验环境"系列的一部分,所有内容均基于实际硬件环境(32核64线程 / 128G内存 / 6T硬盘)编写,力求贴近真实企业部署场景。
欢迎各位 DevOps、SRE 爱好者,在评论区留言交流探讨,互相学习。