Use a transmissão em fluxo contínuo de imagens para obter imagens de contentores

Esta página mostra-lhe como usar o streaming de imagens no Google Kubernetes Engine (GKE) para extrair imagens de contentores através do streaming dos dados de imagens à medida que as suas aplicações precisam deles.

Os clusters do Autopilot usam automaticamente a transmissão de imagens para obter imagens elegíveis. As instruções nesta página sobre como ativar e desativar o streaming de imagens aplicam-se a clusters padrão.

Vista geral

O streaming de imagens é um método de obtenção de imagens de contentores no qual o GKE faz stream de dados de imagens elegíveis conforme solicitado pelas suas aplicações. Pode usar o streaming de imagens para permitir que as suas cargas de trabalho sejam inicializadas sem esperar que a imagem completa seja transferida, o que leva a melhorias significativas nos tempos de inicialização. O tempo de obtenção reduzido oferece-lhe vantagens, incluindo o seguinte:

  • Escala automática mais rápida
  • Latência reduzida ao obter imagens grandes
  • Início mais rápido do pod

Com o streaming de imagens, o GKE usa um sistema de ficheiros remoto como o sistema de ficheiros raiz para quaisquer contentores que usem imagens de contentores elegíveis. O GKE transmite dados de imagens do sistema de ficheiros remoto conforme necessário para as suas cargas de trabalho. Sem o streaming de imagens, o GKE transfere a imagem do contentor completa para cada nó e usa-a como o sistema de ficheiros raiz para as suas cargas de trabalho.

Durante o streaming dos dados de imagem, o GKE transfere a imagem do contentor completa para o disco local em segundo plano e coloca-a em cache. Em seguida, o GKE publica pedidos de leitura de dados futuros a partir da imagem em cache.

Quando implementa cargas de trabalho que precisam de ler ficheiros específicos na imagem do contentor, o back-end de streaming de imagens publica apenas esses ficheiros pedidos.

Requisitos

Tem de cumprir os seguintes requisitos para usar o streaming de imagens em clusters do GKE Autopilot e Standard:

  • Tem de ativar a API Container File System.

    Ative a API Container File System

  • Tem de usar o SO otimizado para contentores com a imagem do nó do containerd. Os nós do piloto automático usam sempre esta imagem do nó.

  • As imagens de contentores têm de ser armazenadas em repositórios remotos ou padrão no Artifact Registry ou em registos públicos no Docker Hub.

  • Se ativar os nós privados no cluster, tem de ativar o acesso privado à Google na sub-rede para que os nós acedam ao serviço de streaming de imagens.

  • Se os VPC Service Controls protegerem as suas imagens de contentores e usar o streaming de imagens, também tem de incluir a API Image streaming (containerfilesystem.googleapis.com) no perímetro de serviço.

  • Se os nós do GKE no cluster não usarem a conta de serviço predefinida, tem de garantir que a sua conta de serviço personalizada tem a função de IAM Consumidor de utilização de serviços (roles/serviceusage.serviceUsageConsumer) no projeto que aloja a imagem do contentor.

Limitações

  • As imagens de contentores que usam o manifesto de imagens V2, versão do esquema 1 não são elegíveis.
  • As imagens de contentores com camadas duplicadas não são suportadas. O GKE transfere estas imagens sem transmitir os dados. Verifique se a imagem do contentor tem camadas vazias ou duplicadas.
  • Se as suas cargas de trabalho lerem muitos ficheiros numa imagem durante a inicialização, pode notar um aumento nos tempos de inicialização devido à latência adicionada pelas leituras de ficheiros remotos.
  • Se as suas cargas de trabalho exigirem que uma grande proporção da imagem esteja disponível antes de o código poder ser executado, pode ocorrer um atraso entre o momento em que o kubelet inicia o contentor e o momento em que o contentor começa realmente a enviar registos.
  • Pode não notar as vantagens do streaming de imagens durante a primeira obtenção de uma imagem elegível. No entanto, depois de o streaming de imagens colocar a imagem em cache, as obtenções de imagens futuras em qualquer cluster beneficiam do streaming de imagens.
  • Os clusters padrão do GKE usam a configuração ao nível do cluster para determinar se devem ativar o streaming de imagens em novos pools de nós criados com o aprovisionamento automático de nós. No entanto, não pode usar a separação de cargas de trabalho para criar pools de nós com o streaming de imagens ativado quando o streaming de imagens está desativado ao nível do cluster.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute o comando gcloud components update para obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.

