Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2023-08-08 GMT+08:00

¿Qué debo hacer si un pod no logra extraer la imagen?

Localización de fallas

Si el estado del pod es ImagePullBackOff, no se puede extraer la imagen. Para obtener más información sobre cómo ver los eventos de Kubernetes, consulte Consulta de eventos de pod.

Proceso de solución de problemas

Determine la causa basándose en la información del evento, tal como aparece en Tabla 1.

Tabla 1 FailedPullImage

Información del evento

Motivo y solución

Failed to pull image "xxx": rpc error: code = Unknown desc = Error response from daemon: Get xxx: denied: You may not login yet

No ha iniciado sesión en el repositorio de imágenes.

Concepto de comprobación 1: si se especifica imagePullSecret cuando se utiliza kubectl para crear una carga de trabajo

Failed to pull image "nginx:v1.1": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host

La dirección de la imagen está configurada incorrectamente.

Concepto de comprobación 2: Si la dirección de la imagen es correcta cuando se utiliza una imagen de terceros

Concepto de comprobación 3: Si se utiliza un secreto incorrecto cuando se utiliza una imagen de terceros

Failed to pull image "docker.io/bitnami/nginx:1.22.0-debian-11-r3": 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)

Error al conectarse al repositorio de imágenes debido a la red desconectada.

Concepto de comprobación 7: Conexión al repositorio de Imágenes

Failed create pod sandbox: rpc error: code = Unknown desc = failed to create a sandbox for pod "nginx-6dc48bf8b6-l8xrw": Error response from daemon: mkdir xxxxx: no space left on device

El espacio en disco es insuficiente.

Concepto de comprobación 4: Si el espacio en disco del nodo es insuficiente

Failed to pull image "xxx": rpc error: code = Unknown desc = error pulling image configuration: xxx x509: certificate signed by unknown authority

El repositorio de imágenes de terceros del que se extrae la imagen utiliza un certificado desconocido o inseguro.

Concepto de comprobación 5: Si el repositorio de imágenes remoto utiliza un certificado desconocido o inseguro

Failed to pull image "XXX": rpc error: code = Unknown desc = context canceled

El tamaño de la imagen es demasiado grande.

Concepto de comprobación 6: Si el tamaño de la imagen es demasiado grande

Failed to pull image "docker.io/bitnami/nginx:1.22.0-debian-11-r3": 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)

Concepto de comprobación 7: Conexión al repositorio de Imágenes

ERROR: toomanyrequests: Too Many Requests.

O

you have reached your pull rate limit, you may increase the limit by authenticating an upgrading

La velocidad es limitada porque el número de veces de extracción de imágenes alcanza el límite superior.

Concepto de comprobación 8: Si el número de veces de imágenes públicas alcanza el límite superior

Figura 1 Proceso de solución de problemas

Concepto de comprobación 1: si se especifica imagePullSecret cuando se utiliza kubectl para crear una carga de trabajo

Si el estado de la carga de trabajo es anormal y se muestra un evento de Kubernetes que indica que el pod no puede extraer la imagen, compruebe si el campo imagePullSecrets existe en el archivo YAML.

Conceptos a comprobar

  • Si se necesita extraer una imagen de SWR, el parámetro name debe establecerse en default-secret.
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx 
            imagePullPolicy: Always
            name: nginx
          imagePullSecrets:
          - name: default-secret
  • Si es necesario extraer una imagen de un repositorio de imágenes de terceros, el parámetro imagePullSecrets debe establecerse en el nombre secreto creado.

    Cuando utilice kubectl para crear una carga de trabajo a partir de una imagen de terceros, especifique el campo imagePullSecret, en el que name indica el nombre del secreto utilizado para extraer la imagen. Para obtener más información sobre cómo crear un secreto, consulte Uso de kubectl.

Concepto de comprobación 2: Si la dirección de la imagen es correcta cuando se utiliza una imagen de terceros

CCE le permite crear cargas de trabajo utilizando imágenes extraídas de repositorios de imágenes de terceros.

Ingrese la dirección de imagen de terceros según los requisitos. El formato debe ser ip:port/path/name:version o name:version. Si no se especifica ninguna etiqueta, se utiliza latest de forma predeterminada.

  • Para un repositorio privado, introduzca una dirección de imagen con el formato ip:port/path/name:version.
  • Para un repositorio de Docker de código abierto, introduzca una dirección de imagen en el formato de name:version, por ejemplo, nginx:latest.
    Figura 2 Uso de una imagen de terceros

La siguiente información se muestra cuando no se puede extraer una imagen debido a la dirección de imagen incorrecta proporcionada.

Failed to pull image "nginx:v1.1": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host

Solución

Puede editar el archivo YAML para modificar la dirección de la imagen o iniciar sesión en la consola de CCE para reemplazar la imagen en la página de ficha Upgrade de la página de detalles de la carga de trabajo.

Concepto de comprobación 3: Si se utiliza un secreto incorrecto cuando se utiliza una imagen de terceros

