K8s 1.28.2 + Containerd + CentOS7.9 集群部署

👉 关联文章|Containerd 从入门到精通:一篇吃透安装、镜像、排障全流程(涵盖 containerd安装与镜像加速配置)

一、集群环境规划

1.1 集群架构

采用 1 Master + 2 Node 架构,共 3 个节点,均基于 CentOS7.9 系统部署。

1.2 节点信息

节点角色 IP 地址 主机名
Master 192.168.209.100 master
Node 192.168.209.101 node1
Node 192.168.209.102 node2

1.3 部署组件及版本

  • 操作系统:CentOS 7.9
  • Kubernetes 版本:1.28.2
  • 容器运行时:Containerd(默认配套版本)
  • 网络插件:Flannel

二、前置准备(所有节点执行)

2.1 配置 YUM 源

清理原有 YUM 源,配置阿里云基础源、K8s 源和 Docker CE 源,确保软件包下载速度。

bash 复制代码
# 1. 清理原有 YUM 源配置
rm -rf /etc/yum.repos.d/*

# 2. 配置阿里云 CentOS 基础源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 

# 3. 配置 K8s YUM 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64  
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg  
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg  
EOF

# 4. 刷新 YUM 缓存并安装依赖工具
yum repolist all
yum -y install yum-utils wget

# 5. 配置 Docker CE 仓库(用于安装 Containerd)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

2.2 配置主机名与 hosts 解析

统一配置主机名,添加 hosts 映射,确保节点间通过主机名正常通信。

bash 复制代码
# 1. 分别配置对应节点的主机名(Master 节点执行)
hostnamectl set-hostname master

# Node1 节点执行
hostnamectl set-hostname node1

# Node2 节点执行
hostnamectl set-hostname node2

# 2. 所有节点添加 hosts 映射
cat >>/etc/hosts <<EOF
192.168.209.100 master
192.168.209.101 node1
192.168.209.102 node2
EOF

# 验证:ping 主机名测试通信
ping master -c 3
ping node1 -c 3
ping node2 -c 3

2.3 配置 NTP 时间同步

K8s 集群对节点时间一致性要求较高,需配置 NTP 服务实现时间同步。

bash 复制代码
# 1. 所有节点安装 NTP 服务
yum install -y ntp*

# 2. 选择 Master 节点作为主时间服务器,在 Master 节点执行以下配置
cat >> /etc/ntp.conf <<EOF
server 192.168.209.100 iburst
server 192.168.209.101 iburst
server 192.168.209.102 iburst
EOF

# 3. 所有节点启动并设置 NTP 服务开机自启
systemctl enable ntpd && systemctl start ntpd && systemctl restart ntpd

# 验证:查看时间同步状态
ntpq -p

2.4 关闭 SELinux 及 Firewalld

关闭防火墙和 SELinux,避免其影响 K8s 组件通信和容器网络。

bash 复制代码
# 1. 永久关闭 SELinux(需重启生效,临时关闭用 setenforce 0)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

# 2. 关闭并禁用 Firewalld
systemctl disable firewalld
systemctl stop firewalld

# 验证:查看 SELinux 状态和防火墙状态
getenforce  # 输出 Disabled 即为成功
systemctl status firewalld  # 输出 inactive 即为成功

2.5 关闭 Swap 分区

Kubernetes 1.8 及以上版本要求关闭 Swap,否则 kubelet 无法正常启动。

bash 复制代码
# 1. 临时关闭 Swap
swapoff -a

# 2. 永久关闭 Swap(注释 /etc/fstab 中的 Swap 挂载项)
sed -ri '/\bswap\b/s/^/#/' /etc/fstab

# 验证:查看 Swap 状态,输出均为 0 即为成功
free -m

2.6 导入必要内核模块

导入 Containerd 和 K8s 所需的内核模块(overlay、br_netfilter 等)。

bash 复制代码
# 1. 创建模块配置文件
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

# 2. 加载模块并生效
modprobe overlay
modprobe br_netfilter

# 验证:查看模块是否加载成功
lsmod | grep overlay
lsmod | grep br_netfilter

2.7 配置 K8s 内核参数

配置内核参数以支持 K8s 网络和容器运行时。

bash 复制代码
# 1. 创建内核参数配置文件
cat << EOF > /etc/sysctl.d/99-kubernetes-cri.conf
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
user.max_user_namespaces=28633
EOF

# 2. 加载参数并生效
sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf

# 验证:查看参数是否生效
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.ipv4.ip_forward

2.8 配置 IPVS 模式

为 kube-proxy 启用 IPVS 模式,提升集群服务转发性能,需加载相关内核模块。

bash 复制代码
# 1. 创建模块加载脚本并执行
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

# 2. 保存脚本为 ipvs-modules.sh 并执行
chmod +x ipvs-modules.sh
./ipvs-modules.sh

# 验证:查看 IPVS 模块是否加载成功
lsmod | grep ip_vs
lsmod | grep nf_conntrack_ipv4

三、安装 Containerd(所有节点执行)

3.1 安装 Containerd

bash 复制代码
# 1. 安装 Containerd
yum -y install containerd.io

# 2. 启动并设置开机自启
systemctl enable containerd && systemctl start containerd

# 验证:查看 Containerd 版本
containerd -v  # 输出类似 containerd.io 1.6.x 即为成功

3.2 配置 Containerd

生成默认配置并优化,修改沙箱镜像为阿里云镜像,提升拉取速度。

bash 复制代码
# 1. 创建配置目录
mkdir -p /etc/containerd

# 2. 生成默认配置文件
containerd config default > /etc/containerd/config.toml

# 3. 修改关键配置(重点修改以下两项)
# 方式1:手动编辑 config.toml
vim /etc/containerd/config.toml
# 找到 [plugins."io.containerd.grpc.v1.cri".registry] 部分,修改:
# config_path = "/etc/containerd/certs.d"
# 找到 sandbox_image 配置项,修改为:
# sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

# 方式2:通过 sed 命令批量修改
sed -i 's#config_path = ""#config_path = "/etc/containerd/certs.d"#' /etc/containerd/config.toml
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.9"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml

# 4. Master 节点配置完成后,复制到 Node 节点
scp /etc/containerd/config.toml node1:/etc/containerd/config.toml
scp /etc/containerd/config.toml node2:/etc/containerd/config.toml

# 5. 所有节点重启 Containerd 使配置生效
systemctl restart containerd

3.3 配置 Containerd 镜像加速

配置阿里云镜像加速,解决境外镜像拉取缓慢问题。

bash 复制代码
# 1. 创建加速配置目录
mkdir -p /etc/containerd/certs.d/docker.io

# 2. 创建加速配置文件
cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io "

[host."https://njrds780.mirror.aliyuncs.com "]
  capabilities = ["pull", "resolve"]
EOF

# 3. 重启 Containerd 生效
systemctl restart containerd

# 验证:拉取测试镜像
ctr images pull docker.io/library/nginx:alpine

四、部署 K8s 集群

4.1 安装 K8s 组件(所有节点执行)

bash 复制代码
# Master 节点安装 kubeadm、kubelet、kubectl(1.28.2 版本)
yum install -y kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2

# Node 节点安装 kubeadm、kubelet(1.28.2 版本,无需 kubectl)
yum install -y kubeadm-1.28.2 kubelet-1.28.2

# 设置 kubelet 开机自启
systemctl enable kubelet

4.2 初始化 Master 节点(仅 Master 执行)

bash 复制代码
# 1. 初始化 Master 节点(指定阿里云镜像仓库、网络段等参数)
kubeadm init \
  --kubernetes-version=v1.28.2 \
  --pod-network-cidr=10.244.0.0/16 \  # Flannel 网络默认网段
  --service-cidr=10.96.0.0/16 \       # K8s 服务网段
  --apiserver-advertise-address=192.168.209.100 \  # Master 节点 IP
  --cri-socket unix:///var/run/containerd/containerd.sock \  # 指定 Containerd 套接字
  --image-repository=registry.aliyuncs.com/google_containers  # 阿里云镜像仓库

# 2. 初始化成功后,按照提示配置 kubectl 权限(Master 节点执行)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 验证:查看 Master 节点状态
kubectl get nodes  # 此时状态为 NotReady,需安装网络插件后变为 Ready

4.3 安装 Flannel 网络插件(仅 Master 执行)

bash 复制代码
# 1. 下载 Flannel 配置文件
curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 

# 2. 部署 Flannel 插件
kubectl apply -f kube-flannel.yml

# 3. 若拉取 Flannel 镜像失败,手动拉取(所有节点执行)
ctr -n k8s.io images pull ghcr.io/flannel-io/flannel:v0.27.4 --hosts-dir /etc/containerd/certs.d/

# 验证:查看 Pod 状态,确保 flannel 相关 Pod 正常运行
kubectl get pods -n kube-flannel
# 查看节点状态,Master 节点变为 Ready
kubectl get nodes

4.4 Node 节点加入集群(仅 Node 执行)

Master 节点初始化成功后会输出 join 命令,Node 节点执行该命令即可加入集群。若命令过期,可在 Master 节点执行 kubeadm token create --print-join-command 重新生成。

bash 复制代码
# 执行 Master 节点输出的 join 命令(示例,需替换为实际命令)
kubeadm join 192.168.209.100:6443 --token jveo62.agi1puaaaej31mps \
        --discovery-token-ca-cert-hash sha256:6c7374ccdf2ef0157702f024e84c2c107cdab9390a5f530602da309577c644c5 

# 验证:在 Master 节点查看所有节点状态,均为 Ready 即为成功
kubectl get nodes

五、集群验证

bash 复制代码
# 1. 查看集群组件状态
kubectl get componentstatuses

# 2. 查看所有命名空间的 Pod 状态
kubectl get pods -A

# 3. 部署测试应用(Nginx)
kubectl create deployment nginx-test --image=nginx:alpine

# 4. 暴露应用为 Service(NodePort 类型)
kubectl expose deployment nginx-test --port=80 --type=NodePort

# 5. 查看 Service 状态,获取 NodePort 端口(示例为 30008)
kubectl get svc nginx-test

# 6. 访问测试应用(使用任意 Node 节点 IP + NodePort 端口)
curl http://192.168.209.101:30008   # 替换为实际 NodePort 端口

# 7. 清理测试资源
kubectl delete deployment nginx-test
kubectl delete svc nginx-test

六、常见问题排查

6.1 节点状态为 NotReady

  • 检查 Flannel 插件是否正常运行:kubectl get pods -n kube-flannel
  • 手动拉取 Flannel 镜像:ctr -n k8s.io images pull ghcr.io/flannel-io/flannel:v0.27.4 --hosts-dir /etc/containerd/certs.d/
  • 查看 kubelet 日志:journalctl -u kubelet -f

6.2 镜像拉取失败

  • 检查 Containerd 镜像加速配置是否正确
  • 手动拉取镜像:ctr -n k8s.io images pull 镜像地址
  • 确认阿里云镜像仓库可访问:ping mirrors.aliyun.com

6.3 Node 节点加入集群失败

  • 检查 Master 节点 6443 端口是否开放:telnet 192.168.209.100 6443
  • 重新生成 join 命令:在 Master 节点执行 kubeadm token create --print-join-command
  • 检查节点间网络通信是否正常,关闭防火墙和 SELinux

七、总结

本文章完成了 K8s 1.28.2 集群基于 ContainerdCentOS7 的部署,核心步骤包括环境前置配置、Containerd 安装与优化、K8s 组件部署、Master 初始化及 Node 加入、Flannel 网络插件安装。部署过程中需重点关注镜像拉取速度(配置阿里云加速)、节点时间同步、Swap 关闭及网络通信问题,确保各组件状态正常后即可进行业务应用部署。

相关推荐
openFuyao7 小时前
openFuyao亮相KubeCon Europe 2026 携InferNex套件深耕AI云原生推理领域
人工智能·云原生
yuzhuanhei8 小时前
docker常用命令
运维·docker·容器
anarckk8 小时前
docker volume 导入导出命令
运维·docker·容器
Brandon汐9 小时前
从0开始搭建一主两节点k8s集群对接Ceph集群
ceph·容器·kubernetes
青春不流名10 小时前
Portainer CE(社区版)部署 & 运行
云原生·eureka
倔强的胖蚂蚁10 小时前
openEuler 24.03 LTS SP3 motd标志区使用教程
运维·云原生
F1FJJ10 小时前
Shield CLI 命令全解析:15 个命令覆盖所有远程访问场景
网络·数据库·网络协议·容器·开源软件
进击切图仔11 小时前
Docker + tmux + ROS:持久化的机器人开发环境
docker·容器·机器人
小Pawn爷12 小时前
实战演练:玩转k8s
云原生·容器·kubernetes