在企业级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 爱好者,在评论区留言交流探讨,互相学习。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