Imágenes en containerd


En esta página, se proporciona información adicional sobre el uso de Container-Optimized OS con Containerd (cos_containerd) y Ubuntu con Containerd (ubuntu_containerd) en nodos de Google Kubernetes Engine (GKE). Las imágenes cos_containerd y ubuntu_containerd te permiten usar Containerd como el entorno de ejecución del contenedor en tu clúster de GKE. En los clústeres de Autopilot, cos_containerd es el único tipo de imagen compatible.

Acerca de Containerd

El entorno de ejecución del contenedor es software que se encarga de ejecutar contenedores y abstrae la administración de contenedores para Kubernetes. Hay diferentes entornos de ejecución de contenedores. Containerd es un entorno de ejecución del contenedor estándar de la industria que es compatible con Kubernetes y que usan muchos otros proyectos. Containerd proporciona la abstracción de capas que permite la implementación de un amplio conjunto de funciones como gVisor para extender la funcionalidad de Kubernetes. Containerd se considera más eficiente y seguro de recursos en comparación con el entorno de ejecución de Docker.

Usa imágenes de Containerd en clústeres de GKE

Puedes seleccionar cos_containerd o ubuntu_containerd como el tipo de imagen cuando crees un clúster de GKE nuevo, cuando crees un grupo de nodos nuevo en un clúster existente o cuando actualices un clúster existente. Ambas imágenes de Containerd requieren la versión de GKE 1.14.3 o alguna posterior.

Verifica el tipo de imagen de nodo

Puedes verificar qué tipo de imagen se usa para los nodos existentes mediante Google Cloud Console, la herramienta de gcloud o kubectl. Además, consulta la secuencia de comandos de migración de muestra de este documento, que itera en todos los grupos de nodos y genera las migraciones sugeridas de grupos de nodos.

Console

  1. En Cloud Console, ve a la página Google Kubernetes Engine.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haz clic en el nombre del clúster que deseas verificar.

  3. Selecciona la pestaña Nodos.

  4. En la sección Grupos de nodos, consulta el valor en la columna Tipo de imagen.

gcloud

Ejecuta el siguiente comando, reemplazando CLUSTER_NAME por el nombre del clúster:

gcloud container node-pools list \
    --cluster CLUSTER_NAME \
    --format="table(name,version,config.imageType)"

El resultado es similar al siguiente:

NAME          NODE_VERSION    IMAGE_TYPE
default-pool  1.19.6-gke.600  UBUNTU_CONTAINERD

Consulta la documentación de la API de gcloud container node-pools list para obtener más información.

kubectl

Ejecuta el siguiente comando kubectl get nodes:

kubectl get nodes -o wide

El resultado es similar al siguiente:

# For Docker runtime
NAME         STATUS   VERSION             OS-IMAGE                             CONTAINER-RUNTIME
gke-node-1   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1
gke-node-2   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1
gke-node-3   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1
# For Containerd runtime
NAME         STATUS   VERSION           OS-IMAGE                             CONTAINER-RUNTIME
gke-node-1   Ready    v1.19.6-gke.600   Container-Optimized OS from Google   containerd://1.4.1
gke-node-2   Ready    v1.19.6-gke.600   Container-Optimized OS from Google   containerd://1.4.1
gke-node-3   Ready    v1.19.6-gke.600   Container-Optimized OS from Google   containerd://1.4.1

La columna CONTAINER-RUNTIME muestra el entorno de ejecución y su versión.

Migra del entorno de ejecución de Docker al entorno de ejecución de Containerd

La mayoría de las cargas de trabajo de usuarios no tienen una dependencia del entorno de ejecución del contenedor. El entorno de ejecución del contenedor es lo que ejecuta los contenedores en tus Pods, y el entorno de ejecución de Docker en realidad usa Containerd de forma interna, por lo que ambos entornos de ejecución se comportan de manera similar.

Incluso si usas Docker en tu máquina de desarrolladores o como parte de una canalización de compilación que se ejecuta fuera del clúster para compilar y enviar las imágenes, esto no es una dependencia en el entorno de ejecución de Docker (debido a que estas acciones suceden fuera del clúster).

