Fedora环境Minikube部署MongoDB遇ImagePullBackOff错误求助
解决Minikube部署MongoDB的ImagePullBackOff错误
问题场景
在Fedora机器上使用Minikube部署MongoDB实例时,持续出现ImagePullBackOff错误。
部署YAML配置
apiVersion: apps/v1 kind: Deployment metadata: name: mongodb-deployment labels: app: mongodb spec: replicas: 1 selector: matchLabels: app: mongodb template: metadata: labels: app: mongodb spec: containers: - name: mongodb image: mongo ports: - containerPort: 27017 env: - name: MONGO_INITDB_ROOT_USERNAME valueFrom: secretKeyRef: name: mongodb-secret key: mongo-root-username - name: MONGO_INITDB_ROOT_PASSWORD valueFrom: secretKeyRef: name: mongodb-secret key: mongo-root-password --- apiVersion: v1 kind: Service metadata: name: mongodb-service spec: selector: app: mongodb ports: - protocol: TCP port: 27017 targetPort: 27017
已尝试的排查动作
- 多次执行
docker pull mongo、minikube image pull mongo、minikube image pull mongo-express拉取镜像 - 多次重启Docker和Minikube
- 在浏览器和终端登录DockerHub
- 执行
docker login后修改/etc/resolv.conf添加nameserver 8.8.8.8,并重启Docker
Pod描述信息(kubectl describe pod输出)
Name: mongodb-deployment-6bf8f4c466-85b2h Namespace: default Priority: 0 Node: minikube/192.168.49.2 Start Time: Mon, 29 Aug 2022 23:04:12 +0530 Labels: app=mongodb pod-template-hash=6bf8f4c466 Annotations: <none> Status: Pending IP: 172.17.0.2 IPs: IP: 172.17.0.2 Controlled By: ReplicaSet/mongodb-deployment-6bf8f4c466 Containers: mongodb: Container ID: Image: mongo Image ID: Port: 27017/TCP Host Port: 0/TCP State: Waiting Reason: ImagePullBackOff Ready: False Restart Count: 0 Environment: MONGO_INITDB_ROOT_USERNAME: <set to the key 'mongo-root-username' in secret 'mongodb-secret'> Optional: false MONGO_INITDB_ROOT_PASSWORD: <set to the key 'mongo-root-password' in secret 'mongodb-secret'> Optional: false Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-vlcxl (ro) Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: kube-api-access-vlcxl: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message Normal Scheduled 22m default-scheduler Successfully assigned default/mongodb-deployment-6bf8f4c466-85b2h to minikube Warning Failed 18m (x2 over 20m) kubelet Failed to pull image "mongo:latest": rpc error: code = Unknown desc = context deadline exceeded Warning Failed 18m (x2 over 20m) kubelet Error: ErrImagePull Normal BackOff 17m (x2 over 20m) kubelet Back-off pulling image "mongo:latest" Warning Failed 17m (x2 over 20m) kubelet Error: ImagePullBackOff Normal Pulling 17m (x3 over 22m) kubelet Pulling image "mongo:latest" Normal SandboxChanged 11m kubelet Pod sandbox changed, it will be killed and re-created. Normal Pulling 3m59s (x4 over 11m) kubelet Pulling image "mongo:latest" Warning Failed 2m (x4 over 9m16s) kubelet Failed to pull image "mongo:latest": rpc error: code = Unknown desc = context deadline exceeded Warning Failed 2m (x4 over 9m16s) kubelet Error: ErrImagePull Normal BackOff 83s (x7 over 9m15s) kubelet Back-off pulling image "mongo:latest" Warning Failed 83s (x7 over 9m15s) kubelet Error: ImagePullBackOff
解决方法
从事件日志的context deadline exceeded错误来看,核心问题是Minikube节点无法正常访问Docker Hub,导致镜像拉取超时。按以下步骤处理:
检查Minikube节点的网络连通性
- 进入Minikube节点:
minikube ssh - 测试DNS解析:
nslookup hub.docker.com,若无法解析,说明节点DNS配置异常 - 测试网络连接:
curl -I https://hub.docker.com,若超时,说明节点出站网络受限
- 进入Minikube节点:
配置Minikube使用自定义DNS或代理
- 启动Minikube时指定公共DNS:
minikube start --dns=8.8.8.8 - 若宿主机需代理访问外网,启动时传入代理参数:
minikube start --docker-env HTTP_PROXY=http://你的代理地址:端口 --docker-env HTTPS_PROXY=http://你的代理地址:端口 --docker-env NO_PROXY=192.168.49.0/24,192.168.99.0/24
- 启动Minikube时指定公共DNS:
手动将镜像加载到Minikube节点
- 宿主机拉取镜像:
docker pull mongo - 拷贝镜像到Minikube节点:
minikube image load mongo - 重新部署:
kubectl apply -f 你的部署文件.yaml
- 宿主机拉取镜像:
检查防火墙与SELinux设置
- 临时关闭SELinux测试:
sudo setenforce 0,若问题解决,再配置对应的SELinux规则 - 开放防火墙伪装规则:
sudo firewall-cmd --add-masquerade --permanent && sudo firewall-cmd --reload
- 临时关闭SELinux测试:
内容的提问来源于stack exchange,提问作者DevOpsnoob
相关产品推荐
相关产品推荐

