基于 Containerd 的 Kubernetes(K8s)集群部署实战指南

基于 Containerd 的 Kubernetes(K8s)集群部署实战指南
前言在 KubernetesK8s的发展历程中容器运行时从早期的 Docker 逐步向更轻量、更标准的 Containerd 演进。随着 K8s 1.24 版本正式移除对 Docker 的支持Containerd 已成为生产环境中主流的容器运行时选择。相比 DockerContainerd 更轻量、更专注于容器生命周期管理且完全兼容 K8s 的 CRI容器运行时接口标准。本文将从零开始带你完整实践基于 Containerd 的 K8s 集群部署流程涵盖环境准备、组件安装、集群初始化、网络插件配置等全流程同时对比 Containerd 与 Docker 的常用命令差异帮助你快速掌握 K8s 生产环境的部署与调试方法。一、环境规划与基础配置1. 主机规划本次部署采用 3 节点集群架构具体规划如下表格主机名IP 地址集群角色k8smaster192.168.38.137Master 控制节点k8swork1192.168.38.141Worker 工作节点k8swork2192.168.38.142Worker 工作节点所有节点均使用 CentOS/RHEL 系统后续所有操作若无特殊说明均需在所有节点执行。2. 加载必要内核模块为满足 K8s 网络与转发需求需加载overlay和br_netfilter模块tee /etc/modules-load.d/containerd.conf EOF overlay br_netfilter EOF modprobe overlay modprobe br_netfilter3. 开启 IPVS 支持可选但推荐IPVS 提供更高效的负载均衡能力创建配置文件加载相关模块cat /etc/modules-load.d/ipvs.conf EOF ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack EOF # 重启后验证模块加载 reboot lsmod | grep ip_vs4. 关闭防火墙、SELinux 与交换分区# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config grubby --update-kernel ALL --args selinux0 # 关闭交换分区 swapoff -a cp /etc/fstab /etc/fstab.bak cat /etc/fstab.bak | grep -v swap /etc/fstab5. 配置系统内核参数修改/etc/sysctl.conf开启桥接转发与 IP 转发cat /etc/sysctl.conf EOF vm.swappiness 0 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-ip6tables 1 EOF # 生效配置 sysctl -p6. 配置主机名解析在所有节点的/etc/hosts文件中添加集群节点解析cat /etc/hosts EOF 127.0.0.1 localhost 172.16.213.221 k8smaster 172.16.213.222 k8swork1 172.16.213.223 k8swork2 EOF二、安装与配置 Containerd1. 安装 Containerd使用阿里云 Docker YUM 源安装 Containerd# 安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加阿里云Docker源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装Containerd dnf install containerd.io -y2. 生成并修改默认配置# 生成默认配置文件 mkdir -p /etc/containerd containerd config default /etc/containerd/config.toml # 修改配置设置certs.d路径用于镜像加速 sed -i s/config_path /config_path \/etc\/containerd\/certs.d/g /etc/containerd/config.toml3. 配置镜像加速器为解决国内镜像拉取慢的问题配置 Docker Hub 与 K8s 镜像加速# Docker Hub镜像加速 mkdir -p /etc/containerd/certs.d/docker.io cat /etc/containerd/certs.d/docker.io/hosts.toml EOF server https://docker.io [host.https://hub.geekery.cn] capabilities [pull, resolve] [host.https://docker.rainbond.cc] capabilities [pull, resolve] EOF # registry.k8s.io镜像加速 mkdir -p /etc/containerd/certs.d/registry.k8s.io tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml EOF server https://registry.k8s.io [host.https://ghcr.geekery.cn] capabilities [pull, resolve, push] [host.https://k8s.chenby.cn] capabilities [pull, resolve, push] EOF4. 优化 Containerd 配置修改配置文件设置阿里云镜像源与 Systemd Cgroup 驱动# 替换K8s默认镜像源为阿里云 sed -i s#registry.k8s.io#registry.aliyuncs.com/google_containers#g /etc/containerd/config.toml # 启用Systemd Cgroup驱动 sed -i s/SystemdCgroup false/SystemdCgroup true/g /etc/containerd/config.toml # 启动并设置开机自启 systemctl daemon-reload systemctl enable containerd systemctl restart containerd三、安装 Kubeadm、Kubelet 与 Kubectl1. 配置 Kubernetes YUM 源使用阿里云官方 K8s 源cat EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://pkgs.k8s.io/core:/stable:/v1.31/rpm/ enabled1 gpgcheck1 gpgkeyhttps://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key excludekubelet kubeadm kubectl cri-tools kubernetes-cni EOF2. 安装核心组件yum install kubelet kubeadm kubectl cri-tools --disableexcludeskubernetes # 设置kubelet开机自启 systemctl daemon-reload systemctl enable kubelet systemctl start kubelet3. 配置 crictl 工具crictl是 CRI 兼容的容器运行时调试工具配置其连接 Containerdcat /etc/crictl.yaml EOF runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false EOF四、初始化 K8s Master 节点1. 查看与预下载镜像# 查看初始化默认配置 kubeadm config print init-defaults # 查看需要的镜像列表默认源 kubeadm config images list # 查看阿里云源的镜像列表 kubeadm config images list --image-repository registry.aliyuncs.com/google_containers2. 生成并修改初始化配置文件# 导出默认配置 kubeadm config print init-defaults kubeadm.yaml修改kubeadm.yaml关键配置调整如下advertiseAddress修改为 Master 节点 IP 192.168.38.137criSocket修改为 Containerd 的 socket 路径unix:///run/containerd/containerd.sockimageRepository修改为registry.aliyuncs.com/google_containerskubernetesVersion修改为目标版本如v1.31.3在文件末尾添加以下配置启用 IPVS 模式与 Systemd Cgroup--- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd3. 执行集群初始化kubeadm init --configkubeadm.yaml初始化完成后根据提示执行以下命令配置 kubectlmkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 启用kubectl自动补全 echo source (kubectl completion bash) ~/.bashrc source ~/.bashrc五、加入 Worker 节点到集群1. 获取集群加入命令如果初始化时未保存 token可在 Master 节点重新生成kubeadm token create --ttl 0 --print-join-command输出示例2. 在 Worker 节点执行加入命令在k8swork1和k8swork2节点执行上述命令加入集群kubeadm join 172.16.213.221:6443 --token bnefy8.d79yn6ylxlk7k8hr \ --discovery-token-ca-cert-hash sha256:eaa17f4b308e9406891f85f664c0d2c97a49bd9e963f64c9453b7042509e106c3. 验证节点状态在 Master 节点执行kubectl get nodes此时节点状态为NotReady因为尚未安装网络插件。六、安装 Calico 网络插件1. 下载并修改 Calico 配置文件wget https://docs.projectcalico.org/manifests/calico.yaml为解决国内镜像拉取问题修改配置文件中的镜像地址例如sed -i s#docker.io/calico#docker.m.daocloud.io/calico#g calico.yaml也可手动提前拉取镜像crictl pull ghcr.geekery.cn/calico/cni:v3.25.0 crictl pull ghcr.geekery.cn/calico/node:v3.25.0 # 其他需要的镜像同理拉取2. 部署 Calicokubectl apply -f calico.yaml3. 验证网络插件状态# 查看节点状态等待变为Ready kubectl get nodes # 查看kube-system命名空间下的Pod状态 kubectl get pods -n kube-system若节点长时间未就绪可重启 kubelet 服务systemctl restart kubelet七、Containerd 调试工具crictl 与 ctr1. 工具介绍ctrContainerd 原生 CLI 工具用于直接管理容器、镜像、命名空间等资源。crictlK8s 社区定义的 CRI 兼容 CLI 工具专为调试 K8s 容器运行时设计支持 Pod、容器、镜像管理。关键区别Containerd 支持命名空间隔离crictl默认使用k8s.io命名空间而ctr默认使用default命名空间因此ctr下载的镜像默认对crictl不可见。2. 常用命令对比以下是docker、crictl与ctr的常用命令对比功能Docker 命令crictl 命令ctr 命令需指定命名空间显示本地镜像列表docker imagescrictl imagesctr -n k8s.io images list下载镜像docker pullcrictl pullctr -n k8s.io images pull上传镜像docker push无ctr -n k8s.io images push删除本地镜像docker rmicrictl rmictr -n k8s.io images rm查看镜像详情docker inspect IMAGE-IDcrictl inspecti IMAGE-IDctr -n k8s.io images info IMAGE-ID显示容器列表docker pscrictl psctr -n k8s.io containers list创建容器docker createcrictl createctr -n k8s.io containers create启动容器docker startcrictl startctr -n k8s.io containers start停止容器docker stopcrictl stopctr -n k8s.io containers stop删除容器docker rmcrictl rmctr -n k8s.io containers delete查看容器详情docker inspectcrictl inspectctr -n k8s.io containers infoattach 交互docker attachcrictl attachctr -n k8s.io tasks attachexec 执行命令docker execcrictl execctr -n k8s.io tasks exec查看日志docker logscrictl logs无查看资源占用docker statscrictl stats无3. 镜像导入导出示例crictl不支持镜像导入导出需使用ctr工具# 标记镜像 ctr -n k8s.io i tag k8s.gcr.io/pause:3.2 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 # 导出镜像 ctr -n k8s.io i export pause.tar registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 # 导入镜像 ctr -n k8s.io i import pause.tar结尾本文完整演示了基于 Containerd 的 K8s 集群部署流程从环境准备、组件安装到集群初始化、网络插件配置再到 Containerd 调试工具的使用覆盖了生产环境部署的核心步骤。相比传统的 Docker 方案Containerd 更轻量、更贴合 K8s 的 CRI 标准是当前及未来 K8s 集群的主流选择。部署完成后你可以通过kubectl命令管理集群资源部署测试应用验证集群功能。后续你可以继续深入学习 K8s 的资源对象如 Deployment、Service、Ingress 等探索集群的高级特性与运维技巧。如果在部署过程中遇到镜像拉取失败、节点状态异常等问题可以通过crictl查看容器运行时日志或通过kubectl describe命令排查 Pod 状态快速定位问题根源。

最新新闻

日新闻

周新闻

月新闻