Por que meus contêineres não são iniciados?

Você nota um ou mais dos problemas a seguir:

  • Os nós do trabalhador não conseguem criar novos pods. Os pods são implementados com sucesso nos nós do trabalhador, mas os contêineres estão presos no estado ContainerCreating.

  • Ao executar oc describe pod <pod> para um pod no estado ContainerCreating, você vê um evento semelhante a um dos eventos a seguir.

    Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "XXX": failed to request 1 IPv4 addresses. IPAM allocated only 0
    
    desc = failed to create pod network sandbox ... error adding container to network "k8s-pod-network": cannot allocate new block due to per host block limit
    
  • Ao executar o comando a seguir, um ou mais pods do calico-node não conseguem iniciar em um nó de trabalho e ficam no estado CrashLoopBackOff.

    oc logs -n calico-system <calico-node_pod>
    

    As últimas linhas dos registros contêm a seguinte mensagem:

    Unable to autoassign an address - pools are likely exhausted. type="ipipTunnelAddress"
    

Se você não vir nenhuma das mensagens relacionadas ao endereço IP que estão listadas nos sintomas, seus contêineres poderão não iniciar porque a cota de registro foi atingida.

Se você recebeu uma das mensagens relacionadas ao endereço IP listadas nos sintomas, é possível que seus contêineres não sejam iniciados porque o gerenciador de endereço IP (IPAM) do plug-in do Calico detecta incorretamente que todos os endereços IP de pod no cluster estão em uso. Como o IPAM do Calico não detecta nenhum endereço IP disponível, ele não designa endereços IP a novos pods no cluster e os pods não podem ser iniciados.

Corrigindo problemas de cota de registro

Nuvem privada virtual Infraestrutura clássica

Para corrigir problemas de cotas de registro, libere o armazenamento no IBM Cloud Container Registry.

Corrigindo problemas de endereço IP

Nuvem privada virtual Infraestrutura clássica

Para corrigir problemas de endereço IP, libere endereços IP individuais e em bloco que não foram removidos corretamente dos registros do IPAM do Calico para que eles sejam reutilizados por pods em seu cluster.

Seu cluster deve executar uma versão suportada. Se o seu cluster estiver executando uma versão obsoleta ou sem suporte, atualize-o primeiro.

Etapa 1: liberando os endereços IP individuais

Primeiro, confira e libere os endereços IP individuais que não foram removidos corretamente dos registros do IPAM do Calico para que eles sejam reutilizados por pods em seu cluster.

  1. Siga as etapas em Instalando e configurando a CLI do Calico para fazer download da versão 3.18 ou mais recente do cliente calicoctl, usar a configuração correta do Calico para o cluster e verificar se ela está funcionando corretamente para o cluster desejado. Observe que, mesmo que seu cluster execute uma versão mais antiga do Calico, você ainda pode usar a versão 3.18 do calicoctl para executar os comandos nas etapas a seguir.

  2. Verifique se há endereços IP que estão incorretamente detectados como em uso pelo IPAM do Calico.

    calicoctl ipam check
    
  3. Na saída, procure a seção que contém a linha Scanning for IPs that are allocated but not actually in use.... Se os endereços IP forem alocados no IPAM, mas não estiverem realmente em uso, continue na próxima etapa para liberá-los. Nesta saída de exemplo, 181 endereços IP podem ser liberados.

    ...
    Scanning for IPs that are allocated but not actually in use...
    Found 181 IPs that are allocated in IPAM but not actually in use.
    Scanning for IPs that are in use by a workload or node but not allocated in IPAM...
    Found 0 in-use IPs that are not in active IP pools.
    Found 0 in-use IPs that are in active IP pools but have no corresponding IPAM allocation.
    Check complete; found 181 problems.
    
  4. Libere os endereços IP do IPAM do Calico que foram designados anteriormente a um terminal de pod. Note que depois de bloquear o armazenamento de dados nas etapas a seguir, os pods existentes continuam em execução, mas quaisquer pods criados permanecem no estado ContainerCreating e não podem ser iniciados até o desbloqueio do armazenamento de dados. Este bloqueio do armazenamento de dados garante que os registros do IPAM não sejam modificados enquanto você libera endereços IP. Para obter mais informações, consulte a Documentação do software livre Calico.

    1. Bloqueie o armazenamento de dados para os registros IPMA do Calico.
        calicoctl datastore migrate lock
        ```
    2. Salve os resultados da verificação do IPAM.
    ```sh {: pre}
        calicoctl ipam check -o report.json
        ```
    3. Libere os endereços IP não utilizados. Esse processo pode ser executado por até 20 minutos dependendo de quantos endereços IP devem ser liberados.
    ```sh {: pre}
        calicoctl ipam release --from-report=report.json
        ```
    4. Desbloqueia a loja de dados.
    ```sh {: pre}
        calicoctl datastore migrate unlock
        ```
    5. Verifique se todos os endereços IP não usados estão liberados.
    ```sh {: pre}
        calicoctl ipam check
        ```
        Saída de exemplo
    
        ```sh {: screen}
        Check complete; found 0 problems.
        ```
    
  5. Opcional: para verificar se o armazenamento de dados foi desbloqueado com sucesso e se os endereços IP agora estão disponíveis para designação, crie um pod e verifique se ele é iniciado corretamente.

    1. Por exemplo, crie um pod NGINX simples.
        oc run test --image=nginx --generator=run-pod/v1
        ```
    2. Verifique se o pod tem um endereço IP e está sendo executado com sucesso.
    ```sh {: pre}
        oc get po test
        ```
    3. Excluir o pod de teste.
    ```sh {: pre}
        oc delete pod test
        ```
    
  6. Continue na próxima seção para verificar blocos de endereços IP não utilizados.