Ative o streaming de imagens em clusters

Pode ativar o streaming de imagens em clusters padrão novos ou existentes usando a flag --enable-image-streaming da CLI gcloud ou a consolaGoogle Cloud . Quando cria um cluster com a flag --enable-image-streaming, o streaming de imagens é ativado no conjunto de nós predefinido. Os novos node pools que criar também têm o streaming de imagens ativado, a menos que o desative quando criar os node pools.

Todos os clusters do Autopilot usam o streaming de imagens para extrair imagens elegíveis. Para ver instruções, consulte o artigo Defina a versão e o canal de lançamento de um novo cluster do Autopilot. As seguintes instruções aplicam-se apenas a clusters do GKE Standard.

Pode ativar o streaming de imagens em clusters existentes que cumpram os requisitos através da CLI gcloud ou da Google Cloud consola.

gcloud

Para atualizar um cluster existente para usar o streaming de imagens, execute o seguinte comando com a CLI gcloud:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-image-streaming

Substitua o seguinte:

  • CLUSTER_NAME: o nome do cluster.
  • CONTROL_PLANE_LOCATION: a localização do plano de controlo do seu cluster.

Consola

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

  2. Clique no nome do cluster que quer modificar.

  3. Na página Clusters, na secção Funcionalidades, clique em junto a Streaming de imagens.

  4. Na caixa de diálogo Editar streaming de imagens, selecione a caixa de verificação Ativar streaming de imagens.

  5. Clique em Guardar alterações.

Depois de modificar o cluster, o GKE ativa a transmissão de imagens nos seus conjuntos de nós existentes automaticamente por predefinição. Se ativou ou desativou explicitamente o streaming de imagens em pools de nós individuais, esses pools de nós não herdam as alterações à definição ao nível do cluster.

A alteração da definição de streaming de imagens respeita a disponibilidade de manutenção quando é atualizada ao nível do cluster, mas não ao nível do conjunto de nós.

Esta alteração requer a recriação dos nós, o que pode causar interrupções nas suas cargas de trabalho em execução. Para ver detalhes acerca desta alteração específica, encontre a linha correspondente na tabela alterações manuais que recriam os nós através de uma estratégia de atualização de nós e respeitam as políticas de manutenção. Para saber mais sobre as atualizações de nós, consulte o artigo Planeamento de interrupções de atualizações de nós.

Verifique se o streaming de imagens está ativado num cluster

Pode verificar se o streaming de imagens está ativado ao nível do cluster através da CLI gcloud ou da Google Cloud consola.

gcloud

Execute o seguinte comando:

gcloud container clusters describe CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --flatten "nodePoolDefaults.nodeConfigDefaults"

Substitua o seguinte:

  • CLUSTER_NAME: o nome do cluster.
  • CONTROL_PLANE_LOCATION: a localização do plano de controlo do seu cluster.

A definição está ativada se o resultado for semelhante ao seguinte:

gcfsConfig:
  enabled: true
...

A definição está desativada se o resultado for semelhante ao seguinte:

gcfsConfig: {}
...

Consola

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

  2. Clique no nome do cluster que quer verificar.

  3. Na página Clusters, na secção Funcionalidades, junto a Streaming de imagens, é apresentado se a definição está ativada.

Ative o streaming de imagens em pools de nós

Por predefinição, os node pools herdam a definição de streaming de imagens ao nível do cluster. Pode ativar ou desativar o streaming de imagens em pools de nós específicos através da CLI gcloud.

Num novo node pool

Para criar um novo conjunto de nós com o streaming de imagens ativado, execute o seguinte comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming

Substitua o seguinte:

  • NODE_POOL_NAME: o nome do novo conjunto de nós.
  • CLUSTER_NAME: o nome do cluster para o grupo de nós.
  • CONTROL_PLANE_LOCATION: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.

Num node pool existente

Pode ativar o streaming de imagens em pools de nós existentes que cumpram os requisitos.

Para atualizar um node pool existente para usar o streaming de imagens, execute o seguinte comando:

gcloud container node-pools update POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-image-streaming