Generalmente, se puede acceder a un repositorio de imágenes de terceros solo después de la autenticación (usando su cuenta y contraseña). CCE utiliza el modo de autenticación secreta para extraer imágenes. Por lo tanto, debe crear un secreto para un repositorio de imágenes antes de extraer imágenes del repositorio.

Solución

Si su secreto es incorrecto, las imágenes no se extraerán. En este caso, crea un nuevo secreto.

Para crear un secreto, consulte Uso de kubectl.

Concepto de comprobación 4: Si el espacio en disco del nodo es insuficiente

Cuando se crea un nodo, se enlaza un disco de datos al nodo. Si el espacio en disco de datos es insuficiente, la extracción de imagen fallará.

Figura 3 Capacidad del disco de datos (GB)

Si el evento Kubernetes contiene la siguiente información, el nodo no tiene espacio en disco para almacenar imágenes. Es necesario limpiar imágenes o ampliar la capacidad del disco.

Failed create pod sandbox: rpc error: code = Unknown desc = failed to create a sandbox for pod "nginx-6dc48bf8b6-l8xrw": Error response from daemon: mkdir xxxxx: no space left on device

Ejecute el comando lvs para comprobar el espacio en disco para almacenar imágenes en el nodo.

Ejecute el siguiente comando para limpiar imágenes:

docker rmi -f {Image ID}

Para ampliar la capacidad del disco, realice los siguientes pasos:

  1. Amplíe la capacidad del disco de datos en la consola de EVS.
  2. Inicie sesión en la consola de CCE y haga clic en el clúster. En el panel de navegación, elija Nodes. Haga clic en More > Sync Server Data en la fila que contiene el nodo de destino.
  3. Inicie sesión en el nodo de destino.
  4. Ejecute el comando lsblk para comprobar la información del dispositivo de bloque del nodo.

    Un disco de datos se divide en función del Rootfs de almacenamiento contenedor:

    • Overlayfs: No se asigna ningún thin pool independiente. Los datos de imagen se almacenan en el disco dockersys.
      # lsblk
      NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
      sda                   8:0    0   50G  0 disk 
      └─sda1                8:1    0   50G  0 part /
      sdb                   8:16   0  200G  0 disk 
      ├─vgpaas-dockersys  253:0    0   90G  0 lvm  /var/lib/docker               # Space used by Docker.
      └─vgpaas-kubernetes 253:1    0   10G  0 lvm  /mnt/paas/kubernetes/kubelet  # Space used by Kubernetes.

      Ejecute los siguientes comandos en el nodo para agregar la nueva capacidad de disco al disco dockersys:

      pvresize /dev/sdb 
      lvextend -l+100%FREE -n vgpaas/dockersys
      resize2fs /dev/vgpaas/dockersys
    • Devicemapper: Se asigna un thin pool para almacenar datos de imagen.
      # lsblk
      NAME                                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
      sda                                   8:0    0   50G  0 disk 
      └─sda1                                8:1    0   50G  0 part /
      sdb                                   8:16   0  200G  0 disk 
      ├─vgpaas-dockersys                  253:0    0   18G  0 lvm  /var/lib/docker    
      ├─vgpaas-thinpool_tmeta             253:1    0    3G  0 lvm                   
      │ └─vgpaas-thinpool                 253:3    0   67G  0 lvm                   # Thin pool space.
      │   ...
      ├─vgpaas-thinpool_tdata             253:2    0   67G  0 lvm  
      │ └─vgpaas-thinpool                 253:3    0   67G  0 lvm  
      │   ...
      └─vgpaas-kubernetes                 253:4    0   10G  0 lvm  /mnt/paas/kubernetes/kubelet
      • Ejecute los siguientes comandos en el nodo para agregar la nueva capacidad de disco al disco thinpool:
        pvresize /dev/sdb 
        lvextend -l+100%FREE -n vgpaas/thinpool
      • Ejecute los siguientes comandos en el nodo para agregar la nueva capacidad de disco al disco dockersys:
        pvresize /dev/sdb 
        lvextend -l+100%FREE -n vgpaas/dockersys
        resize2fs /dev/vgpaas/dockersys

Concepto de comprobación 5: Si el repositorio de imágenes remoto utiliza un certificado desconocido o inseguro

Cuando un pod extrae una imagen de un repositorio de imágenes de terceros que utiliza un certificado desconocido o inseguro, la imagen no se extrae del nodo. La lista de eventos de pod contiene el evento "Failed to pull the image" con la causa "x509: certificate signed by unknown authority".

Se mejora la seguridad de las imágenes de EulerOS 2.9. Algunos certificados inseguros o caducados se eliminan del sistema. Es normal que este error se notifique en EulerOS 2.9 pero no o algunas imágenes de terceros en otros tipos de nodos. También puede realizar las siguientes operaciones para rectificar la falla.

