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