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
Ve a la página Instancias de VM.
Haz clic en Crear instancia.
Especifica un nombre para la instancia.
En la sección Contenedor, marca la casilla Desplegar una imagen de contenedor en esta instancia de VM.
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 muestrahello-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
.
- Puedes especificar una imagen de Container Registry o Artifact Registry.
Por ejemplo:
También puedes hacer clic en Opciones avanzadas del contenedor. Para obtener más información, consulta Configurar opciones para ejecutar tu contenedor.
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:
Abre la página de creación de instancias de Compute Engine en la Google Cloud consola.
Especifica un nombre para la instancia.
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.
En la sección Disco de arranque, selecciona una imagen de Container-Optimized OS.
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-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