Hay algunas instancias en las que puedes tener una dependencia en Docker: ejecutar pods privilegiados con la ejecución de comandos de Docker y ejecutar secuencias de comandos en nodos fuera de la infraestructura de Kubernetes (por ejemplo, usar ssh para solucionar problemas), o a través de herramientas de terceros que realizan operaciones con privilegios similares. También puedes tener una dependencia indirecta en Docker si algunas de tus herramientas se configuraron para reaccionar a mensajes de registro específicos de Docker en tu sistema de supervisión.

Puedes obtener información sobre las posibles dependencias en el entorno de ejecución de Docker en Migra desde dockershim. Para confirmar la compatibilidad con Containerd, es posible que también quieras consultar con cualquier proveedor que proporcione herramientas de registro y supervisión, seguridad o herramientas de integración continua que implementes dentro de tu clúster.

Te recomendamos que primero implementes tu carga de trabajo en un grupo de nodos de prueba con Containerd para verificar que todo se ejecute según lo esperado. Si tienes un clúster en etapa de pruebas o de versión canary, te recomendamos que lo migres primero. También puedes migrar los nodos en etapas con el enfoque que se explica en Migra cargas de trabajo a diferentes tipos de máquina.

Actualiza las imágenes de tus nodos

Puedes migrar nodos de una imagen de entorno de ejecución de Docker a una imagen de Containerd si actualizas el grupo de nodos y configuras una imagen diferente. Esta migración se puede realizar con Google Cloud Console o la herramienta de gcloud.

Console

  1. En Cloud Console, ve a la página Google Kubernetes Engine.

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que deseas modificar.

  3. En la página Detalles del clúster, haz clic en la pestaña Nodos.

  4. En Grupos de nodos, haz clic en el nombre del grupo de nodos que deseas modificar.

  5. En la página de Detalles del grupo de nodos, haz clic en Editar.

  6. En la sección Nodos, en Tipo de imagen, haz clic en Cambiar.

  7. Selecciona una de las variantes de imagen de Containerd para tu sistema operativo.

  8. Haz clic en Cambiar.

gcloud

En la herramienta de gcloud, puedes actualizar un grupo de nodos con el comando gcloud container clusters upgrade y la especificación del parámetro --image-type.

Por ejemplo, para cambiar la imagen de un grupo de nodos a Container-Optimized OS con Containerd, ejecuta el siguiente comando:

gcloud container clusters upgrade CLUSTER_NAME --image-type COS_CONTAINERD \
    --node-pool POOL_NAME

Si después de actualizar tu imagen de nodo notas un problema y necesitas volver a las variantes de imagen de Docker, puedes ejecutar este mismo comando, pero selecciona una variante de imagen de Docker.

Consulta la documentación de la API de gcloud container clusters upgrade para obtener más información.

Ejecuta comandos de Docker en nodos Containerd

Si bien el objeto binario de Docker está disponible actualmente en nodos de Containerd, no recomendamos su uso después de migrar a Containerd. Docker no administra los contenedores que Kubernetes ejecuta en los nodos en Containerd, por lo que no puedes usarlo para ver o interactuar con contenedores de Kubernetes en ejecución mediante los comandos de Docker o la API de Docker.

Soluciona problemas de contenedores en nodos containerd

Para depurar o solucionar problemas en el nodo, puedes interactuar con Containerd mediante la herramienta portátil de línea de comandos creada para entornos de ejecución del contenedor de Kubernetes: crictl. crictl admite funcionalidades comunes para ver imágenes y contenedores, leer registros y ejecutar comandos en los contenedores. Consulta la guía del usuario de crictl para ver el conjunto completo de características admitidas y la información de uso.

Accede a Docker Engine desde pods privilegiados

Por el momento, algunos usuarios acceden a Docker Engine en un nodo desde Pods privilegiados. Se recomienda que actualices tus cargas de trabajo para que no dependan de forma directa de Docker. Por ejemplo, si extraes registros de aplicaciones o datos de supervisión de Docker Engine, en su lugar, considera usar los complementos del sistema GKE para el registro y la supervisión.

Compila imágenes

Containerd no admite la compilación de imágenes, porque Kubernetes no admite esa función.

Kubernetes no tiene conocimiento de los recursos del sistema usados por los procesos locales fuera del alcance de Kubernetes, y el plano de control de Kubernetes no puede dar cuenta de esos procesos cuando se asignan recursos. Esto puede privar a tus cargas de trabajo de recursos de GKE o causar inestabilidad en el nodo. Por este motivo, no se recomienda ejecutar comandos en nodos locales. Por el contrario, considera cumplir estas tareas mediante otros servicios fuera del alcance del contenedor individual, como Cloud Build o usa una herramienta como kaniko para compilar imágenes como una carga de trabajo de Kubernetes.

