Esistono due modi per creare e configurare istanze Compute Engine che eseguono il sistema operativo Container-Optimized di Google.
Per scenari semplici in cui vuoi eseguire un singolo contenitore su una VM o su ogni VM in un gruppo di istanze gestite, puoi specificare un'immagine del contenitore e parametri di configurazione facoltativi quando definisci l'istanza o il modello di istanza. Compute Engine crea l'istanza con la versione più recente di Container-Optimized OS e avvia il contenitore specificato all'avvio della VM.
Per gli scenari avanzati in cui puoi eseguire il deployment di più container e configurare le opzioni Docker utilizzando cloud-init
, puoi creare un'istanza Compute Engine con l'immagine del sistema operativo ottimizzato per i container che preferisci, quindi procedere alla configurazione in base alle tue esigenze.
Creazione di un'istanza semplice
Utilizza questo metodo per eseguire il deployment di un singolo container su una VM utilizzando la versione più recente di Container-Optimized OS. Puoi eseguire questa operazione utilizzando la console Google Cloud o gcloud CLI.
Console
Vai alla pagina delle istanze VM.
Fai clic su Crea istanza.
Specifica un nome per l'istanza.
Nella sezione Container, seleziona la casella di controllo Esegui il deployment di un'immagine container su questa istanza VM.
Specifica l'immagine del container da utilizzare.
- Puoi specificare un'immagine da Container Registry o Artifact Registry.
Ad esempio:
gcr.io/cloud-marketplace/google/nginx1:1.15
seleziona un'immagine container NGINX 1.15 da Google Cloud Marketplace.us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
seleziona un'immaginehello-app
di esempio da Artifact Registry.
- Se utilizzi un'immagine container di Docker Hub, specifica sempre il nome completo dell'immagine Docker. Ad esempio, specifica il seguente nome dell'immagine per eseguire il deployment di un'immagine del container Apache:
docker.io/httpd:2.4
.
- Puoi specificare un'immagine da Container Registry o Artifact Registry.
Ad esempio:
Se vuoi, fai clic su Opzioni container avanzate. Per ulteriori informazioni, consulta Configurare le opzioni per l'esecuzione del contenitore.
Fai clic su Crea per creare l'istanza, avviarla e lanciare il contenitore.
gcloud
Per creare un'istanza VM semplice, esegui il seguente comando:
gcloud compute instances create-with-container instance-name \ --container-image image-name
Sostituisci quanto segue:
- instance-name: il nome della nuova istanza.
- image-name: il nome dell'immagine del contenitore.
Ad esempio, il seguente comando crea una nuova istanza VM denominata
nginx-vm
, che avvierà ed eseguirà l'immagine del container 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
Analogamente, puoi creare una nuova istanza VM denominata hello-app
che avvia ed esegue un contenitore di esempio in Artifact Registry:
gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
Quando utilizzi un'immagine container di Docker Hub, devi sempre specificare un nome completo dell'immagine Docker. Ad esempio, specifica il seguente nome immagine per eseguire il deployment di un'immagine container Apache:
docker.io/httpd:2.4
Per eseguire un singolo contenitore su ogni VM in un gruppo di istanze gestite, specifica il nome dell'immagine del contenitore quando definisci il modello di istanza. Per saperne di più, consulta Creare un modello di istanza con un'immagine contenitore.
Creazione di un'istanza per scenari avanzati
Utilizza questo metodo per selezionare un'immagine Container-Optimized OS specifica, per eseguire il deployment di più container e per utilizzare cloud-init
per la configurazione avanzata.
Visualizzazione delle immagini disponibili
Le immagini del sistema operativo ottimizzato per i container sono disponibili nell'elenco di immagini della console Google Cloud con il prefisso cos
.
Questi sono ospitati nel progetto cos-cloud
. Puoi anche visualizzare tutte le release attualmente disponibili sulla riga di comando eseguendo il seguente comando:
gcloud compute images list --project cos-cloud --no-standard-images
L'output è simile al seguente:
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
Creazione di un'istanza
Puoi creare un'istanza utilizzando la console Google Cloud, gcloud CLI o l'API.
Console
Per eseguire un'istanza Compute Engine con un sistema operativo ottimizzato per i container e Docker installati, svolgi i seguenti passaggi:
Apri la pagina di creazione dell'istanza Compute Engine nella console Google Cloud.
Specifica un nome per l'istanza.
Nella sezione Container, deseleziona la casella di controllo Esegui il deployment di un'immagine container in questa istanza VM. Questa opzione è utile se vuoi eseguire il deployment di un singolo container sulla VM.
Nella sezione Disco di avvio, seleziona un'immagine del sistema operativo ottimizzata per i container.
Fai clic su Crea per creare e avviare l'istanza.
gcloud
Esamina le immagini disponibili al momento, quindi utilizza il seguente comando per creare un'istanza di immagine node cos
:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --zone compute-zone \ --machine-type machine-type-name
Sostituisci quanto segue:
- instance-name: il nome dell'istanza VM.
- image-name: il nome dell'immagine Container-Optimized OS per
l'istanza, ottenuta dall'elenco delle immagini disponibili.
Nell'esempio precedente, possiamo utilizzare
cos-beta-81-12871-44-0
. - compute-zone: la zona di calcolo per l'istanza.
- machine-type-name: il tipo di macchina da utilizzare per questa nuova istanza.
Il tipo predefinito è
n1-standard-1
.
Ad esempio, il seguente comando crea un'istanza denominata cos-test
utilizzando l'immagine 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
Puoi aggiungere il flag --preemptible
per istanze sperimentali una tantum.
API
Nell'API, crea una normale richiesta per creare un'istanza, ma includi un'immagine di origine del sistema operativo ottimizzato per i container. Ad esempio:
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' } } ] }
Configurazione di un'istanza
In alcuni casi, potresti voler eseguire una configurazione aggiuntiva al momento dell'avvio dell'istanza. Puoi utilizzare lo strumento cloud-init
con Container-Optimized OS per applicare le informazioni di configurazione fornite in un formato cloud-config
.
Utilizzo di cloud-init con il formato Cloud Config
Le immagini del sistema operativo ottimizzato per i container includono
cloud-init
come un modo per configurare l'istanza all'avvio. Lo strumento cloud-init
prevede la propria configurazione nel valore della chiave user-data
dei
metadati dell'istanza. Lo cloud-init
strumento supporta più formati.
Di seguito è riportato un file cloud-init
di esempio che mostra come creare un account utente e un servizio systemd di proprietà di questo utente che controlla la gestione di un contenitore busybox 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]
Per creare un'istanza VM Container-Optimized OS che fa riferimento a questo
cloud-init
file, utilizza il flag a riga di comando --metadata-from-file
.
Supponendo che il file cloud-init
si chiami filename nella directory corrente, il seguente comando crea un'istanza Container-Optimized OS e attiva cloud-init
assegnando i contenuti del file alla chiave user-data
nei metadati dell'istanza:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata-from-file user-data=filename
Sostituisci quanto segue:
- instance-name: il nome dell'istanza VM.
- image-name: il nome dell'immagine del sistema operativo ottimizzato per i container per
l'istanza. Ad esempio,
--image=cos-113-18244-85-29
. - filename: il nome del file di metadati.
È possibile impostare altri flag dei metadati durante la creazione di istanze del sistema operativo ottimizzato per i container. Poiché queste proprietà sono semplici coppie chiave-valore, puoi utilizzare il flag --metadata
nel comando gcloud compute instances create
per crearle. Inoltre, a partire dal traguardo 97,
puoi impostare i flag dei metadati nei metadati del progetto utilizzando il flag --metadata
nel comando gcloud compute project-info add-metadata
. I flag definiti a livello di istanza avranno la precedenza su quelli definiti a livello di progetto.
L'esempio precedente può essere espanso per raccogliere le statistiche sull'utilizzo e la raccolta dei dump relativi agli arresti anomali con il seguente 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
Altri flag dei metadati
Chiave dei metadati | Descrizione | Comportamento predefinito |
---|---|---|
cos-update-strategy |
Specifica il comportamento degli aggiornamenti automatici. Il valore può essere update_enabled , update_disabled o non impostato.Se non impostato, verrà utilizzato il comportamento predefinito di aggiornamento automatico per il traguardo. Se abilitato, il comportamento dipende dal canale di rilascio:
|
|
cos-metrics-enabled |
Consente la raccolta dei dump relativi agli arresti anomali. I valori possono essere:true false (predefinito). |
Disabilitato per impostazione predefinita |
Connessione a un'istanza
Puoi accedere tramite SSH all'istanza VM che esegue l'immagine del nodo cos
allo stesso modo
in cui accedi tramite SSH ad altre istanze Compute Engine.
Ad esempio:
gcloud compute ssh instance-name \ --project project-id \ --zone compute-zone
Esecuzione degli script di avvio
Puoi specificare uno script di avvio tramite il
server di metadati, utilizzando la chiave dei metadati startup-script
. Puoi utilizzare Google Cloud CLI, l'API o la console Google Cloud per fornire uno script di avvio. Per maggiori dettagli, consulta la sezione Eseguire script di avvio.
Sincronizzazione dell'ora
Prima del traguardo 85, il sistema operativo ottimizzato per i container utilizza il servizio systemd-timesyncd
di systemd
per sincronizzare il sistema orologio locale con un server NTP (Network Time Protocol) remoto tramite il protocollo SNTP. Le seguenti voci nel /etc/systemd/timesyncd.conf
file di configurazione mostrano i valori di configurazione predefiniti commentati per aiutare l'amministratore ad apportare le modifiche necessarie:
cat /etc/systemd/timesyncd.conf # comments omitted for brevity [Time] #NTP= #FallbackNTP=metadata.google.internal #RootDistanceMaxSec=5 #PollIntervalMinSec=32 #PollIntervalMaxSec=2048
Pertanto, la distanza massima accettabile del root è di 5 secondi e gli intervalli di polling minimo e massimo per i messaggi NTP sono rispettivamente 32 e 2048 secondi.
A partire dal traguardo 85, Container-Optimized OS utilizza il servizio chronyd
per sincronizzare
l'orologio di sistema locale con un server NTP (Network Time Protocol) remoto tramite il
protocollo NTP. Le seguenti voci nel file di configurazione /etc/chrony/chrony.conf
mostrano i valori di configurazione predefiniti commentati per aiutare l'amministratore a apportare le modifiche necessarie:
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
Il server NTP viene impostato dalla risposta DHCP di eth0
, che in genere è il
server di metadati di Compute Engine:
networkctl status eth0 | grep NTP NTP: 169.254.169.254
Modificare il fuso orario
Il fuso orario predefinito di Container-Optimized OS di Google è UTC0. Crea un link simbolico al fuso orario che preferisci, come nell'esempio seguente:
sudo rm /etc/localtime sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime
Tieni presente che /etc
è senza stato, pertanto il fuso orario verrà reimpostato su quello predefinito (UTC0) a ogni riavvio.
Attivare o disattivare gli aggiornamenti automatici
Esistono due modi per attivare o disattivare gli aggiornamenti automatici. Il metodo preferito consiste nell'impostare la chiave dei metadati dell'istanza cos-update-strategy
su update_enabled
o update_disabled
. Ad esempio:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata cos-update-strategy=update_disabled
A partire dal traguardo 97, puoi anche disattivare o attivare gli aggiornamenti automatici nei metadati del progetto:
gcloud compute project-info add-metadata \ --metadata cos-update-strategy=update_disabled
Puoi anche disattivare gli aggiornamenti automatici su un'istanza in esecuzione con systemctl
:
sudo systemctl stop update-engine sudo systemctl mask update-engine