K8s 容器不启动 ImagePullBackOff、ErrImagePull

问题描述 投票:0回答:4

我尝试使用 k8s 在本地启动几个容器,但由于 ImagePullBackOffErrImagePull,容器创建已停止。 yaml 没问题,在另一个工作站上测试过。我可以使用常规泊坞窗提取图像。但在k8s/minikube环境下失败

错误容器日志是

Error from server (BadRequest): container "mongo-express" in pod "mongoexpress-deployment-bd7cf697b-nc4h5" is waiting to start: trying and failing to pull image

minikube 仪表板中的错误是

Failed to pull image "docker.io/mongo": rpc error: code = Unknown desc = Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 

我尝试将映像拉取到本地 docker 缓存并运行

eval $(minikube docker-env)

但我不断收到此错误。它看不到本地图像存储库,也不会自行下载图像。

我 100% 确定这与 Fedora 上的用户访问有关。但不知道该怎么做,我已经尝试解决这个问题几天了:(.

请帮忙,谢谢

不知道这是否有帮助:我尝试使用k3s。镜像拉取成功,但是minikube在Fedora上不兼容。

另外...如果我尝试使用不带 sudo 的 docker,它不会提取图像。使用 sudo 即可拉动。

操作系统是Fedora,我使用docker、kubernetes、minikube、podman作为驱动程序。

- linux version
NAME="Fedora Linux"
VERSION="35 (Workstation Edition)"
- kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", 
- docker version
Version:          20.10.12
- minikube version
minikube version: v1.25.2

我正在尝试在本地启动此 yaml 文件

apiVersion: v1
kind: Secret
metadata:
  name: mongodb-secret
type: Opaque
data:
  mongo-root-username: dXNlcm5hbWU=
  mongo-root-password: cGFzc3dvcmQ=
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-configmap
data:
  database_url: mongodb-service
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongoexpress-deployment
  labels:
    app: mongoexpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongoexpress
  template:
    metadata:
      labels:
        app: mongoexpress
    spec:
      containers:
        - name: mongo-express
          image: mongo-express
          ports:
            - containerPort: 8081
          env:
            - name: ME_CONFIG_MONGODB_ADMINUSERNAME
              valueFrom:
                secretKeyRef:
                  name: mongodb-secret
                  key: mongo-root-username
            - name: ME_CONFIG_MONGODB_ADMINPASSWORD
              valueFrom:
                secretKeyRef:
                  name: mongodb-secret
                  key: mongo-root-password
            - name: ME_CONFIG_MONGODB_SERVER
              valueFrom:
                configMapKeyRef:
                  name: mongodb-configmap
                  key: database_url
            - name: WHATEVER
              value: Someconfig
---
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
---
apiVersion: v1
kind: Service
metadata:
  name: mongoexpress-service
spec:
  selector:
    app: mongoexpress-deployment
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 8081
      nodePort: 30000
kubernetes fedora minikube
4个回答
3
投票

根据评论,我的建议是使用 docker 驱动程序,因为 Docker 已安装在系统中,并且是首选稳定驱动程序

minikube start --driver=docker

您也可以将其设置为默认驱动程序。

minikube config set driver docker
minikube start

但这并不能解释为什么它不能与 podman 一起使用。


1
投票

这是解决该问题的一种方法,如果您可以使用 docker pull 拉取映像,然后在所有工作节点上执行此操作,然后添加

图像拉取策略:IfNotPresent

在您提到图像名称的yamls中,k8s将首先检查它是否存在于机器内部,如果是则直接使用它


1
投票

请仔细检查图像的路径是否输入错误。

当镜像路径错误、网络故障或者kubelet与容器注册中心认证失败时,会出现ImagePullBackOff错误。 Kubernetes 最初抛出 ErrImagePull 错误,然后重试几次后,“拉回来”并安排另一次下载尝试。

无法从注册表中提取映像时出现 ImagePullBackoff 错误。出现该错误的原因可能是找不到映像或您的节点没有从注册表中拉取的权限。


0
投票

您必须完成 3 件事,然后进行重新部署。

  1. Minikube 在它自己的单独虚拟机中运行,因此它不会使用 http/s 调用直接拉取映像,除非您将映像单独上传到本地或公共云中某处的提升存储库中,并以秘密方式提供其访问凭据。然而,minikube 提供了一种命令行实用程序来从本地加载映像。
    minikube image load <your-image:tag>
  2. 看看,防止你的集群下载不必要的镜像。将 pullpolicy 更改为
    Never
    IfNotPresent
  3. 仅使用默认的 docker 上下文,因为这不需要访问凭据,除非通过此命令明确设置
    docker context use default
© www.soinside.com 2019 - 2024. All rights reserved.