Si ninguna de estas sugerencias te funciona y comprendes los riesgos, puedes seguir usando Docker para crear imágenes. Debes insertar las imágenes en un registro antes de intentar usarlas en un clúster de GKE. Kubernetes no conoce las imágenes creadas de forma local.

Problemas conocidos

No hay problemas conocidos en las versiones GKE 1.19 y posteriores.

El aprovisionamiento automático de nodos solo aprovisiona Container-Optimized OS con los grupos de nodos de Docker

El aprovisionamiento automático de nodos permite el ajuste de escala automático de los grupos de nodos con cualquier tipo de imagen compatible, pero solo puede crear grupos de nodos nuevos con el tipo de imagen Container-Optimized OS con Docker.

Conflicto con el rango 172.17/16

Versiones afectadas de GKE: 1.14, 1.15, 1.16, 1.17.0 a 1.17.17-gke.2800, 1.18.0 a 1.18.14

El rango de IP 172.17/16 está ocupado por la interfaz docker0 en la VM de nodo con Containerd habilitado. Es posible que el tráfico que se envía desde de ese rango o proveniente de él no se enrute correctamente (por ejemplo, un Pod no puede conectarse a un host conectado a una VPN con una IP dentro de 172.17/16).

Las imágenes con más de 56 capas no se pueden usar en Containerd.

Versiones de GKE afectadas: 1.14, 1.15, 1.16, 1.17

Cuando la imagen tiene más de 56 capas, no se puede descargar. Se produce el siguiente error:

info.Labels: label key and value greater than maximum size (4096 bytes), key: containerd: invalid argument

Para obtener más información, consulta https://github.com/containerd/containerd/issues/4684.

Este problema está solucionado en Containerd 1.4.2. Container-Optimized OS 85 incluye esta corrección.

No se recopilan las métricas de GPU

Versiones de GKE afectadas: 1.14, 1.15, 1.16, 1.17, 1.18

Las métricas de uso de GPU no se recopilan cuando se usa Containerd como entorno de ejecución en las versiones de GKE anteriores a 1.19.

A las métricas de imagen les faltan etiquetas

Versiones afectadas de GKE: todas

Las métricas de imagen container_fs_usage_bytes y container_tasks_state no muestran etiquetas como image, container_name y el nombre namespace.

El volumen se activa con la opción noexec

Versiones afectadas de GKE: 1.14, 1.15.0 a 1.15.12-gke.17, 1.16.0 a 1.16.13-gke.400

El volumen activado en /var/lib/containerd está activado con opciones de no-exec. Esto rechaza la ejecución de cualquier ejecutable del volumen.

Pérdida del descriptor del archivo en containerd

Versiones afectadas de GKE: 1.14, 1.15, 1.16, de 1.17.0 a 1.17.12

Containerd tenía un problema conocido de fuga de eventfd en la versión v1.3.0 y superiores, y fue corregido en la versión v1.3.3. Para obtener más información, consulta https://github.com/containerd/containerd/issues/3949.

Ejemplo de secuencia de comandos de migración

La siguiente secuencia de comandos de muestra itera en todos los grupos de nodos en los proyectos disponibles y muestra la sugerencia de migrar el grupo de nodos a Containerd para cada grupo de nodos. Esta secuencia de comandos también genera la versión del grupo de nodos y el comando de migración sugerido como se muestra en la sección Actualiza tus imágenes de nodo. Asegúrate de revisar los problemas conocidos de una versión del grupo de nodos.

Secuencia de comandos de muestra: iterar en todos los grupos de nodos para la migración de contenedores

