别再踩坑了!KubeKey离线安装K8s v1.26.12时,containerd镜像拉取失败的完整避坑指南
KubeKey离线部署K8s集群containerd镜像拉取全流程避坑手册第一次用KubeKey离线部署Kubernetes集群时containerd镜像拉取失败的问题让我折腾了大半天。看着部署日志里反复出现的证书错误提示才意识到离线环境下的镜像仓库配置远比想象中复杂。本文将系统梳理KubeKey离线安装Kubernetes v1.26.12时containerd运行时镜像拉取的完整避坑指南帮你提前规避这些坑。1. 离线环境的核心挑战与解决方案离线部署Kubernetes集群最大的难点在于容器镜像的获取与管理。与在线环境不同离线场景下所有依赖镜像都需要从私有仓库拉取。这涉及到三个关键环节的协同工作私有镜像仓库的证书信任自签名证书需要被集群节点信任KubeKey配置文件的正确参数insecureRegistries和registryMirrors的精准定义containerd运行时配置config.toml文件的生成与调优我曾遇到过一个典型问题部署过程中containerd反复报错x509: certificate signed by unknown authority。根本原因是Harbor仓库的自签名证书未被节点信任而KubeKey的配置文件又未正确声明跳过证书验证。2. 私有仓库证书的预处理在开始部署前必须确保所有节点都已信任私有仓库的证书。以Harbor为例假设仓库地址为dockerhub.kubekey.local需要执行以下操作# 获取仓库CA证书假设已存放在/tmp目录 sudo mkdir -p /usr/local/share/ca-certificates/dockerhub.kubekey.local sudo cp /tmp/ca.crt /usr/local/share/ca-certificates/dockerhub.kubekey.local/ sudo update-ca-certificates验证证书是否生效openssl s_client -connect dockerhub.kubekey.local:443 -showcerts /dev/null 2/dev/null | openssl x509 -noout -text | grep -A2 Validity如果因特殊原因无法部署证书必须在KubeKey配置和containerd配置中明确声明跳过证书验证生产环境不推荐。3. KubeKey配置文件的关键参数config.yaml是KubeKey部署的核心配置文件与镜像拉取相关的主要有以下参数registry: type: harbor auths: dockerhub.kubekey.local: username: admin password: Harbor12345 skipTLSVerify: true # 跳过TLS验证 privateRegistry: dockerhub.kubekey.local insecureRegistries: [dockerhub.kubekey.local] # 声明非安全仓库 registryMirrors: [] # 镜像加速器配置常见配置误区误用registryMirrors这个参数用于配置镜像加速器而非私有仓库地址忽略skipTLSVerify当使用自签名证书时必须设置为trueauths格式错误用户名密码必须与Harbor账户匹配提示建议先用curl测试仓库可访问性curl -vk https://dockerhub.kubekey.local/v2/_catalog4. containerd运行时深度配置即使KubeKey配置正确containerd自身的配置也至关重要。以下是完整的配置流程4.1 生成默认配置sudo mkdir -p /etc/containerd sudo containerd config default | sudo tee /etc/containerd/config.toml4.2 关键配置项修改在生成的config.toml中找到[plugins.io.containerd.grpc.v1.cri.registry]段添加以下内容[plugins.io.containerd.grpc.v1.cri.registry.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.dockerhub.kubekey.local] endpoint [https://dockerhub.kubekey.local] [plugins.io.containerd.grpc.v1.cri.registry.configs] [plugins.io.containerd.grpc.v1.cri.registry.configs.dockerhub.kubekey.local.tls] insecure_skip_verify true4.3 重启containerd服务sudo systemctl restart containerd sudo systemctl status containerd # 验证服务状态4.4 手动测试镜像拉取sudo crictl pull dockerhub.kubekey.local/kubesphereio/pause:3.9如果仍然失败可以尝试直接使用ctr命令测试sudo ctr --address /run/containerd/containerd.sock images pull \ --plain-http \ dockerhub.kubekey.local/kubesphereio/pause:3.95. 部署失败后的恢复策略当部署因镜像拉取失败而中断时不建议直接重试。正确的恢复流程应该是检查日志定位问题journalctl -u containerd -f --no-pager | grep -i pull验证网络连通性curl -vk https://dockerhub.kubekey.local/v2/_catalog ping dockerhub.kubekey.local检查配置生效情况sudo crictl info | jq .config.registry清理临时文件sudo rm -f /run/containerd/containerd.sock重新生成containerd配置sudo containerd config default /etc/containerd/config.toml6. 部署前检查清单为了避免部署时才发现问题建议执行以下检查[ ] 所有节点的时间同步NTP服务正常[ ] 节点主机名解析正确/etc/hosts或DNS配置[ ] Harbor证书已部署到所有节点[ ]config.yaml中的仓库地址与认证信息正确[ ] containerd配置已更新并重启[ ] 防火墙规则允许443端口访问[ ] 离线镜像包已正确导入Harbor可以通过以下命令快速验证# 验证证书 openssl s_client -connect dockerhub.kubekey.local:443 /dev/null 2/dev/null | openssl x509 -noout -issuer # 验证仓库访问 curl -u admin:Harbor12345 https://dockerhub.kubekey.local/v2/_catalog # 验证containerd配置 sudo crictl info | jq .config.registry.configs7. 高级技巧与注意事项对于生产环境还有一些额外的考虑因素镜像同步策略使用skopeo同步镜像到私有仓库示例命令skopeo copy --dest-tls-verifyfalse \ docker://docker.io/nginx:latest \ docker://dockerhub.kubekey.local/library/nginx:latest配置多仓库镜像[plugins.io.containerd.grpc.v1.cri.registry.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://dockerhub.kubekey.local]资源访问控制为KubeKey创建专用的Harbor账户限制该账户的权限范围定期轮换访问凭证性能调优建议[plugins.io.containerd.grpc.v1.cri] sandbox_image dockerhub.kubekey.local/kubesphereio/pause:3.9 [plugins.io.containerd.grpc.v1.cri.registry] config_path /etc/containerd/certs.d离线环境下的Kubernetes部署确实比在线部署复杂得多但通过系统化的准备和正确的配置完全可以避免大多数常见问题。建议在正式部署前先搭建一个测试环境验证所有配置。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2468557.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!