Solución

  1. Compruebe la dirección IP y el número de puerto del servidor de imágenes de terceros para el que se muestra el mensaje de error "unknown authority".

    Puede ver la dirección IP y el número de puerto del servidor de imágenes de terceros para el que se reporta el error en la información de evento "Failed to pull image".
    Failed to pull image "bitnami/redis-cluster:latest": rpc error: code = Unknown desc = error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/e8/e83853f03a2e792614e7c1e6de75d63e2d6d633b4e7c39b9d700792ee50f7b56/data?verify=1636972064-AQbl5RActnudDZV%2F3EShZwnqOe8%3D: x509: certificate signed by unknown authority

    La dirección IP del servidor de imágenes de terceros es production.cloudflare.docker.com y el número de puerto HTTPS predeterminado es 443.

  2. Cargue el certificado raíz del servidor de imágenes de terceros en el nodo donde se va a descargar la imagen de terceros.

    Ejecute los siguientes comandos en los nodos de EulerOS y de CentOS con {server_url}:{server_port} reemplazado por la dirección IP y el número de puerto obtenidos en el paso 1, por ejemplo, production.cloudflare.docker.com:443:

    Si el motor de contenedores del nodo es containerd, reemplace systemctl restart docker por systemctl restart containerd.
    openssl s_client -showcerts -connect {server_url}:{server_port} < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/ca-trust/source/anchors/tmp_ca.crt
    update-ca-trust
    systemctl restart docker
    Ejecute el siguiente comando en los nodos de Ubuntu:
    openssl s_client -showcerts -connect {server_url}:{server_port} < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /usr/local/share/ca-certificates/tmp_ca.crt
    update-ca-trust
    systemctl restart docker

Concepto de comprobación 6: Si el tamaño de la imagen es demasiado grande

La lista de eventos de pod contiene el evento "Failed to pull image". Esto puede ser causado por un tamaño de imagen grande.

Failed to pull image "XXX": rpc error: code = Unknown desc = context canceled

Inicie sesión en el nodo y ejecute el comando docker pull para extraer manualmente la imagen. La imagen se extrae correctamente.

Causa raíz

El valor predeterminado de image-pull-progress-deadline es 1 minuto. Si el progreso de extracción de imagen no se actualiza en 1 minuto, se cancela la extracción de imagen. Si el rendimiento del nodo es deficiente o el tamaño de la imagen es demasiado grande, es posible que la imagen no se extraiga y que la carga de trabajo no se inicie.

Solución

  • (Recomendado) Método 1: Inicie sesión en el nodo, ejecute el comando docker pull para extraer manualmente la imagen y compruebe si imagePullPolicy de la carga de trabajo es IfNotPresent (configuración de política predeterminada). En este caso, la imagen que se ha extraído al host local se utiliza para crear la carga de trabajo.
  • Método 2: Modifique los parámetros de configuración de kubelet.

    Para un clúster de v1.15 o posterior, ejecute el siguiente comando:

    vi /opt/cloud/cce/kubernetes/kubelet/kubelet

    Para un clúster anterior a v1.15, ejecute el siguiente comando:

    vi /var/paas/kubernetes/kubelet/kubelet

    Agregue --image-pull-progress-deadline=30m al final del parámetro DAEMON_ARGS. 30m indica 30 minutos. Este valor se puede modificar según se requiera. La configuración agregada y la configuración existente están separadas por un espacio.

    Ejecute el siguiente comando para reiniciar kubelet:

    systemctl restart kubelet

    Espere un rato y compruebe si el estado del kubelet es running.

    systemctl status kubelet

    La carga de trabajo se inicia correctamente y la imagen se extrae correctamente.

Concepto de comprobación 7: Conexión al repositorio de Imágenes

Síntoma

Se muestra el siguiente mensaje de error durante la creación de la carga de trabajo:

Failed to pull image "docker.io/bitnami/nginx:1.22.0-debian-11-r3": 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)

Causa

Error al conectarse al repositorio de imágenes debido a la red desconectada. SWR le permite extraer imágenes del repositorio oficial de Docker. Para extraer imágenes de otros repositorios, primero debe conectarse a los repositorios.

Solución

  • Vincule una dirección IP pública (EIP) al nodo que extrae la imagen.
  • Suba la imagen a SWR y luego extraiga la imagen de SWR.

Concepto de comprobación 8: Si el número de veces de imágenes públicas alcanza el límite superior

Síntoma

Se muestra el siguiente mensaje de error durante la creación de la carga de trabajo:

ERROR: toomanyrequests: Too Many Requests.

O

you have reached your pull rate limit, you may increase the limit by authenticating an upgrading: https://www.docker.com/increase-rate-limits.

Causa

Docker Hub establece el número máximo de solicitudes de extracción de imágenes de contenedor. Para obtener más información, consulte Comprender el límite de velocidad de Docker Hub.

Solución

Empuje la imagen utilizada con frecuencia a SWR y luego extraiga la imagen de SWR.