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.
Console
Ve a la página Instancias de VM
Haz clic en Crear instancia.
Especifica un Nombre para tu instancia.
En la sección Contenedor, selecciona la casilla de verificación Implementar una imagen de contenedor para esta instancia de VM.
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 dehello-app
de Artifact Registry.
- Con
- 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
.
- Puedes especificar una imagen de Container Registry o Artifact Registry.
Por ejemplo:
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.
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 consola
lista de imágenes 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 la consola de Google Cloud, la CLI de gcloud o la API.
Console
Para ejecutar una instancia de Compute Engine con Container-Optimized OS y Docker instalados, sigue estos pasos:
Abre la página de creación de instancias de Compute Engine en la consola de Google Cloud.
Especifica un nombre para tu instancia.
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.
En la sección Disco de arranque, selecciona una imagen de Container-Optimized OS
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
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/image-name' } } ] }
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 image-name \ --image-project cos-cloud \ --metadata-from-file user-data=filename
Reemplaza lo siguiente:
- instance-name por el nombre de tu instancia de VM.
- image-name: Es el nombre de la imagen de Container-Optimized OS para
la instancia. Por ejemplo,
--image=cos-113-18244-85-29
- 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 hito 97,
puedes establecer marcas de metadatos en las
metadatos con la marca --metadata
en el comando gcloud compute project-info add-metadata
. Marcas
definidas a nivel de instancia tendrán prioridad sobre las marcas definidas a nivel
a nivel de proyecto.
El ejemplo anterior se puede expandir para recopilar estadísticas de uso y la recopilación de volcado de falla 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 la actualización automática. El valor puede ser update_enabled , update_disabled o no establecido.Si no lo estableces, se usará el comportamiento predeterminado de las actualizaciones automáticas para el evento importante. Si está habilitado, el comportamiento depende del canal de versiones:
|
|
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
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 conocer los 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.
Habilita o inhabilita las actualizaciones automáticas
Existen dos maneras de habilitar o inhabilitar las actualizaciones automáticas. El método preferido es establecer 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 puedes 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