for project in  $(gcloud projects list --format="value(projectId)")
do
  echo "ProjectId:  $project"
  for clusters in $( \
    gcloud container clusters list \
      --project $project \
      --format="csv[no-heading](name,location,autopilot.enabled)")
  do
    IFS=',' read -r -a clustersArray <<< "$clusters"
    cluster_name="${clustersArray[0]}"
    cluster_zone="${clustersArray[1]}"
    cluster_isAutopilot="${clustersArray[2]}"

    if [ "$cluster_isAutopilot" = "True" ]; then
      echo "  Cluster: $cluster_name (autopilot) (zone: $cluster_zone)"
      echo "    Autopilot clusters are running Containerd."
    else
      echo "  Cluster: $cluster_name (zone: $cluster_zone)"
      for nodepools in $( \
        gcloud container node-pools list \
          --project $project \
          --cluster $cluster_name \
          --zone $cluster_zone \
          --format="csv[no-heading](name,version,config.imageType)")
      do
        IFS=',' read -r -a nodepoolsArray <<< "$nodepools"
        nodepool_name="${nodepoolsArray[0]}"
        nodepool_version="${nodepoolsArray[1]}"
        nodepool_imageType="${nodepoolsArray[2]}"

        nodepool_minorVersion=${nodepool_version:0:4}

        echo "    Nodepool: $nodepool_name, version: $nodepool_version ($nodepool_minorVersion), image: $nodepool_imageType"

        suggestedImageType="COS_CONTAINERD"

        if [ "$nodepool_imageType" = "UBUNTU" ]; then
          suggestedImageType="UBUNTU_CONTAINERD"
        fi

        tab=$'\n      ';
        nodepool_message="$tab Please update the nodepool to use Containerd."
        nodepool_message+="$tab Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues."
        nodepool_message+="$tab Run the following command to upgrade:"
        nodepool_message+="$tab "
        nodepool_message+="$tab gcloud container clusters upgrade '$cluster_name' --project '$project' --zone '$cluster_zone' --image-type '$suggestedImageType' --node-pool '$nodepool_name'"
        nodepool_message+="$tab "

        # see https://cloud.google.com/kubernetes-engine/docs/concepts/node-images
        if [ "$nodepool_imageType" = "COS_CONTAINERD" ] || [ "$nodepool_imageType" = "UBUNTU_CONTAINERD" ]; then
          nodepool_message="$tab Nodepool is using Containerd already"
        elif [ "$nodepool_imageType" = "WINDOWS_LTSC" ] || [ "$nodepool_imageType" = "WINDOWS_SAC" ]; then
          nodepool_message="$tab Containerd is not currently available for Windows nodepools"
        elif [ "$nodepool_minorVersion" \< "1.14" ]; then
          nodepool_message="$tab Upgrade nodepool to the version that supports Containerd"
        fi
        echo "$nodepool_message"
      done
    fi # not autopilot
  done
done

# Sample output:
#
# ProjectId:  my-project-id
#  Cluster: autopilot-cluster-1 (autopilot) (zone: us-central1)
#    Autopilot clusters are running Containerd.
#  Cluster: cluster-1 (zone: us-central1-c)
#    Nodepool: default-pool, version: 1.18.12-gke.1210 (1.18), image: COS
#
#       Please update the nodepool to use Containerd.
#       Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues.
#       Run the following command to upgrade:
#
#       gcloud container clusters upgrade 'cluster-1' --project 'my-project-id' --zone 'us-central1-c' --image-type 'COS_CONTAINERD' --node-pool 'default-pool'
#
#    Nodepool: pool-1, version: 1.18.12-gke.1210 (1.18), image: COS
#
#       Please update the nodepool to use Containerd.
#       Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues.
#       Run the following command to upgrade:
#
#       gcloud container clusters upgrade 'cluster-1' --project 'my-project-id' --zone 'us-central1-c' --image-type 'COS_CONTAINERD' --node-pool 'pool-1'
#
#  Cluster: another-test-cluster (zone: us-central1-c)
#    Nodepool: default-pool, version: 1.20.4-gke.400 (1.20), image: COS_CONTAINERD
#
#      Nodepool is using Containerd already
#

¿Qué sigue?

  • Obtén más información sobre la integración en Containerd en el anuncio de Kubernetes 1.11. Consulta la documentación de Containerd y los complementos de CRI si deseas obtener todavía más información.
  • Revisa la información de la migración de Dockershim en kubernetes.io.
  • Lee acerca de la baja de DockerShim de Kubernetes.
  • Obtén información para proteger tus apps con gVisor en Containerd.
  • Lee sobre los beneficios de usar Cloud Build para compilar imágenes de forma segura y confiable en Google Cloud a fin de reemplazar una solución personalizada que podría requerir Docker.