Crear y configurar instancias

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

En situaciones sencillas en las que quieras ejecutar un solo contenedor en una VM o en cada VM de un grupo de instancias gestionado, puedes especificar una imagen de contenedor y parámetros de configuración opcionales al definir la instancia o la plantilla de instancia. Compute Engine crea la instancia con la versión más reciente de Container-Optimized OS e inicia el contenedor especificado cuando se inicia la VM.

En situaciones avanzadas en las que puedes desplegar varios contenedores y configurar opciones de Docker mediante cloud-init, puedes crear una instancia de Compute Engine con la imagen de Container-Optimized OS que elijas y, a continuación, configurar el contenedor según sea necesario.

Crear una instancia sencilla

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

Consola

  1. Ve a la página Instancias de VM.

    Ve a la página Instancias de VM.

  2. Haz clic en Crear instancia.

  3. Especifica un nombre para la instancia.

  4. En la sección Contenedor, marca la casilla Desplegar una imagen de contenedor en esta instancia de VM.

  5. Especifica la imagen de contenedor que quieras usar.

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

  7. Haz clic en Crear para crear la instancia, arrancarla y lanzar el contenedor.

gcloud

Para crear una instancia de VM básica, ejecuta el siguiente comando:

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

Haz los cambios siguientes:

  • instance-name: el nombre de la nueva instancia.
  • image-name: el nombre de la imagen del contenedor.

Por ejemplo, el siguiente comando crea una 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 llamada hello-app que iniciará y ejecutará un contenedor de ejemplo 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 utilices una imagen de contenedor de Docker Hub, siempre debes especificar el nombre completo de la imagen Docker. Por ejemplo, especifica el siguiente nombre de imagen para desplegar una imagen de contenedor de Apache:

docker.io/httpd:2.4

Para ejecutar un solo contenedor en cada VM de un grupo de instancias gestionado, especifica el nombre de la imagen del contenedor al definir la plantilla de instancia. Consulta más información en Crear una plantilla de instancia con una imagen de contenedor.

Crear una instancia para casos avanzados

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

Ver imágenes disponibles

Las imágenes de Container-Optimized OS están disponibles en la lista de imágenes de la Google Cloud consola cos. Se alojan en el proyecto cos-cloud. También puedes ver todas las versiones disponibles en la línea de comandos ejecutando el siguiente comando:

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

El resultado debería ser 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

Crear una instancia

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

Consola

Para ejecutar una instancia de Compute Engine con Container-Optimized OS y Docker instalados, haz lo siguiente:

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

    Crear una instancia de Compute Engine

  2. Especifica un nombre para la instancia.

  3. En la sección Contenedores, desmarca la casilla Desplegar una imagen de contenedor en esta instancia de VM. Esta opción es útil si quieres desplegar 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 e iniciar la instancia.

gcloud

Consulta las imágenes disponibles y, a continuación, usa el siguiente comando para crear una instancia de imagen de nodo cos:

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

Haz los cambios siguientes:

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

Por ejemplo, el siguiente comando crea una instancia llamada cos-test con 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

Puede añadir la marca --preemptible para instancias experimentales únicas.

API

En la API, crea 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/image-name'
      }
    }
  ]
}

Configurar una instancia

En algunos casos, puede que quieras hacer una configuración adicional cuando se inicie la instancia. Puedes usar la herramienta cloud-init con Container-Optimized OS para aplicar la información de configuración que proporciones en formato cloud-config.

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

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

Aquí tienes un ejemplo de archivo cloud-init que muestra cómo crear una cuenta de usuario y un servicio de systemd propiedad de este usuario que controla la gestión de un contenedor 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. Si el archivo cloud-init se llama filename en el directorio actual, el siguiente comando crea una instancia de Container-Optimized OS y activa cloud-init asignando el contenido del archivo a la clave user-data en los metadatos de la instancia:

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

Haz los cambios siguientes:

  • instance-name: el nombre de tu instancia de VM.
  • image-name: el nombre de la imagen de Container-Optimized OS de la instancia. Por ejemplo, --image=cos-113-18244-85-29.
  • filename: el nombre del archivo de metadatos.

Es posible definir otras marcas de metadatos al crear instancias de Container-Optimized OS. Como estas propiedades son pares clave-valor sencillos, puede usar la marca --metadata en el comando gcloud compute instances create para crear las propiedades. Además, a partir de la versión 97, puedes definir 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 ampliar para recoger estadísticas de uso y recoger volcados tras fallos con el siguiente comando:

gcloud compute instances create instance-name \
    --image image-name \
    --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 las actualizaciones automáticas. El valor puede ser update_enabled, update_disabled o no estar definido.
Si no está definido, se usará el comportamiento de actualización automática predeterminado del hito.
Si está habilitado, el comportamiento depende del canal de lanzamiento:
  • cos-dev y cos-beta: actualizaciones de la versión más reciente del SO en la familia de imágenes correspondiente
  • Versión de LTS y cos-estable: actualizaciones de la versión más reciente del SO de la misma versión
  • Versiones anteriores a la 117: habilitada de forma predeterminada
  • Versión 117 o posterior: inhabilitado de forma predeterminada
cos-metrics-enabled Habilita la recogida de volcados de memoria tras un fallo. Los valores pueden ser:
true
false (valor predeterminado).
Inhabilitado de forma predeterminada

Conectarse a una instancia

Puedes acceder a tu instancia de VM que ejecuta la imagen de nodo cos de la misma forma que a otras instancias de Compute Engine.

Por ejemplo:

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

Ejecutar 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 la CLI de Google Cloud, la API o la Google Cloud consola para proporcionar una secuencia de comandos de inicio. Para obtener más información, consulta el artículo Ejecutar secuencias de comandos de inicio.

Sincronización de la hora

Antes de la versión 85, Container-Optimized OS usaba el servicio systemd-timesyncd de systemd para sincronizar el reloj del sistema local con un servidor NTP remoto a través del protocolo SNTP. Las siguientes entradas del archivo de configuración /etc/systemd/timesyncd.conf muestran los valores de configuración predeterminados comentados para ayudar al administrador a hacer los cambios que quiera:

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 máxima aceptable de la raíz es de 5 segundos, y los intervalos de sondeo mínimo y máximo para los mensajes NTP son de 32 y 2048 segundos, respectivamente.

A partir de la versión 85, Container-Optimized OS usa el servicio chronyd para sincronizar el reloj del sistema local con un servidor NTP remoto a través del protocolo NTP. Las siguientes entradas del archivo de configuración /etc/chrony/chrony.conf muestran los valores de configuración predeterminados comentados para ayudar al administrador a hacer los cambios que quiera:

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 define 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

Cambiar la zona horaria

La zona horaria predeterminada de Container-Optimized OS de Google es UTC0. Crea un enlace simbólico a la zona horaria que quieras, 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á a la predeterminada (UTC0) cada vez que se reinicie.

Habilitar o inhabilitar las actualizaciones automáticas

Hay dos formas de habilitar o inhabilitar las actualizaciones automáticas. El método preferido es definir la clave de metadatos de la instancia cos-update-strategy en update_enabled o update_disabled, respectivamente. Por ejemplo:

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

A partir del hito 97, también puede inhabilitar o habilitar 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