Substitua o seguinte:

  • POOL_NAME: o nome do seu node pool.
  • CLUSTER_NAME: o nome do cluster para o grupo de nós.
  • CONTROL_PLANE_LOCATION: a localização do plano de controlo do seu cluster.

A alteração da definição de streaming de imagens respeita a disponibilidade de manutenção quando é atualizada ao nível do cluster, mas não ao nível do conjunto de nós.

Esta alteração requer a recriação dos nós, o que pode causar interrupções nas suas cargas de trabalho em execução. Para ver detalhes sobre esta alteração específica, procure a linha correspondente na tabela alterações manuais que recriam os nós através de uma estratégia de atualização de nós sem respeitar as políticas de manutenção. Para saber mais sobre as atualizações de nós, consulte o artigo Planeamento de interrupções de atualizações de nós.

Verifique se o streaming de imagens está ativado num conjunto de nós

Verifique se o streaming de imagens está ativado para um conjunto de nós:

gcloud container node-pools describe POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION

Substitua o seguinte:

  • POOL_NAME: o nome do seu node pool.
  • CLUSTER_NAME: o nome do cluster para o grupo de nós.
  • CONTROL_PLANE_LOCATION: a localização do plano de controlo do seu cluster.

A definição está ativada se o resultado for semelhante ao seguinte:

gcfsConfig:
  enabled: true
...

A definição está desativada se o resultado for semelhante ao seguinte:

gcfsConfig: {}
...

Agende uma carga de trabalho através do streaming de imagens

Depois de ativar o streaming de imagens no cluster, o GKE usa automaticamente o streaming de imagens quando extrai imagens de contentores elegíveis do Artifact Registry sem precisar de configuração adicional.

O GKE adiciona a etiqueta cloud.google.com/gke-image-streaming: "true" aos nós em conjuntos de nós com o streaming de imagens ativado. No GKE Standard, se ativar ou desativar o streaming de imagens em pools de nós específicos, para que o cluster tenha uma combinação de nós que usam o streaming de imagens e nós que não o usam, pode usar seletores de nós nas suas implementações para controlar se o GKE agenda as suas cargas de trabalho em nós que usam o streaming de imagens.

No exemplo seguinte, agenda uma implementação que usa uma imagem de contentor grande num cluster com a transmissão de imagens ativada. Em seguida, pode comparar opcionalmente o desempenho com uma obtenção de imagens sem o streaming de imagens ativado.

  1. Crie um novo cluster com o streaming de imagens ativado:

    gcloud container clusters create CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-image-streaming \
        --image-type="COS_CONTAINERD"
    
  2. Obtenha credenciais para o cluster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    
  3. Guarde o seguinte manifesto como frontend-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: frontend
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: guestbook
          tier: frontend
      template:
        metadata:
          labels:
            app: guestbook
            tier: frontend
        spec:
          containers:
          - name: php-redis
            image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5
            env:
            - name: GET_HOSTS_FROM
              value: "dns"
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
            ports:
            - containerPort: 80
    

    A imagem do contentor gb-frontend tem um tamanho de 327 MB.

  4. Aplique o manifesto ao cluster:

    kubectl apply -f frontend-deployment.yaml
    
  5. Verifique se o GKE criou a implementação:

    kubectl get pods -l app=guestbook
    

    O resultado é semelhante ao seguinte:

    NAMESPACE    NAME                          READY    STATUS       RESTARTS    AGE
    default      frontend-64bcc69c4b-pgzgm     1/1      Completed    0           3s
    
  6. Obtenha o registo de eventos do Kubernetes para ver eventos de obtenção de imagens:

    kubectl get events --all-namespaces
    

    O resultado é semelhante ao seguinte:

    NAMESPACE  LAST SEEN  TYPE    REASON          OBJECT                                                 MESSAGE
    default    11m        Normal  Pulling         pod/frontend-64bcc69c4b-pgzgm                          Pulling image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5"
    default    11m        Normal  Pulled          pod/frontend-64bcc69c4b-pgzgm                          Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 1.536908032s
    default    11m        Normal  ImageStreaming  node/gke-riptide-cluster-default-pool-f1552ec4-0pjv    Image us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5 is backed by image streaming.
    ...
    

    Neste resultado:

    • O evento Pulled mostra o tempo necessário para o streaming de imagens obter a imagem.
    • O evento ImageStreaming mostra que o nó usa o streaming de imagens para publicar a imagem do contentor.

