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 关闭及网络通信问题,确保各组件状态正常后即可进行业务应用部署。

相关推荐
曾经的三心草2 小时前
微服务的编程测评系统-修改登录逻辑为邮箱登录
微服务·云原生·架构
青春不流名3 小时前
docker build -t mytomcat:10.1-jdk17 -f Dockerfile-MyTomcat .
云原生·eureka
为什么要内卷,摆烂不香吗3 小时前
Dockerfile 与 Docker Compose 在 CI/CD 管道中的分工与配合方式
ci/cd·docker·容器
weixin_307779133 小时前
医院症状收集应用安全架构设计:基于AWS SQS和SNS的数据保护解决方案
安全·云原生·架构·云计算·aws
启明真纳3 小时前
Longhorn-k8s存储
云原生·容器·kubernetes
saber_andlibert4 小时前
【docker】存储卷
docker·容器·eureka
-大头.4 小时前
Spring消息集成:从企业模式到云原生
java·spring·云原生
阿拉斯攀登4 小时前
分布式、微服务与云原生:概念解析与关联梳理
分布式·微服务·云原生
绯雨千叶4 小时前
修改Docker镜像和容器的默认存储目录(迁移原有数据)
运维·docker·容器