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 Google Cloud Console o la herramienta de gcloud.

Console

  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 a utilizar.

    • Por ejemplo, puedes especificar gcr.io/cloud-marketplace/google/nginx1:1.12 para seleccionar una imagen de contenedor NGINX 1.12 de Cloud Launcher.
    • 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.12:

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

Cuando se usa 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 a este:

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 Google Cloud Console, la herramienta de gcloud o la API.

Console

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 Google Cloud Console.

    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://www.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. El ejemplo anterior se puede expandir para recopilar estadísticas de uso y recolección de volcado de falla con lo siguiente:

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 se configura, todas las actualizaciones del canal actual se descargan y se instalan automáticamente.
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 la herramienta de línea de comandos de gcloud, la API o Cloud Console para proporcionar una secuencia de comandos de inicio. Consulta Ejecuta secuencias de comandos de inicio para obtener más detalles.

Inicia y detén servicios de systemd

Para iniciar el servicio especificado en el archivo hello.service, ejecuta el siguiente comando:

sudo systemctl start hello.service

Para detener el servicio especificado en el archivo hello.service, ejecuta el siguiente comando:

sudo systemctl stop hello.service

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 cos-update-strategy:

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