IBM Cloud Docs
¿Por qué mis contenedores no se inician?

¿Por qué mis contenedores no se inician?

Observe uno o varios de los problemas siguientes:

  • Los nodos trabajadores no pueden crear nuevos pods. Los pods se despliegan correctamente en los nodos trabajadores, pero los contenedores se atascan en el estado ContainerCreating.

  • Cuando ejecuta oc describe pod <pod> para un pod con el estado ContainerCreating, verá un suceso similar a uno de los sucesos siguientes.

    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
    
  • Al ejecutar el siguiente comando, uno o más de los pods ' calico-node ' no se inician en un nodo trabajador y se encuentran en el estado ' CrashLoopBackOff.

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

    Las últimas líneas de los registros contienen el siguiente mensaje:

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

Si no ve ninguno de los mensajes relacionados con la dirección IP listados en los síntomas, es posible que los contenedores no se inicien porque se ha alcanzado la cuota de registro.

Si ve alguno de los dos mensajes relacionados con la dirección IP que se listan en los síntomas, es posible que los contenedores no se inicien porque el gestor de direcciones IP (IPAM) para el plugin de Calico detecta incorrectamente que se están utilizando todas las direcciones IP de pod del clúster. Como Calico IPAM no detecta direcciones IP disponibles, no asigna direcciones IP a los nuevos pods del clúster, y los pods no pueden iniciarse.

Cómo solucionar los problemas de cuota de registro

Virtual Private Cloud Infraestructura clásica

Para solucionar los problemas de cuota de registro, libere almacenamiento en IBM Cloud Container Registry.

Cómo solucionar los problemas de direcciones IP

Virtual Private Cloud Infraestructura clásica

Para solucionar problemas de direcciones IP, libere direcciones IP individuales y bloques de direcciones IP que no se hayan eliminado completamente de los registros de IPAM de Calico para que los pods del clúster las puedan reutilizar.

El clúster debe ejecutar una versión soportada. Si su cluster ejecuta una versión obsoleta o no soportada, primero ' actualice su clúster.

Paso 1: Liberar direcciones IP individuales

En primer lugar, consulte y libere las direcciones IP individuales que no se hayan eliminado completamente de los registros de IPAM de Calico para que los pods del clúster las puedan reutilizar.

  1. Siga los pasos de Instalación y configuración de la CLI de Calico para descargar la versión 3.18 o posterior del cliente de calicoctl, utilice la configuración de Calico correcta para el clúster y verifique que la configuración de Calico funciona correctamente para el clúster de destino. Tenga en cuenta que incluso si su clúster ejecuta una versión anterior de Calico, todavía puede utilizar ' calicoctl versión 3.18 para ejecutar los comandos en los siguientes pasos.

  2. Compruebe si hay direcciones IP que el IPAM de Calico haya detectado incorrectamente como en uso.

    calicoctl ipam check
    
  3. En la salida, busque la sección que contiene la línea Scanning for IPs that are allocated but not actually in use.... Si las direcciones IP están asignadas en IPAM, pero realmente no se utilizan, continúe en el paso siguiente para liberarlas. En esta salida de ejemplo, se pueden liberar 181 direcciones IP.

    ...
    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 las direcciones IP del IPAM de Calico que estaban asignadas anteriormente a un punto final de pod. Tenga en cuenta que después de bloquear el almacén de datos en los pasos siguientes, los pods existentes continúan ejecutándose, pero los pods que se crean permanecen en el estado ContainerCreating y no pueden iniciarse hasta que se desbloquee el almacén de datos. Este bloqueo de almacén de datos garantiza que los registros de IPAM no se modifican al liberar las direcciones IP. Para más información, consulte la documentación de código abiertoCalico.

    1. Bloquee el almacén de datos para los registros de IPAM de Calico.

      calicoctl datastore migrate lock
      
    2. Guarde los resultados de la comprobación de IPAM.

      calicoctl ipam check -o report.json
      
    3. Libere las direcciones IP no utilizadas. Este proceso puede ejecutarse durante hasta 20 minutos dependiendo de la cantidad de direcciones IP que se deban liberar.

      calicoctl ipam release --from-report=report.json
      
    4. Desbloquee el almacén de datos.

      calicoctl datastore migrate unlock
      
    5. Verifique que se hayan liberado todas las direcciones IP no utilizadas.

      calicoctl ipam check
      

      Salida de ejemplo

      Check complete; found 0 problems.
      
  5. Opcional: para verificar que el almacén de datos se ha desbloqueado correctamente y que las direcciones IP están ahora disponibles para su asignación, cree un pod y compruebe que se inicia correctamente.

    1. Por ejemplo, cree un pod NGINX simple.
      oc run test --image=nginx --generator=run-pod/v1
      
    2. Verifique que el pod tiene una dirección IP y se ejecuta correctamente.
      oc get po test
      
    3. Suprima el pod de prueba.
      oc delete pod test
      
  6. Continúe con la sección siguiente para comprobar si hay bloques de direcciones IP no utilizados.

