从Docker到ContainerdKubernetes v1.30.0安装避坑指南当Kubernetes宣布从1.24版本开始弃用Dockershim时整个容器编排生态迎来了一次重大变革。对于习惯了Docker作为默认运行时的开发者来说这无疑是一个需要适应的转变。本文将带你深入了解如何在CentOS7系统上使用Containerd作为容器运行时顺利安装Kubernetes v1.30.0集群并分享从Docker迁移到Containerd过程中可能遇到的典型问题及其解决方案。1. 环境准备与系统配置在开始安装Kubernetes之前确保你的CentOS7系统已经完成了必要的准备工作。不同于Docker时代Containerd对系统配置有着更精细的要求。1.1 系统基础配置首先我们需要确保系统满足Kubernetes运行的基本要求# 关闭SELinux setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 禁用swap swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab注意在生产环境中建议使用更安全的方式处理SELinux和防火墙而不是完全禁用它们。可以根据实际安全需求进行适当配置。1.2 网络参数优化Kubernetes对网络性能有较高要求特别是当使用Containerd作为运行时正确的网络配置尤为重要# 配置网络转发参数 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 --system验证配置是否生效sysctl net.ipv4.ip_forward1.3 时间同步配置Kubernetes集群对时间同步有严格要求所有节点的时间必须保持一致# 安装并配置chrony yum install -y chrony systemctl enable chronyd systemctl start chronyd # 验证时间同步状态 chronyc sources2. Containerd安装与配置作为Kubernetes v1.30.0的默认容器运行时Containerd的配置直接影响到集群的稳定性和性能。2.1 Containerd安装在CentOS7上安装最新版Containerd# 安装必要依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker仓库包含Containerd yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Containerd yum install -y containerd.io # 启动并设置开机自启 systemctl enable containerd systemctl start containerd2.2 Containerd配置优化默认安装的Containerd需要进行一些优化配置# 生成默认配置文件 containerd config default /etc/containerd/config.toml # 修改配置文件使用国内镜像源 sed -i s|registry.k8s.io/pause:3.8|registry.aliyuncs.com/google_containers/pause:3.9|g /etc/containerd/config.toml sed -i s|SystemdCgroup false|SystemdCgroup true|g /etc/containerd/config.toml # 重启Containerd使配置生效 systemctl restart containerd提示SystemdCgroup true这一配置对于使用systemd作为init系统的CentOS7非常重要它确保容器资源管理能够与systemd集成。2.3 验证Containerd安装通过以下命令验证Containerd是否正常运行ctr version输出应类似于Client: Version: v1.6.xx Revision: xxxxxxx Server: Version: v1.6.xx Revision: xxxxxxx3. Kubernetes组件安装与配置在Containerd就绪后我们可以开始安装Kubernetes的核心组件。3.1 配置Kubernetes仓库使用国内镜像源加速安装过程cat EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/ enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key EOF3.2 安装Kubernetes组件安装kubeadm、kubelet和kubectl# 安装指定版本 yum install -y kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 # 设置kubelet开机启动 systemctl enable --now kubelet3.3 配置kubelet使用Containerd确保kubelet使用Containerd作为容器运行时# 创建kubelet配置文件目录 mkdir -p /etc/systemd/system/kubelet.service.d # 配置kubelet使用Containerd cat EOF | tee /etc/systemd/system/kubelet.service.d/0-containerd.conf [Service] EnvironmentKUBELET_EXTRA_ARGS--container-runtimeremote --runtime-request-timeout15m --container-runtime-endpointunix:///run/containerd/containerd.sock EOF # 重新加载systemd配置 systemctl daemon-reload systemctl restart kubelet4. 集群初始化与网络配置4.1 使用kubeadm初始化集群使用kubeadm初始化主节点kubeadm init \ --apiserver-advertise-address主节点IP \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.30.0 \ --service-cidr10.96.0.0/12 \ --pod-network-cidr10.244.0.0/16 \ --v5注意将主节点IP替换为你的主节点实际IP地址。--v5参数用于输出更详细的日志便于排查问题。初始化成功后会输出加入集群的命令类似如下kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef保存这个命令用于将工作节点加入集群。4.2 配置kubectl访问集群在主节点上配置kubectlmkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config验证集群状态kubectl get nodes此时节点状态应为NotReady因为尚未安装网络插件。4.3 安装网络插件选择Flannel作为网络插件kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml等待几分钟后再次检查节点状态kubectl get nodes现在节点状态应显示为Ready。5. 常见问题与解决方案在从Docker迁移到Containerd的过程中可能会遇到一些典型问题。以下是常见问题及其解决方案。5.1 镜像拉取失败问题现象Pod处于ImagePullBackOff状态无法拉取镜像。解决方案检查Containerd的镜像仓库配置cat /etc/containerd/config.toml | grep -A 5 registry.mirrors如果需要添加自定义镜像仓库可以在config.toml中添加类似如下配置[plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://registry-1.docker.io] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.registry.k8s.io] endpoint [https://registry.aliyuncs.com/google_containers]重启Containerd使配置生效systemctl restart containerd5.2 容器启动超时问题现象Pod处于ContainerCreating状态长时间无进展。解决方案检查kubelet日志journalctl -u kubelet -f常见原因是CRI连接问题验证kubelet与Containerd的连接crictl --runtime-endpoint unix:///run/containerd/containerd.sock info确保/etc/containerd/config.toml中配置了正确的socket路径[grpc] address /run/containerd/containerd.sock5.3 资源限制不生效问题现象容器资源限制(cpu/memory)未按预期工作。解决方案确保Containerd配置中启用了资源限制[plugins.io.containerd.grpc.v1.cri.containerd] default_runtime_name runc [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] runtime_type io.containerd.runc.v2 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true验证kubelet的cgroup驱动配置cat /var/lib/kubelet/config.yaml | grep cgroupDriver应输出systemd与Containerd配置保持一致。重启相关服务systemctl restart containerd kubelet5.4 节点无法加入集群问题现象工作节点执行kubeadm join失败。解决方案检查网络连通性telnet 主节点IP 6443验证token有效性在主节点上执行kubeadm token list如果需要生成新tokenkubeadm token create --print-join-command检查工作节点的Containerd和kubelet服务状态systemctl status containerd kubelet6. 性能优化与最佳实践为了获得最佳性能特别是在生产环境中还需要进行一些额外的优化配置。6.1 Containerd性能调优[plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] NoPivotRoot false NoNewKeyring false ShimCgroup IoUid 0 IoGid 0 BinaryName Root CriuPath SystemdCgroup true [plugins.io.containerd.grpc.v1.cri.containerd] snapshotter overlayfs disable_snapshot_annotations true discard_unpacked_layers true关键参数说明snapshotter: 使用overlayfs作为存储驱动discard_unpacked_layers: 启用后可以节省磁盘空间SystemdCgroup: 确保与systemd集成6.2 kubelet资源预留在/var/lib/kubelet/config.yaml中添加资源预留配置apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration evictionHard: memory.available: 200Mi nodefs.available: 10% nodefs.inodesFree: 5% imagefs.available: 15% systemReserved: cpu: 500m memory: 500Mi kubeReserved: cpu: 500m memory: 500Mi6.3 日志与存储管理配置Containerd日志轮转[plugins.io.containerd.grpc.v1.cri.containerd] disable_cgroup false disable_apparmor false restrict_oom_score_adj false [plugins.io.containerd.grpc.v1.cri.containerd.default_runtime] runtime_type io.containerd.runtime.v1.linux runtime_engine runtime_root [plugins.io.containerd.grpc.v1.cri.containerd.default_runtime.options] NoPivotRoot false NoNewKeyring false ShimCgroup IoUid 0 IoGid 0 BinaryName Root CriuPath SystemdCgroup true [plugins.io.containerd.grpc.v1.cri.containerd.untrusted_workload_runtime] runtime_type runtime_engine runtime_root 7. 监控与维护7.1 监控Containerd性能使用crictl工具监控容器状态# 查看容器列表 crictl ps -a # 查看镜像列表 crictl images # 查看容器统计信息 crictl stats7.2 日志收集配置配置kubelet日志级别# 编辑kubelet服务配置 vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # 添加日志级别参数 EnvironmentKUBELET_CONFIG_ARGS--v27.3 定期维护任务设置定期清理无用镜像和容器# 清理停止的容器 crictl rm $(crictl ps -aq) # 清理无用镜像 crictl rmi --prune可以设置cron任务自动执行这些清理操作。
从Docker到Containerd:Kubernetes v1.30.0安装避坑指南
从Docker到ContainerdKubernetes v1.30.0安装避坑指南当Kubernetes宣布从1.24版本开始弃用Dockershim时整个容器编排生态迎来了一次重大变革。对于习惯了Docker作为默认运行时的开发者来说这无疑是一个需要适应的转变。本文将带你深入了解如何在CentOS7系统上使用Containerd作为容器运行时顺利安装Kubernetes v1.30.0集群并分享从Docker迁移到Containerd过程中可能遇到的典型问题及其解决方案。1. 环境准备与系统配置在开始安装Kubernetes之前确保你的CentOS7系统已经完成了必要的准备工作。不同于Docker时代Containerd对系统配置有着更精细的要求。1.1 系统基础配置首先我们需要确保系统满足Kubernetes运行的基本要求# 关闭SELinux setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 禁用swap swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab注意在生产环境中建议使用更安全的方式处理SELinux和防火墙而不是完全禁用它们。可以根据实际安全需求进行适当配置。1.2 网络参数优化Kubernetes对网络性能有较高要求特别是当使用Containerd作为运行时正确的网络配置尤为重要# 配置网络转发参数 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 --system验证配置是否生效sysctl net.ipv4.ip_forward1.3 时间同步配置Kubernetes集群对时间同步有严格要求所有节点的时间必须保持一致# 安装并配置chrony yum install -y chrony systemctl enable chronyd systemctl start chronyd # 验证时间同步状态 chronyc sources2. Containerd安装与配置作为Kubernetes v1.30.0的默认容器运行时Containerd的配置直接影响到集群的稳定性和性能。2.1 Containerd安装在CentOS7上安装最新版Containerd# 安装必要依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker仓库包含Containerd yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Containerd yum install -y containerd.io # 启动并设置开机自启 systemctl enable containerd systemctl start containerd2.2 Containerd配置优化默认安装的Containerd需要进行一些优化配置# 生成默认配置文件 containerd config default /etc/containerd/config.toml # 修改配置文件使用国内镜像源 sed -i s|registry.k8s.io/pause:3.8|registry.aliyuncs.com/google_containers/pause:3.9|g /etc/containerd/config.toml sed -i s|SystemdCgroup false|SystemdCgroup true|g /etc/containerd/config.toml # 重启Containerd使配置生效 systemctl restart containerd提示SystemdCgroup true这一配置对于使用systemd作为init系统的CentOS7非常重要它确保容器资源管理能够与systemd集成。2.3 验证Containerd安装通过以下命令验证Containerd是否正常运行ctr version输出应类似于Client: Version: v1.6.xx Revision: xxxxxxx Server: Version: v1.6.xx Revision: xxxxxxx3. Kubernetes组件安装与配置在Containerd就绪后我们可以开始安装Kubernetes的核心组件。3.1 配置Kubernetes仓库使用国内镜像源加速安装过程cat EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/ enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key EOF3.2 安装Kubernetes组件安装kubeadm、kubelet和kubectl# 安装指定版本 yum install -y kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 # 设置kubelet开机启动 systemctl enable --now kubelet3.3 配置kubelet使用Containerd确保kubelet使用Containerd作为容器运行时# 创建kubelet配置文件目录 mkdir -p /etc/systemd/system/kubelet.service.d # 配置kubelet使用Containerd cat EOF | tee /etc/systemd/system/kubelet.service.d/0-containerd.conf [Service] EnvironmentKUBELET_EXTRA_ARGS--container-runtimeremote --runtime-request-timeout15m --container-runtime-endpointunix:///run/containerd/containerd.sock EOF # 重新加载systemd配置 systemctl daemon-reload systemctl restart kubelet4. 集群初始化与网络配置4.1 使用kubeadm初始化集群使用kubeadm初始化主节点kubeadm init \ --apiserver-advertise-address主节点IP \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.30.0 \ --service-cidr10.96.0.0/12 \ --pod-network-cidr10.244.0.0/16 \ --v5注意将主节点IP替换为你的主节点实际IP地址。--v5参数用于输出更详细的日志便于排查问题。初始化成功后会输出加入集群的命令类似如下kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef保存这个命令用于将工作节点加入集群。4.2 配置kubectl访问集群在主节点上配置kubectlmkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config验证集群状态kubectl get nodes此时节点状态应为NotReady因为尚未安装网络插件。4.3 安装网络插件选择Flannel作为网络插件kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml等待几分钟后再次检查节点状态kubectl get nodes现在节点状态应显示为Ready。5. 常见问题与解决方案在从Docker迁移到Containerd的过程中可能会遇到一些典型问题。以下是常见问题及其解决方案。5.1 镜像拉取失败问题现象Pod处于ImagePullBackOff状态无法拉取镜像。解决方案检查Containerd的镜像仓库配置cat /etc/containerd/config.toml | grep -A 5 registry.mirrors如果需要添加自定义镜像仓库可以在config.toml中添加类似如下配置[plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://registry-1.docker.io] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.registry.k8s.io] endpoint [https://registry.aliyuncs.com/google_containers]重启Containerd使配置生效systemctl restart containerd5.2 容器启动超时问题现象Pod处于ContainerCreating状态长时间无进展。解决方案检查kubelet日志journalctl -u kubelet -f常见原因是CRI连接问题验证kubelet与Containerd的连接crictl --runtime-endpoint unix:///run/containerd/containerd.sock info确保/etc/containerd/config.toml中配置了正确的socket路径[grpc] address /run/containerd/containerd.sock5.3 资源限制不生效问题现象容器资源限制(cpu/memory)未按预期工作。解决方案确保Containerd配置中启用了资源限制[plugins.io.containerd.grpc.v1.cri.containerd] default_runtime_name runc [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] runtime_type io.containerd.runc.v2 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true验证kubelet的cgroup驱动配置cat /var/lib/kubelet/config.yaml | grep cgroupDriver应输出systemd与Containerd配置保持一致。重启相关服务systemctl restart containerd kubelet5.4 节点无法加入集群问题现象工作节点执行kubeadm join失败。解决方案检查网络连通性telnet 主节点IP 6443验证token有效性在主节点上执行kubeadm token list如果需要生成新tokenkubeadm token create --print-join-command检查工作节点的Containerd和kubelet服务状态systemctl status containerd kubelet6. 性能优化与最佳实践为了获得最佳性能特别是在生产环境中还需要进行一些额外的优化配置。6.1 Containerd性能调优[plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] NoPivotRoot false NoNewKeyring false ShimCgroup IoUid 0 IoGid 0 BinaryName Root CriuPath SystemdCgroup true [plugins.io.containerd.grpc.v1.cri.containerd] snapshotter overlayfs disable_snapshot_annotations true discard_unpacked_layers true关键参数说明snapshotter: 使用overlayfs作为存储驱动discard_unpacked_layers: 启用后可以节省磁盘空间SystemdCgroup: 确保与systemd集成6.2 kubelet资源预留在/var/lib/kubelet/config.yaml中添加资源预留配置apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration evictionHard: memory.available: 200Mi nodefs.available: 10% nodefs.inodesFree: 5% imagefs.available: 15% systemReserved: cpu: 500m memory: 500Mi kubeReserved: cpu: 500m memory: 500Mi6.3 日志与存储管理配置Containerd日志轮转[plugins.io.containerd.grpc.v1.cri.containerd] disable_cgroup false disable_apparmor false restrict_oom_score_adj false [plugins.io.containerd.grpc.v1.cri.containerd.default_runtime] runtime_type io.containerd.runtime.v1.linux runtime_engine runtime_root [plugins.io.containerd.grpc.v1.cri.containerd.default_runtime.options] NoPivotRoot false NoNewKeyring false ShimCgroup IoUid 0 IoGid 0 BinaryName Root CriuPath SystemdCgroup true [plugins.io.containerd.grpc.v1.cri.containerd.untrusted_workload_runtime] runtime_type runtime_engine runtime_root 7. 监控与维护7.1 监控Containerd性能使用crictl工具监控容器状态# 查看容器列表 crictl ps -a # 查看镜像列表 crictl images # 查看容器统计信息 crictl stats7.2 日志收集配置配置kubelet日志级别# 编辑kubelet服务配置 vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # 添加日志级别参数 EnvironmentKUBELET_CONFIG_ARGS--v27.3 定期维护任务设置定期清理无用镜像和容器# 清理停止的容器 crictl rm $(crictl ps -aq) # 清理无用镜像 crictl rmi --prune可以设置cron任务自动执行这些清理操作。