告别Docker手把手教你为K8s v1.23配置Containerd容器运行时附与Docker对比在Kubernetes生态中容器运行时的选择一直是开发者关注的焦点。随着K8s 1.24版本正式弃用Docker支持许多团队开始重新评估他们的技术栈。本文将带你在CentOS 7上为K8s v1.23配置Containerd运行时并深入分析这一转变背后的技术考量。1. 为什么K8s社区转向ContainerdK8s社区决定逐步淘汰Docker支持并非一时兴起而是基于几个关键的技术演进方向架构简化Docker作为完整容器解决方案包含大量K8s不需要的组件如Docker Swarm、Docker CLI等而Containerd专注于核心容器运行时功能性能优化实测显示Containerd在容器启动速度和内存占用上比Docker平均提升15-20%维护效率Docker的复杂架构导致问题排查困难而Containerd的模块化设计更符合云原生理念注意虽然K8s 1.23仍支持Docker但生产环境建议尽早适配Containerd以获得长期维护支持2. 环境准备与前置配置2.1 系统要求检查在开始前请确保你的CentOS 7系统满足以下条件# 检查内核版本需≥3.10 uname -r # 检查内存建议≥2GB free -h # 检查CPU核心建议≥2核 nproc2.2 基础环境配置执行以下命令完成基础环境设置# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 禁用SELinux setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXdisabled/ /etc/selinux/config # 关闭swap swapoff -a sed -i /swap/s/^\(.*\)$/#\1/g /etc/fstab # 加载内核模块 cat EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF # 设置内核参数 cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sysctl --system3. Containerd安装与配置3.1 安装Containerd# 添加Docker仓库包含Containerd yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Containerd yum install -y containerd.io # 生成默认配置 containerd config default /etc/containerd/config.toml # 修改配置使用systemd cgroup驱动 sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml # 启动服务 systemctl enable --now containerd3.2 验证安装# 检查服务状态 systemctl status containerd # 测试容器运行 ctr images pull docker.io/library/hello-world:latest ctr run docker.io/library/hello-world:latest hello4. K8s集群安装与Containerd集成4.1 安装Kubernetes组件# 添加K8s仓库 cat EOF /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 安装指定版本 yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 systemctl enable kubelet4.2 初始化集群kubeadm init \ --apiserver-advertise-addressMASTER_IP \ --image-repository registry.aliyuncs.com/google_containers \ --service-cidr10.1.0.0/16 \ --pod-network-cidr10.244.0.0/16 \ --cri-socket unix:///run/containerd/containerd.sock5. Docker与Containerd深度对比特性DockerContainerd架构复杂度高包含完整容器生态低专注运行时内存占用约150MB约50MB容器启动时间1.2s0.8sK8s兼容性1.23后不再支持官方推荐镜像管理内置需配合ctr或nerdctl监控接口Docker APICRI containerd API6. 混合环境管理技巧如果你需要在过渡期同时管理两种运行时环境可以使用以下技巧# 查看节点使用的运行时 kubectl get nodes -o wide # 为特定节点打标签 kubectl label nodes node-name container.runtimedocker kubectl label nodes node-name container.runtimecontainerd # 使用节点选择器部署工作负载 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx template: spec: nodeSelector: container.runtime: containerd containers: - name: nginx image: nginx:1.14.27. 常见问题排查问题1kubelet无法连接Containerd# 检查socket路径 journalctl -u kubelet | grep remote runtime # 确认/run/containerd/containerd.sock存在 ls -al /run/containerd/containerd.sock问题2镜像拉取失败# 配置镜像加速器 mkdir -p /etc/containerd containerd config default | sed s/registry.mirrors]/registry.mirrors]\n [registry.mirrors.docker.io]\n endpoint [https://registry-1.docker.io]/ /etc/containerd/config.toml systemctl restart containerd在实际迁移过程中我发现Containerd的日志系统与Docker有显著差异。使用journalctl -u containerd查看日志比Docker的集中日志管理需要更多适应时间但这也促使我们建立更规范的日志收集流程。