Paso 2: Liberar bloques de direcciones IP

A continuación, consulte y limpie bloques completos de direcciones IP que estén asignados a un nodo trabajador, pero que el nodo trabajador no utilice.

En ocasiones, cuando a un nodo trabajador se le asigna un segundo o tercer bloque de direcciones IP, bloques completos de direcciones IP que el nodo trabajador utilizaba anteriormente podrían pasar a estar completamente inutilizados. Además, cuando se elimina o sustituye un nodo trabajador, la limpieza del bloque de direcciones IP que realiza IPAM de Calico podria fallar debido a la falta de un nodo trabajador en el que se ejecuten temporalmente los controladores de calico-kube-controllers o debido a problemas con el plugin de CNI o el tiempo de ejecución de containerd cuando se elimina o se sustituye el nodo trabajador.

Asegurarse de que los bloques de IP están libres es especialmente importante para todos los clústeres clásicos que ejecutan Kubernetes versión 1.19 o posteriores y todos los clústeres de VPC. En estos clústeres, el valor de strictAffinity de Calico se establece en true, lo que fuerza a un nodo trabajador a utilizar direcciones IP que son solo de sus bloques de IP asignados, a diferencia de utilizar direcciones IP de bloques asignados a otros nodos trabajadores. Con el tiempo, los bloques asignados a los nodos, pero que no se utilizan, se pueden acumular hasta que no se puedan asignar más bloques de direcciones IP a los nodos trabajadores.

  1. Siga los pasos para liberar direcciones IP individuales.

  2. Elija si desea bloquear el almacén de datos para los registros de IPAM de Calico.

    • Si bloquea el almacén de datos, los pods existentes continúan ejecutándose, pero los pods que se crean permanecen en el estado ContainerCreating y no pueden iniciarse hasta que se desbloquee el almacén de datos. Este bloqueo del almacén de datos garantiza que no se puedan crear pods después de comprobar los bloques no utilizados, antes de liberarlos.
    • Si no bloquea el almacén de datos, debe verificar de inmediato que no haya nuevos pods que utilicen direcciones IP de un bloque liberado que haya suprimido.
    calicoctl datastore migrate lock
    
  3. Liste los registros de IPAM de Calico. En la salida, busque bloques que tengan 0 IPS IN USE, lo que indica que el nodo trabajador asignado no utiliza el bloque.

    calicoctl ipam show --show-blocks
    

    En esta salida de ejemplo, el bloque 172.24.10.64/26 no tiene direcciones IP en uso.

    ...
    Block    | 172.24.10.64/26  |        64 | 0 (0%)     | 64 (100%)  |
    ...
    
  4. Para cada uno de estos bloques, complete los pasos siguientes para liberar el bloque.

    1. Verifique que ningún pod utiliza actualmente una dirección IP del bloque.
      oc get pods -A
      
    2. Obtenga la BlockAffinity para el bloque. Sustituya los puntos y la barra inclinada en el bloque por guiones (-). Por ejemplo, para el bloque 172.24.10.64/26, el formato del mandato siguiente es 172-24-10-64-26.
      oc get blockaffinity | grep <block>
      
    3. Suprima el BlockAffinity.
      oc delete blockaffinity <block_affinity>
      
    4. Obtenga la IPAMBlock para el bloque. Sustituya los puntos y la barra inclinada en el bloque por guiones (-). Por ejemplo, para el bloque 172.24.10.64/26, el formato del mandato siguiente es 172-24-10-64-26.
      oc get ipamblock | grep <block>
      
    5. Suprima el IPAMBlock.
      oc delete ipamblock <ipam_block>
      
    6. Si no ha bloqueado el almacén de datos en el paso 2: Compruebe que no se hayan creado pods directamente antes de suprimir BlockAffinity e IPAMBlock. Si se han creado pods, debe volver a suprimir BlockAffinity e IPAMBlock para este bloque. A continuación, suprima los pods que utilicen una dirección IP en este bloque ejecutando oc delete pod <pod>, para que el pod se vuelva a crear con una dirección IP de un bloque distinto.
      oc get pods -A
      
    7. Repita estos pasos para cualquier otro bloque que tenga 0 IPS IN USE.
  5. Si ha bloqueado el almacén de datos en el paso 2: Desbloquee el almacén de datos.

    calicoctl datastore migrate unlock