Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2025-05-23 GMT+08:00

O que fazer se um pod não conseguir extrair a imagem?

Localização de falha

Se o status do pod for ImagePullBackOff, a imagem não será extraída. Para obter detalhes sobre como visualizar eventos do Kubernetes, consulte Exibir eventos do pod.

Processo de solução de problemas

Determine a causa com base nas informações do evento, conforme listado em Tabela 1.

Tabela 1 FailedPullImage

Informações sobre o evento

Causa e solução

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

Você não fez logon no repositório de imagens.

Item de verificação 1: se imagePullSecret é especificado quando você usa kubectl para criar uma carga de trabalho

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

O endereço da imagem está configurado incorretamente.

Item de verificação 2: se o endereço da imagem está correto quando uma imagem de terceiros é usada

Item de verificação 3: se um segredo incorreto é usado quando uma imagem de terceiros é usada

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)

Falhou ao conectar ao repositório de imagens devido à rede desconectada.

Item de verificação 7: conexão ao repositório de imagens

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

O espaço do disco é insuficiente.

Item de verificação 4: se o espaço de disco do nó é insuficiente

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

Um certificado desconhecido ou inseguro é usado pelo repositório de imagens de terceiros do qual a imagem é extraída.

Item de verificação 5: se o repositório remoto de imagens usa um certificado desconhecido ou inseguro

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

O tamanho da imagem é muito grande.

Item de verificação 6: se o tamanho da imagem é muito 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)

Item de verificação 7: conexão ao repositório de imagens

ERROR: toomanyrequests: Too Many Requests.

Ou

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

A taxa é limitada porque o número de tempos de extração da imagem alcança o limite superior.

Item de verificação 8: se o número de extração de imagens públicas atinge o limite superior

Figura 1 Processo de solução de problemas

Item de verificação 1: se imagePullSecret é especificado quando você usa kubectl para criar uma carga de trabalho

Se o status da carga de trabalho for anormal e um evento do Kubernetes for exibido indicando que o pod não consegue extrair a imagem, verifique se o campo imagePullSecrets existe no arquivo YAML.

Itens para verificar

  • Se uma imagem precisar ser extraída do SWR, o parâmetro name deve ser definido como 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
  • Se uma imagem precisar ser extraída de um repositório de imagens de terceiros, o parâmetro imagePullSecrets deve ser definido como o nome secreto criado.

    Quando você usa kubectl para criar uma carga de trabalho a partir de uma imagem de terceiros, especifique o campo imagePullSecret, no qual name indica o nome do segredo usado para extrair a imagem. Para obter detalhes sobre como criar um segredo, consulte Uso do kubectl.

Item de verificação 2: se o endereço da imagem está correto quando uma imagem de terceiros é usada

O CCE permite que você crie cargas de trabalho usando imagens extraídas de repositórios de imagens de terceiros.

Insira o endereço de imagem de terceiros de acordo com os requisitos. O formato deve ser ip:port/path/name:version ou name:version. Se nenhuma tag for especificada, latest é usada por padrão.

  • Para um repositório privado, insira um endereço de imagem no formato ip:port/path/name:version.
  • Para um repositório de Docker de código aberto, insira um endereço de imagem no formato name:version, por exemplo, nginx:latest.
    Figura 2 Usar uma imagem de terceiros

As informações a seguir são exibidas quando você não consegue extrair uma imagem devido ao endereço de imagem incorreto fornecido.

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

Solução

Você pode editar seu arquivo YAML para modificar o endereço da imagem ou fazer logon no console do CCE para substituir a imagem na página de guia Upgrade na página de detalhes da carga de trabalho.

Item de verificação 3: se um segredo incorreto é usado quando uma imagem de terceiros é usada

Geralmente, um repositório de imagens de terceiros pode ser acessado somente após a autenticação (usando sua conta e senha). O CCE usa o modo de autenticação secreto para extrair imagens. Portanto, você precisa criar um segredo para um repositório de imagens antes de extrair imagens do repositório.

Solução

Se o seu segredo estiver incorreto, as imagens não serão extraídas. Nesse caso, crie um novo segredo.