Etapa 2: liberando blocos de endereços IP

Em seguida, confira e limpe blocos inteiros de endereços IP designados a um nó do trabalhador, mas que não são usados por ele.

Ocasionalmente, quando um nó do trabalhador é designado a um segundo ou terceiro bloco de endereços IP, é possível que blocos inteiros de endereços IP que ele usava anteriormente fiquem completamente inutilizados mais tarde. Além disso, ao remover ou substituir um nó do trabalhador, a limpeza do bloco de endereço IP pelo IPAM do Calico pode falhar devido à falta de um nó do trabalhador para os calico-kube-controllers serem executados temporariamente ou devido a problemas com o plug-in do CNI ou o tempo de execução containerd quando o nó do trabalhador é removido ou substituído.

É importante garantir que os blocos de IPs estejam liberados para todos os clusters clássicos que executam o Kubernetes versão 1.19 ou mais recente e todos os clusters VPC. Nesses clusters, a configuração strictAffinity do Calico é definida como true, o que força um nó do trabalhador a usar somente endereços IP que são de seus blocos de IP designados, não de blocos designados a outros nós. Com o tempo, os blocos designados aos nós, mas que não são usados, podem se acumular até que nenhum outro bloco de endereços IP possa ser designado aos nós do trabalhador.

  1. Siga as etapas para liberar endereços IP individuais.

  2. Escolha se você deseja bloquear o armazenamento de dados para os registros do IPAM do Calico.

    • Se você bloquear o armazenamento de dados, os pods existentes continuarão em execução, mas quaisquer pods criados permanecerão no estado ContainerCreating e não poderão ser iniciados até o desbloqueio do armazenamento de dados. Esse bloqueio de armazenamento de dados assegura que os pods não possam ser criados após a verificação de blocos não usados, mas antes da liberação dos blocos.
    • Se não bloquear o armazenamento de dados, você deverá verificar imediatamente se nenhum novo pod usou endereços IP de um bloco liberado que você excluiu.
    calicoctl datastore migrate lock
    
  3. Liste os registros do IPAM do Calico. Na saída, procure blocos que tenham 0 IPS IN USE, o que indica que o bloco não é usado por seu nó do trabalhador designado.

    calicoctl ipam show --show-blocks
    

    Nesta saída de exemplo, o bloco 172.24.10.64/26 não tem endereços IP em uso.

    ...
    Block    | 172.24.10.64/26  |        64 | 0 (0%)     | 64 (100%)  |
    ...
    
  4. Siga estas etapas para liberar cada um desses blocos.

    1. Verifique se nenhum pod usa atualmente um endereço IP do bloco.
        oc get pods -A
        ```
    2. Obtenha o `BlockAffinity` do bloco. Substitua os pontos finais e a barra no bloco por hifens (-). Por exemplo, para o bloco `172.24.10.64/26`, o formato para o comando a seguir é `172-24-10-64-26`.
    ```sh {: pre}
        oc get blockaffinity | grep <block>
        ```
    3. Exclua o `BlockAffinity`.
    ```sh {: pre}
        oc delete blockaffinity <block_affinity>
        ```
    4. Obtenha o `IPAMBlock` do bloco. Substitua os pontos finais e a barra no bloco por hifens (-). Por exemplo, para o bloco `172.24.10.64/26`, o formato para o comando a seguir é `172-24-10-64-26`.
    ```sh {: pre}
        oc get ipamblock | grep <block>
        ```
    5. Exclua o `IPAMBlock`.
    ```sh {: pre}
        oc delete ipamblock <ipam_block>
        ```
    6. Se você não tiver bloqueado o armazenamento de dados na etapa 2: verifique se nenhum pod foi criado diretamente antes da exclusão do `BlockAffinity` e `IPAMBlock`. Se pods foram criados, exclua o `BlockAffinity` e o `IPAMBlock` desse bloco novamente. Em seguida, exclua quaisquer pods que utilizem um endereço IP neste bloco executando `oc delete pod <pod>`, assim, o pod é recriado com um endereço IP de um bloco diferente.
    ```sh {: pre}
        oc get pods -A
        ```
    7. Repita essas etapas para quaisquer outros blocos que tenham 0 `IPS IN USE`.
    
    
  5. Se você tiver bloqueado o armazenamento de dados na etapa 2: desbloqueie-o.

    calicoctl datastore migrate unlock