Compare o desempenho com as obtenções de imagens padrão

Neste exemplo opcional, cria um novo cluster com o streaming de imagens desativado e implementa a implementação para comparar o desempenho com o streaming de imagens.frontend

  1. Crie um novo cluster com a transmissão de imagens desativada:

    gcloud container clusters create CLUSTER2_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --image-type="COS_CONTAINERD"
    
  2. Obtenha credenciais para o cluster:

    gcloud container clusters get-credentials CLUSTER2_NAME \
        --location=CONTROL_PLANE_LOCATION
    
  3. Implemente a frontend implementação do exemplo anterior:

    kubectl apply -f frontend-deployment.yaml
    
  4. Obtenha o registo de eventos do Kubernetes:

    kubectl get events --all-namespaces
    

    O resultado é semelhante ao seguinte:

     NAMESPACE  LAST SEEN  TYPE    REASON     OBJECT                             MESSAGE
     default    87s        Normal  Pulled     pod/frontend-64bcc69c4b-qwmfp      Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 23.929723476s
    

    Repare no tempo que o GKE demorou a extrair a imagem completa. Neste exemplo de saída, o GKE precisou de quase 24 segundos. Com o streaming de imagens ativado, o GKE só precisou de 1,5 segundos para extrair os dados de imagem de que a carga de trabalho precisava para ser iniciada.

Limpar

Para evitar cobranças, elimine os clusters que criou nos exemplos anteriores:

gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME \
    --location=CONTROL_PLANE_LOCATION

Substitua o seguinte:

  • CLUSTER_NAME: o nome do seu primeiro cluster.
  • CLUSTER2_NAME: o nome do seu segundo cluster.
  • CONTROL_PLANE_LOCATION: a localização do plano de controlo dos clusters.

Desative o streaming de imagens

Se usar o GKE Autopilot, não pode desativar o streaming de imagens em clusters individuais. Pode desativar a API Container File System, o que desativa o streaming de imagens para todo o projeto.

Se usar clusters padrão do GKE, pode desativar a transmissão de imagens em clusters individuais ou pools de nós específicos, conforme descrito nas secções seguintes.

Desative o streaming de imagens num cluster padrão do GKE

Pode desativar o streaming de imagens em clusters padrão do GKE existentes através da CLI gcloud ou da Google Cloud consola.

gcloud

Para desativar o streaming de imagens num cluster existente, execute o seguinte comando:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-image-streaming

Substitua o seguinte:

  • CLUSTER_NAME: o nome do cluster.
  • CONTROL_PLANE_LOCATION: a localização do plano de controlo do seu cluster.

Consola

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

  2. Clique no nome do cluster que quer modificar.

  3. Na página Clusters, em Funcionalidades, clique em junto a Streaming de imagens.

  4. Na caixa de diálogo Editar streaming de imagens, desmarque a caixa de verificação Ativar streaming de imagens.

  5. Clique em Guardar alterações.

A alteração da definição de streaming de imagens respeita a disponibilidade de manutenção quando é atualizada ao nível do cluster, mas não ao nível do conjunto de nós.

Esta alteração requer a recriação dos nós, o que pode causar interrupções nas suas cargas de trabalho em execução. Para ver detalhes acerca desta alteração específica, encontre a linha correspondente na tabela alterações manuais que recriam os nós através de uma estratégia de atualização de nós e respeitam as políticas de manutenção. Para saber mais sobre as atualizações de nós, consulte o artigo Planeamento de interrupções de atualizações de nós.

Num novo node pool

Para desativar o streaming de imagens quando cria um novo conjunto de nós, especifique a flag --no-enable-image-streaming, como no seguinte comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-image-streaming

Num node pool existente

Para desativar o streaming de imagens num conjunto de nós existente, execute o seguinte comando:

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-image-streaming

Substitua o seguinte:

  • NODE_POOL_NAME: o nome do seu node pool.
  • CLUSTER_NAME: o nome do cluster para o grupo de nós.
  • CONTROL_PLANE_LOCATION: a localização do plano de controlo do seu cluster.

A alteração da definição de streaming de imagens respeita a disponibilidade de manutenção quando é atualizada ao nível do cluster, mas não ao nível do conjunto de nós.