Para criar um segredo, consulte Uso do kubectl.

Item de verificação 4: se o espaço de disco do nó é insuficiente

Um disco de dados de 100 GB dedicado para o Docker é anexado ao novo nó. Se o espaço em disco de dados for insuficiente, a imagem não será extraída.

Figura 3 Capacidade do disco de dados (GB)

Se o evento de Kubernetes contiver as informações a seguir, o nó não terá espaço em disco para armazenar imagens. Você precisa limpar as imagens ou expandir a capacidade do 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

Execute o comando lvs para verificar o espaço em disco para armazenar imagens no nó.

Execute o seguinte comando para limpar as imagens:

docker rmi -f {Image ID}

Para expandir a capacidade do disco, execute as seguintes etapas:

  1. Expanda a capacidade de um disco de dados no console do EVS. Para obter detalhes, consulte Expansão da capacidade de disco do EVS.

    Somente a capacidade de armazenamento do disco EVS é expandida. Você também precisa executar as etapas a seguir para expandir a capacidade do volume lógico e do sistema de arquivos.

  2. Efetue logon no console do CCE e clique no cluster. No painel de navegação, escolha Nodes. Clique em More > Sync Server Data na linha que contém o nó de destino.
  3. Faça logon no nó de destino.
  4. Execute o comando lsblk para verificar as informações do dispositivo de bloco do nó.

    Um disco de dados é dividido dependendo do armazenamento do contêiner Rootfs:

    Overlayfs: nenhum thin pool independente é alocado. Os dados da imagem são armazenados no dockersys.

    1. Verifique os tamanhos do disco e da partição do dispositivo.
      # 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  150G  0 disk      # The data disk has been expanded to 150 GiB, but 50 GiB space is not allocated.
      ├─vgpaas-dockersys  253:0    0   90G  0 lvm  /var/lib/containerd
      └─vgpaas-kubernetes 253:1    0   10G  0 lvm  /mnt/paas/kubernetes/kubelet
    2. Expanda a capacidade do disco.

      Adicione a nova capacidade de disco ao volume lógico dockersys usado pelo mecanismo de contêiner.

      1. Expanda a capacidade do PV para que o LVM possa identificar a nova capacidade do EVS. /dev/sdb especifica o volume físico onde o dockersys está localizado.
        pvresize /dev/sdb

        Informação semelhante à seguinte é exibida:

        Physical volume "/dev/sdb" changed
        1 physical volume(s) resized or updated / 0 physical volume(s) not resized
      2. Expanda 100% da capacidade livre para o volume lógico. vgpaas/dockersys especifica o volume lógico usado pelo mecanismo de contêiner.
        lvextend -l+100%FREE -n vgpaas/dockersys

        Informação semelhante à seguinte é exibida:

        Size of logical volume vgpaas/dockersys changed from <90.00 GiB (23039 extents) to 140.00 GiB (35840 extents).
        Logical volume vgpaas/dockersys successfully resized.
      3. Ajuste o tamanho do sistema de arquivos. /dev/vgpaas/dockersys especifica o caminho do sistema de arquivos do mecanismo de contêiner.
        resize2fs /dev/vgpaas/dockersys

        Informação semelhante à seguinte é exibida:

        Filesystem at /dev/vgpaas/dockersys is mounted on /var/lib/containerd; on-line resizing required
        old_desc_blocks = 12, new_desc_blocks = 18
        The filesystem on /dev/vgpaas/dockersys is now 36700160 blocks long.
    3. Verifique se a capacidade está expandida.
      # 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  150G  0 disk
      ├─vgpaas-dockersys  253:0    0   140G  0 lvm  /var/lib/containerd
      └─vgpaas-kubernetes 253:1    0   10G  0 lvm  /mnt/paas/kubernetes/kubelet

Item de verificação 5: se o repositório remoto de imagens usa um certificado desconhecido ou inseguro

Quando um pod extrai uma imagem de um repositório de imagens de terceiros que usa um certificado desconhecido ou inseguro, a imagem não é extraída do nó. A lista de eventos do pod contém o evento "Failed to pull the image" com a causa "x509: certificate signed by unknown authority".

