MicroK8s拉取本地Registry镜像失败,Pod卡在ContainerCreating状态排查
解决MicroK8s本地Registry镜像拉取失败问题(1.14/beta版本)
最近在Ubuntu主机上用MicroK8s 1.14/beta版本搭建本地镜像仓库时踩了个坑,折腾半天终于解决,把过程和经验分享出来:
前期正确配置步骤
我先按官方文档完成了本地Registry的基础配置:
- 启用MicroK8s内置Registry:执行
microk8s.enable registry,确认registry pod运行状态正常 - 配置Docker允许不安全Registry:修改
/etc/docker/daemon.json,添加配置{"insecure-registries": ["127.0.0.1:32000"]},重启Docker后验证配置生效 - 镜像打标并推送:给本地镜像打标签
127.0.0.1:32000/my-service,推送成功后,能通过http://127.0.0.1:32000/v2/_catalog查看到推送的镜像
遇到的异常问题
当我在deployment-local.yml中配置这个镜像并部署后,Pod一直卡在ContainerCreating状态。执行 microk8s.kubectl describe pods 查看详情,发现镜像拉取失败,错误提示:
用HTTPS访问HTTP registry
我尝试把镜像地址改成localhost,结果只有Firefox能访问Registry,但Pod拉取还是失败,错误变成:
连接localhost:443被拒绝
最终解决方法
折腾半天后才发现,问题出在deployment的yml文件里的image字段没加端口号!
原来我写的是:
image: 127.0.0.1/my-service
改成带端口的格式后:
image: 127.0.0.1:32000/my-service
Pod立刻正常拉取镜像,状态恢复为Running。
踩坑总结
- MicroK8s的本地Registry默认使用32000端口,配置镜像地址时必须带上端口,否则K8s会默认用443端口尝试HTTPS拉取,触发协议不匹配的错误
- 不要轻易把
127.0.0.1换成localhost,容器内部的localhost和主机的localhost不属于同一网络空间,容易引发网络连通问题 - 遇到Pod状态异常时,优先用
kubectl describe pods查看详细错误信息,能精准定位问题根源
内容的提问来源于stack exchange,提问作者ses
相关产品推荐
相关产品推荐