Esta alteração requer a recriação dos nós, o que pode causar interrupções nas suas cargas de trabalho em execução. Para ver detalhes sobre esta alteração específica, procure a linha correspondente na tabela alterações manuais que recriam os nós através de uma estratégia de atualização de nós sem respeitar as políticas de manutenção. Para saber mais sobre as atualizações de nós, consulte o artigo Planeamento de interrupções de atualizações de nós.

Reserva de memória para streaming de imagens

O GKE reserva recursos de memória para o streaming de imagens, além da memória reservada para a execução dos componentes do sistema do nó. O GKE não reserva recursos de CPU adicionais para o streaming de imagens. Nos clusters padrão do GKE, esta reserva altera os recursos de memória que estão disponíveis para pedir nos seus pods. No GKE Autopilot, o GKE gere as atribuições do sistema, pelo que não existe qualquer impacto no agendamento das suas cargas de trabalho.

Para ver detalhes sobre as reservas de memória que o GKE faz para os componentes dos nós, consulte o artigo Arquitetura de cluster padrão.

Em nós que usam o streaming de imagens, o GKE faz as seguintes reservas de memória adicionais para novas reservas:

  • Sem memória adicional para máquinas com menos de 1 GiB de memória
  • 1% dos primeiros 4 GiB de memória
  • 0,8% dos 4 GiB seguintes de memória (até 8 GiB)
  • 0,4% dos 8 GiB seguintes de memória (até 16 GiB)
  • 0,24% dos 112 GiB seguintes de memória (até 128 GiB)
  • 0,08% de qualquer memória acima de 128 GiB

Resolução de problemas

As secções seguintes oferecem conselhos sobre a resolução de problemas do streaming de imagens. Para obter aconselhamento sobre a resolução de problemas de obtenção de imagens padrão, consulte o artigo Resolva problemas de obtenção de imagens.

O GKE não usa o sistema de ficheiros de streaming de imagens

Se o registo de eventos do GKE não mostrar os eventos de streaming de imagens, a sua imagem não é suportada pelo sistema de ficheiros remoto. Se o GKE tiver extraído anteriormente a imagem no nó, este é o comportamento esperado porque o GKE usa a cache local da imagem para extrações subsequentes em vez de usar o streaming de imagens. Pode verificar esta situação procurando Container image IMAGE_NAME already present on machine no campo Message do evento Pod Pulled.

Se não vir o evento de streaming de imagens durante a primeira obtenção de imagens no nó, certifique-se de que cumpre os requisitos para o streaming de imagens. Se cumprir os requisitos, pode diagnosticar o problema verificando os registos do serviço de streaming de imagens (denominado gcfsd):

  1. Aceda à página Explorador de registos na Google Cloud consola:

    Aceda ao Explorador de registos

  2. No campo Consulta, especifique a seguinte consulta:

    logName="projects/PROJECT_ID/logs/gcfsd"
    resource.labels.cluster_name="CLUSTER_NAME"
    

    Substitua o seguinte:

    • PROJECT_ID: o nome do seu projeto.
    • CLUSTER_NAME: o nome do seu cluster.
  3. Clique em Executar consulta.

Também pode verificar os registos gcfsd através do Explorador de registos:

  1. Aceda ao Explorador de registos na Google Cloud consola:

    Aceda ao Explorador de registos

  2. No campo Consulta, especifique a seguinte consulta:

    logName="projects/PROJECT_ID/logs/gcfsd"
    

    Substitua PROJECT_ID pelo ID do seu Google Cloud projeto.

PermissionDenied

Se os registos gcfsd apresentarem uma mensagem de erro semelhante à seguinte, o nó não tem o âmbito da API correto. O GKE extrai imagens de contentores para cargas de trabalho sem usar o streaming de imagens.

level=fatal msg="Failed to create a Container File System client: rpc error:
code = PermissionDenied desc = failed to probe endpoint: rpc error: code = PermissionDenied
desc = Request had insufficient authentication scopes."

Pode corrigir este problema concedendo o âmbito correto ao nó para lhe permitir usar o streaming de imagens. Adicione o âmbito devstorage.read_only ao cluster ou ao conjunto de nós, de forma semelhante ao seguinte comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming \
    --scopes="https://www.googleapis.com/auth/devstorage.read_only"

FailedPrecondition

Se vir uma mensagem de erro com code = FailedPrecondition, significa que a imagem não foi importada para o sistema de ficheiros remoto de streaming de imagens.

