Crea y configura instancias

Hay dos formas de crear y configurar las instancias de Compute Engine que ejecutan Container-Optimized OS de Google.

Para situaciones simples en las que deseas ejecutar un solo contenedor en una VM o en cada VM en un grupo de instancias administrado, puedes especificar una imagen de contenedor y parámetros de configuración opcionales cuando definas la instancia o la plantilla de instancias. Compute Engine crea la instancia con la última versión de Container-Optimized OS y ejecuta el contenedor especificado cuando se inicia la VM.

Para situaciones avanzadas en las que puedes implementar varios contenedores y configurar las opciones de Docker con cloud-init, puedes crear una instancia de Compute Engine con tu elección de imagen de Container-Optimized OS y, luego, configurarla según sea necesario.

Cómo crear una instancia simple

Utiliza este método para implementar un solo contenedor en una VM mediante la última versión de Container-Optimized OS. Puedes realizar esta tarea con la consola de Google Cloud o gcloud CLI.

Consola

  1. Ve a la página Instancias de VM

    Ir a la página Instancias de VM

  2. Haz clic en Crear instancia.

  3. Especifica un Nombre para tu instancia.

  4. En la sección Contenedor, selecciona la casilla de verificación Implementar una imagen de contenedor para esta instancia de VM.

  5. Especifica la Imagen de contenedor que se usará.

    • Puedes especificar una imagen de Container Registry o Artifact Registry. Por ejemplo:
      • Con gcr.io/cloud-marketplace/google/nginx1:1.15, se selecciona una imagen de contenedor NGINX 1.15 de Google Cloud Marketplace.
      • Con us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0, se selecciona una imagen de muestra de hello-app de Artifact Registry.
    • Si usas una imagen de contenedor de Docker Hub, especifica siempre el nombre completo de la imagen de Docker. Por ejemplo, especifica el siguiente nombre de imagen para implementar una imagen de contenedor de Apache: docker.io/httpd:2.4.
  6. De manera opcional, haz clic en Opciones avanzadas de contenedor. Para obtener más información, consulta la página Configura opciones para ejecutar tu contenedor.

  7. Haz clic en Crear para crear la instancia, iniciar la instancia y ejecutar el contenedor.

gcloud

Para crear una instancia de VM simple, ejecuta el siguiente comando:

gcloud compute instances create-with-container instance-name \
    --container-image image-name

Reemplaza lo siguiente:

  • instance-name por el nombre de la instancia nueva
  • image-name por el nombre de la imagen de contenedor

Por ejemplo, el siguiente comando crea una nueva instancia de VM llamada nginx-vm, que iniciará y ejecutará la imagen de contenedor gcr.io/cloud-marketplace/google/nginx1:1.15:

gcloud compute instances create-with-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:1.15

Del mismo modo, puedes crear una instancia de VM nueva llamada hello-app, que iniciará y ejecutará un contenedor de muestra en Artifact Registry:

gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Cuando se utiliza una imagen de contenedor de Docker Hub, siempre debes especificar el nombre completo de la imagen de Docker. Por ejemplo, especifica el siguiente nombre de imagen para implementar una imagen de contenedor de Apache:

docker.io/httpd:2.4

Para ejecutar un solo contenedor en cada VM en un grupo de instancias administrado, especifica el nombre de la imagen de contenedor cuando definas la plantilla de instancias. Consulta Cómo crear una plantilla de instancias con una imagen de contenedor para obtener más información.

Cómo crear una instancia para situaciones avanzadas

Utiliza este método para seleccionar una imagen de Container-Optimized OS específica, para implementar varios contenedores, y para usar cloud-init en la configuración avanzada.

Cómo visualizar las imágenes disponibles

Las imágenes de Container-Optimized OS están disponibles en la lista de imágenes de Google Cloud Console con el prefijo cos. Esta se alojan en el proyecto cos-cloud. También puedes ver todas las actualizaciones disponibles en este momento en la línea de comandos. Para ello, ejecuta el siguiente comando:

gcloud compute images list --project cos-cloud --no-standard-images

El resultado es similar al siguiente:

NAME                       PROJECT    FAMILY      DEPRECATED  STATUS
cos-69-10895-385-0         cos-cloud  cos-69-lts              READY
cos-73-11647-534-0         cos-cloud  cos-73-lts              READY
cos-77-12371-251-0         cos-cloud  cos-77-lts              READY
cos-81-12871-103-0         cos-cloud  cos-81-lts              READY
cos-beta-81-12871-44-0     cos-cloud  cos-beta                READY
cos-dev-84-13078-0-0       cos-cloud  cos-dev                 READY
cos-stable-81-12871-103-0  cos-cloud  cos-stable              READY