A segurança das imagens do EulerOS 2.9 é aprimorada. Alguns certificados inseguros ou expirados são removidos do sistema. É normal que esse erro seja relatado no EulerOS 2.9, mas não ou algumas imagens de terceiros em outros tipos de nós. Você também pode executar as seguintes operações para corrigir a falha.

Solução

  1. Verifique o endereço IP e o número da porta do servidor de imagem de terceiros para o qual a mensagem de erro "unknown authority" é exibida.

    Você pode ver o endereço IP e o número da porta do servidor de imagem de terceiros para o qual o erro é relatado nas informações 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

    O endereço IP do servidor de imagem de terceiros é production.cloudflare.docker.com, e o número da porta HTTPS padrão é 443.

  2. Carregue o certificado raiz do servidor de imagem de terceiros para o nó onde a imagem de terceiros deve ser baixada.

    Execute os seguintes comandos nos nós de EulerOS e CentOS com {server_url}:{server_port} substituído pelo endereço IP e número da porta obtidos na Etapa 1, por exemplo, production.cloudflare.docker.com:443:

    Se o mecanismo de contêiner do nó estiver em contêiner, substitua 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
    Execute o seguinte comando nos nós do 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

Item de verificação 6: se o tamanho da imagem é muito grande

A lista de eventos do pod contém o evento "Failed to pull image". Isso pode ser causado por um tamanho de imagem grande.

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

Efetue logon no nó e execute o comando docker pull para extrair manualmente a imagem. A imagem é extraída com sucesso.

Causa raiz

O valor padrão de image-pull-progress-deadline é 1 minuto. Se o progresso da extração da imagem não for atualizado dentro de 1 minuto, a extração da imagem será cancelada. Se o desempenho do nó for ruim ou o tamanho da imagem for muito grande, a imagem pode falhar ao ser extraída e a carga de trabalho pode falhar ao ser iniciada.

Solução

  • (Recomendado) Método 1: faça logon no nó, execute o comando docker pull para extrair manualmente a imagem e verifique se imagePullPolicy da carga de trabalho é IfNotPresent (configuração de política padrão). Nesse caso, a imagem que foi extraída para o host local é usada para criar a carga de trabalho.
  • Método 2: modifique os parâmetros de configuração do kubelet.

    Para um cluster de v1.15 ou posterior, execute o seguinte comando:

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

    Para um cluster anterior a v1.15, execute o seguinte comando:

    vi /var/paas/kubernetes/kubelet/kubelet

    Adicione --image-pull-progress-deadline=30m ao final do parâmetro DAEMON_ARGS. 30m indica 30 minutos. Você pode alterar o valor conforme necessário. A configuração adicionada e a configuração existente são separadas por um espaço.

    Execute o seguinte comando para reiniciar o kubelet:

    systemctl restart kubelet

    Aguarde um pouco e verifique se o status do kubelet está running.

    systemctl status kubelet

    A carga de trabalho é iniciada corretamente e a imagem é extraída com êxito.

Item de verificação 7: conexão ao repositório de imagens

Sintoma

A seguinte mensagem de erro é exibida durante a criação da carga de trabalho:

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

Falhou ao conectar ao repositório de imagens devido à rede desconectada. O SWR permite que você extraia imagens do repositório oficial do Docker. Para imagens extraídas de outros repositórios, você precisa se conectar aos repositórios primeiro.

Solução

  • Vincule um endereço IP público (EIP) ao nó que extraia a imagem.
  • Carregue a imagem para o SWR e, em seguida, extraia a imagem do SWR.

Item de verificação 8: se o número de extração de imagens públicas atinge o limite superior

Sintoma

A seguinte mensagem de erro é exibida durante a criação da carga de trabalho:

ERROR: toomanyrequests: Too Many Requests.

Ou

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

Causa

O Docker Hub define o número máximo de solicitações de extrair imagem de contêiner. Para obter detalhes, consulte Entender seu limite de taxa do Docker Hub.

Solução

Envie por push a imagem usada com frequência para o SWR e, em seguida, extraia a imagem do SWR.