Pode reparar neste erro se tiver tentado usar o streaming de imagens com um conjunto de nós existente. Se um nó no conjunto de nós já tiver a imagem do contentor no disco, o GKE usa a imagem local em vez de usar o streaming de imagens para obter a imagem.

Para corrigir este problema, experimente o seguinte:

  • Aguarde alguns minutos e tente implementar novamente a sua carga de trabalho.
  • Adicionar novos nós ou um novo conjunto de nós e agendar a carga de trabalho nesses nós.

InvalidArgument

Se vir uma mensagem de erro com code=InvalidArgument, significa que a imagem do contentor usada pela sua carga de trabalho não é elegível para o streaming de imagens. Certifique-se de que a imagem cumpre os requisitos. Se a sua imagem não estiver no Artifact Registry, experimente migrar para o Artifact Registry.

backend.FileContent failed

O seguinte erro pode aparecer ao ler ficheiros de contentores com a transmissão de imagens ativada:

level=error msg="backend.FileContent failed" error="rpc error: code = ResourceExhausted desc = Quota exceeded for quota metric 'Content requests per project per region' and limit 'Content requests per project per region per minute per region' of service 'containerfilesystem.googleapis.com' for consumer 'project_number:PROJECT_NUMBER'." layer_id="sha256:1234567890" module=gcfs_backend offset=0 path=etc/passwd size=4096

Este erro indica que o projeto excedeu a quota necessária para ler ficheiros do serviço de sistema de ficheiros do contentor remoto. Para ajudar a resolver este problema, peça um ajuste da quota para aumentar os seguintes valores de quota:

  • Solicitações de conteúdo por projeto por região por minuto por região
  • Solicitações de conteúdo por projeto por região

O GKE transfere a imagem sem transmitir os dados

As imagens de contentores que usam chaves de encriptação geridas pelo cliente (CMEK) só são elegíveis para streaming de imagens na versão 1.25.3-gke.1000 ou posterior do GKE. As imagens de contentores com camadas duplicadas não são elegíveis para a transmissão em fluxo de imagens. Consulte as Limitações para mais informações.

Verificar se existem camadas vazias ou duplicadas

Para verificar se a imagem do contentor tem camadas vazias ou duplicadas, execute o seguinte comando:

docker inspect IMAGE_NAME

Substitua IMAGE_NAME pelo nome da imagem do contentor.

Na saída do comando, inspecione as entradas em "Layers".

Se uma das entradas corresponder exatamente à seguinte"sha256" saída, a imagem do contentor tem uma camada vazia e não é elegível para o streaming de imagens.

"Layers": [
  ...
  "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4",
  ...
]

Se existirem entradas duplicadas, como no exemplo seguinte, a imagem do contentor tem camadas duplicadas e não é elegível para streaming de imagens.

"Layers": [
  "sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
  ...
  "sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
  ...
]

O comando mv e as chamadas do sistema renameat2 falham em ficheiros de links simbólicos

Para nós do GKE com a versão 1.25 e posteriores, quando o streaming de imagens está ativado, o comando mv e a chamada do sistema renameat2 podem falhar em ficheiros de links simbólicos em imagens de contentores com a mensagem de erro "No such device or address" (Nenhum dispositivo ou endereço). O problema é causado por uma regressão em kernels Linux recentes.

Estas chamadas do sistema não são comuns, pelo que a maioria das imagens não é afetada por este problema. Normalmente, o problema ocorre nas fases de inicialização do contentor quando uma aplicação está a ser preparada para ser executada e mover ficheiros. Não é possível testar a imagem localmente, pelo que o GKE recomenda a utilização do streaming de imagens em ambientes de teste para encontrar o problema antes de a imagem ser usada em produção.

A correção está disponível nas seguintes versões de patch do GKE:

  • 1.25: 1.25.14-gke.1351000 e posterior
  • 1.26: 1.26.9-gke.1345000 e posterior
  • 1.27: 1.27.6-gke.100 e posterior
  • 1.28: 1.28.1-gke.1157000 e posterior

Em alternativa, para mitigar este problema em todas as cargas de trabalho afetadas, pode tentar substituir o código que leva à chamada do sistema renameat2. Se não conseguir modificar o código, tem de desativar o streaming de imagens no conjunto de nós para mitigar o problema.

O que se segue?