Crea una instancia

Puedes crear una instancia con la consola de Google Cloud, gcloud CLI o la API.

Consola

Para ejecutar una instancia de Compute Engine con Container-Optimized OS y Docker instalados, sigue estos pasos:

  1. Abre la página de creación de instancias de Compute Engine en la consola de Google Cloud.

    Crea una instancia nueva de Compute Engine

  2. Especifica un nombre para tu instancia.

  3. En la sección Contenedores, desmarca la casilla de verificación Implementar una imagen de contenedor para esta instancia de VM. Esta opción es útil si deseas implementar un solo contenedor en la VM.

  4. En la sección Disco de arranque, selecciona una imagen de Container-Optimized OS

  5. Haz clic en Crear para crear y, además, iniciar la instancia.

gcloud

Revisa las imágenes disponibles y, luego, usa el siguiente comando para crear una instancia de imagen de nodo de cos:

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

Reemplaza lo siguiente:

  • instance-name por el nombre de tu instancia de VM.
  • image-name por el nombre de la imagen de Container-Optimized OS para la instancia, que se obtiene de la lista de imágenes disponibles. En nuestro ejemplo anterior, podemos usar cos-beta-81-12871-44-0.
  • compute-zone por la zona de procesamiento de tu instancia.
  • machine-type-name por el tipo de máquina que se usará para esta instancia nueva. El tipo predeterminado es n1-standard-1.

Por ejemplo, el siguiente comando crea una instancia llamada cos-test mediante la imagen cos-beta-67-10575-13-0:

gcloud compute instances create cos-test \
    --image cos-beta-67-10575-13-0 \
    --image-project cos-cloud \
    --zone us-east1-d \
    --machine-type n1-standard-1

Si quieres la última versión disponible de Container-Optimized OS dev, beta o stable, usa la marca --image-family, como se muestra a continuación:

gcloud compute instances create instance-name \
    --image-family cos-beta \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

Puedes agregar la marca --preemptible para instancias experimentales únicas.

API

En la API, prepara una solicitud normal para crear una instancia, pero incluye una imagen de origen de Container-Optimized OS. Por ejemplo:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/compute-zone/instances

{
  'machineType': 'zones/compute-zone/machineTypes/machine-type-name',
  'name': 'instance-name',
  'networkInterfaces': [
    {
      'accessConfigs': [
        {
          'type': 'ONE_TO_ONE_NAT',
          'name': 'External NAT'
        }
      ],
      'network': 'global/networks/default'
    }
  ],
  'disks': [
    {
      'type': 'PERSISTENT',
      'boot': true,
      'autoDelete': true,
      'initializeParams': {
        'sourceImage': 'projects/cos-cloud/global/images/family/cos-stable'
      }
    }
  ]
}

Cómo configurar una instancia

En algunos casos, quizás quieras realizar una configuración adicional cuando se inicia la instancia. Puedes usar la herramienta cloud-init con Container-Optimized OS para aplicar la información de configuración que proporcionas en un formato cloud-config.

Usa cloud-init con el formato de configuración de Cloud

Las imágenes de Container-Optimized OS incluyen cloud-init como una forma de configurar tu instancia cuando se inicia. La herramienta de cloud-init espera su configuración en el valor de la clave user-data de los metadatos de la instancia. La herramienta de cloud-init comprende varios formatos.

A continuación, se encuentra un ejemplo de archivo cloud-init que muestra cómo crear una cuenta de usuario y un servicio systemd que pertenezca a este usuario que controla la administración de un contenedor de busybox de Docker:

#cloud-config

users:
- name: cloudservice
  uid: 2000

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container

    [Service]
    ExecStart=/usr/bin/docker run --rm -u 2000 --name=mycloudservice busybox:latest /bin/sleep 3600
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service

# Optional once-per-boot setup. For example: mounting a PD.
bootcmd:
- fsck.ext4 -tvy /dev/[DEVICE_ID]
- mkdir -p /mnt/disks/[MNT_DIR]
- mount -t ext4 -O ... /dev/[DEVICE_ID] /mnt/disks/[MNT_DIR]

Para crear una instancia de VM de Container-Optimized OS que haga referencia a este archivo cloud-init, usa la marca de línea de comandos --metadata-from-file. Supongamos que el archivo cloud-init llamado filename en el directorio actual, el siguiente comando crea una instancia y un activador de Container-Optimized OS cloud-init y asigna el contenido del archivo a la clave user-data en los metadatos de la instancia:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename

Reemplaza lo siguiente:

  • instance-name por el nombre de tu instancia de VM.
  • filename por el nombre del archivo de metadatos.

Es posible configurar otras marcas de metadatos cuando creas instancias de Container-Optimized OS. Debido a que estas propiedades son pares clave-valor simples, puedes usar la marca --metadata en el comando gcloud compute instances create para crear las propiedades. Además, a partir del evento importante 97, puedes establecer marcas de metadatos en los metadatos del proyecto con la marca --metadata en el comando gcloud compute project-info add-metadata. Las marcas definidas a nivel de instancia tendrán prioridad sobre las marcas definidas a nivel de proyecto.

El ejemplo anterior se puede expandir para recopilar estadísticas de uso y la recopilación de volcado de fallas con el siguiente comando:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename \
    --metadata=cos-metrics-enabled=true

Otras marcas de metadatos

Clave de metadatos Descripción Comportamiento predeterminado
cos-update-strategy Especifica el comportamiento de actualización. El único valor aceptado es: update_disabled. Si no la estableces:
  • cos-dev y cos-beta: Actualizaciones de la versión más reciente del SO en la familia de imágenes correspondiente
  • Evento importante de LTS y cos-stable: Actualizaciones de la versión más reciente del SO desde el mismo evento importante
cos-metrics-enabled Habilita la recopilación de volcado de falla. Los valores pueden ser:
true
false (predeterminado).
Está inhabilitado de forma predeterminada.

Conéctate a una instancia

Puede SSH en su instancia de VM ejecutando la imagen del nodo cos de la misma manera que SSH en otras instancias de Compute Engine.

Por ejemplo:

gcloud compute ssh instance-name \
    --project project-id \
    --zone compute-zone

Ejecuta secuencias de comandos de inicio

Puedes especificar una secuencia de comandos de inicio a través del servidor de metadatos mediante la clave de metadatos startup-script. Puedes usar Google Cloud CLI, la API o la consola de Google Cloud para proporcionar una secuencia de comandos de inicio. Consulta Cómo ejecutar secuencias de comandos de inicio para obtener más detalles.

Sincronización temporal

Antes del evento importante 85, Container-Optimized OS usa el servicio systemd-timesyncd de systemd para sincronizar el reloj del sistema local con un servidor protocolo NTP remoto (NTP) por medio del protocolo SNTP. En las siguientes entradas del archivo de configuración /etc/systemd/timesyncd.conf, se muestran los valores de configuración predeterminados para ayudar al administrador a realizar los cambios deseados:

cat /etc/systemd/timesyncd.conf
# comments omitted for brevity
[Time]
#NTP=
#FallbackNTP=metadata.google.internal
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Por lo tanto, la distancia raíz máxima aceptable es de 5 segundos y los intervalos mínimo y máximo de sondeo para los mensajes NTP son de 32 y 2,048 segundos, respectivamente.

A partir del evento importante 85 de Container-Optimized OS, se usa el servicio chronyd para sincronizar el reloj del sistema local con un servidor de protocolo de hora de red remoto (NTP) mediante el protocolo NTP. En las siguientes entradas del archivo de configuración /etc/chrony/chrony.conf, se muestran los valores de configuración predeterminados para ayudar al administrador a realizar los cambios deseados:

cat /etc/chrony/chrony.conf
# Use custom NTP servers
server metadata.google.internal prefer iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

El servidor NTP se configura a partir de la respuesta DHCP de eth0, que suele ser el servidor de metadatos de Compute Engine:

networkctl status eth0 | grep NTP
             NTP: 169.254.169.254

Cómo cambiar la zona horaria

La zona horaria predeterminada de Container-Optimized OS de Google es UTC0. Crea un vínculo simbólico a la zona horaria deseada como en el siguiente ejemplo:

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime

Ten en cuenta que /etc no tiene estado, por lo que la zona horaria se restablecerá al valor predeterminado (UTC0) en cada reinicio.

Cómo inhabilitar las actualizaciones automáticas

Hay dos maneras de inhabilitar las actualizaciones automáticas. El método preferido es usar la clave de metadatos de la instancia cos-update-strategy:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata cos-update-strategy=update_disabled

A partir del evento importante 97, también puedes inhabilitar las actualizaciones automáticas en los metadatos del proyecto:

gcloud compute project-info add-metadata \
    --metadata cos-update-strategy=update_disabled

También puedes inhabilitar las actualizaciones automáticas en una instancia en ejecución con systemctl:

sudo systemctl stop update-engine
sudo systemctl mask update-engine