Es gibt zwei Möglichkeiten zum Erstellen und Konfigurieren von Compute Engine-Instanzen, auf denen das Container-Optimized OS von Google ausgeführt wird.
In einfachen Szenarien, in denen Sie einen einzelnen Container in einer VM oder in jeder VM in einer verwalteten Instanzgruppe ausführen möchten, können Sie beim Definieren der Instanz oder Instanzvorlage ein Container-Image und optionale Konfigurationsparameter angeben. Compute Engine erstellt die Instanz mit der aktuellen Version des Container-Optimized OS und startet den angegebenen Container zusammen mit der VM.
In erweiterten Szenarien, in denen Sie mehrere Container bereitstellen und Docker-Optionen mit cloud-init
konfigurieren können, können Sie eine Compute Engine-Instanz mit dem von Ihnen ausgewählten Container-Optimized OS-Image erstellen und anschließend nach Bedarf konfigurieren.
Einfache Instanz erstellen
Verwenden Sie diese Methode, um einen einzelnen Container in einer VM mit der aktuellen Version des Container-Optimized OS bereitzustellen. Sie können diese Aufgabe über die Google Cloud Console ausführen oder die gcloud CLI verwenden.
Console
Rufen Sie die Seite "VM-Instanzen" auf.
Klicken Sie auf Instanz erstellen.
Geben Sie unter Name einen Namen für Ihre Instanz an.
Markieren Sie im Abschnitt Container das Kästchen Container-Image für diese VM-Instanz bereitstellen.
Geben Sie das zu verwendende Container-Image an.
- Sie können ein Image aus Container Registry oder Artifact Registry angeben.
Beispiel:
gcr.io/cloud-marketplace/google/nginx1:1.15
wählt ein NGINX 1.15-Container-Image aus Google Cloud Marketplace aus.us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
wählt ein Beispiel-hello-app
-Image aus Artifact Registry aus.
- Wenn Sie ein Container-Image von Docker Hub verwenden, geben Sie immer den vollständigen Docker-Image-Namen an. Geben Sie zum Beispiel den folgenden Image-Namen an, um ein Apache-Container-Image bereitzustellen:
docker.io/httpd:2.4
.
- Sie können ein Image aus Container Registry oder Artifact Registry angeben.
Beispiel:
Klicken Sie optional auf Erweiterte Containeroptionen. Weitere Informationen finden Sie unter Optionen zum Ausführen von Containern konfigurieren.
Klicken Sie auf Erstellen, um die Instanz zu erstellen und sie zusammen mit dem Container zu starten.
gcloud
Führen Sie den folgenden Befehl aus, um eine einfache VM-Instanz zu erstellen:
gcloud compute instances create-with-container instance-name \ --container-image image-name
Dabei gilt:
- instance-name ist der Name der neuen Instanz.
- image-name ist der Name des Container-Images.
Mit dem folgenden Befehl wird beispielsweise eine neue VM-Instanz namens nginx-vm
erstellt, die das Container-Image gcr.io/cloud-marketplace/google/nginx1:1.15
startet und ausführt:
gcloud compute instances create-with-container nginx-vm \ --container-image gcr.io/cloud-marketplace/google/nginx1:1.15
In ähnlicher Weise können Sie eine neue VM-Instanz namens hello-app
erstellen, die einen Beispielcontainer in Artifact Registry startet und ausführt:
gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
Wenn Sie ein Container-Image aus Docker Hub verwenden, müssen Sie immer einen vollständigen Docker-Image-Namen angeben. Geben Sie zum Beispiel den folgenden Image-Namen an, um ein Apache-Container-Image bereitzustellen:
docker.io/httpd:2.4
Geben Sie zum Ausführen eines einzelnen Containers in jeder VM in einer verwalteten Instanzgruppe den Namen des Container-Images an, wenn Sie die Instanzvorlage definieren. Weitere Informationen finden Sie unter Instanzvorlage mit einem Container-Image erstellen.
Instanz für erweiterte Szenarien erstellen
Verwenden Sie diese Methode, um ein bestimmtes Container-Optimized OS-Image auszuwählen, mehrere Container bereitzustellen und cloud-init
für die erweiterte Konfiguration zu verwenden.
Verfügbare Images ansehen
Container-Optimized OS-Images sind in Google Cloud Console
Liste der Images mit dem Präfix cos
.
Diese werden im Projekt cos-cloud
gehostet. Mit dem folgenden Befehl können Sie sich auch alle derzeit verfügbaren Releases in der Befehlszeile anzeigen lassen:
gcloud compute images list --project cos-cloud --no-standard-images
Die Ausgabe sieht etwa so aus:
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
Instanz erstellen
Sie können eine Instanz mit der Google Cloud Console, der gcloud CLI oder die API verwenden.
Console
Führen Sie die folgenden Schritte aus, um eine Compute Engine-Instanz mit einem installierten Container-Optimized OS und installiertem Docker auszuführen:
Öffnen Sie in der Google Cloud Console die Seite zum Erstellen von Compute Engine-Instanzen.
Geben Sie unter Name einen Namen für Ihre Instanz an.
Entfernen Sie im Abschnitt Container das Häkchen aus dem Kästchen Container-Image für diese VM-Instanz bereitstellen. Diese Option ist hilfreich, wenn Sie einen einzelnen Container in der VM bereitstellen möchten.
Wählen Sie im Abschnitt Bootlaufwerk ein Container-Optimized OS-Image aus.
Klicken Sie auf Erstellen, um die Instanz zu erstellen und zu starten.
gcloud
Prüfen Sie die derzeit verfügbaren Images und erstellen Sie mit dem folgenden Befehl eine cos
Knotenimageinstanz:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --zone compute-zone \ --machine-type machine-type-name
Dabei gilt:
- instance-name ist der Name Ihrer VM-Instanz.
- image-name ist der Name des Container-Optimized OS-Images für die Instanz, das aus der Liste der verfügbaren Images abgerufen wird.
Aus unserem vorherigen Beispiel können wir
cos-beta-81-12871-44-0
verwenden. - compute-zone ist die Computing-Zone für Ihre Instanz.
- machine-type-name ist der für diese neue Instanz zu verwendende Maschinentyp.
Der Standardtyp ist
n1-standard-1
.
Mit dem folgenden Befehl wird beispielsweise eine Instanz mit dem Namen cos-test
unter Verwendung des cos-beta-67-10575-13-0
-Images erstellt:
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
Sie können das Flag --preemptible
für einmalige, experimentelle Instanzen hinzufügen.
API
Erzeugen Sie in der API eine normale Anfrage, um eine Instanz zu erstellen, geben Sie aber zusätzlich ein Container-Optimized OS-Quell-Image an. Beispiel:
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' } } ] }
Eine Instanz konfigurieren
In einigen Fällen kann es beim Starten der Instanz erforderlich sein, eine zusätzliche Konfiguration vorzunehmen. Sie können das Tool cloud-init
mit Container-Optimized OS verwenden, um Konfigurationsinformationen anzuwenden, die Sie in einem cloud-config
-Format angeben.
cloud-init mit dem Cloud-Konfigurationsformat verwenden
Container-Optimized OS-Images umfassen
cloud-init
um die Instanz beim Hochfahren zu konfigurieren. Das cloud-init
-Tool erwartet die Konfiguration im Wert des Schlüssels user-data
der Instanzmetadaten. Das cloud-init
-Tool versteht mehrere Formate.
Hier sehen Sie ein Beispiel für eine cloud-init
-Datei, die zeigt, wie Sie ein Nutzerkonto erstellen und einen systemd-Dienst dieses Nutzers erstellen, der die Verwaltung eines Docker-busybox-Containers steuert:
#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]
Verwenden Sie das Befehlszeilen-Flag --metadata-from-file
, um eine VM-Instanz mit Container-Optimized OS zu erstellen, die auf diese cloud-init
-Datei verweist.
Wenn die Datei cloud-init
im aktuellen Verzeichnis filename heißt, erstellt der folgende Befehl eine Container-Optimized OS-Instanz und löst cloud-init
aus, indem er den Inhalt der Datei dem Schlüssel user-data
in den Instanzmetadaten zuweist:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata-from-file user-data=filename
Dabei gilt:
- instance-name ist der Name Ihrer VM-Instanz.
- image-name ist der Name des Container-Optimized OS-Images für
für die Instanz. Beispiel:
--image=cos-113-18244-85-29
. - filename ist der Name der Metadatendatei.
Bei der Erstellung von Container-Optimized OS-Instanzen können Sie andere Metadaten-Flags festlegen. Da diese Attribute einfache Schlüssel/Wert-Paare sind, können Sie das Flag --metadata
im Befehl gcloud compute instances create
verwenden, um die Attribute zu erstellen. Ab Meilenstein 97 können Sie mit dem Flag --metadata
im Befehl gcloud compute project-info add-metadata
Metadaten-Flags in Projektmetadaten festlegen. Flaggen
die auf Instanzebene definiert wurden,
haben Vorrang vor Flags, die auf der
auf Projektebene.
Das vorherige Beispiel kann erweitert werden, um Nutzungsstatistiken und Crash-Dump-Sammlung mit dem folgenden Befehl:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata-from-file user-data=filename \ --metadata=cos-metrics-enabled=true
Andere Metadaten-Flags
Metadatenschlüssel | Beschreibung | Standardverhalten |
---|---|---|
cos-update-strategy |
Gibt das Verhalten der automatischen Updates an. Der Wert kann update_enabled , update_disabled oder nicht konfiguriert sein.Wenn die Richtlinie nicht konfiguriert ist, wird das Standardverhalten für automatische Updates für den Meilenstein verwendet. Wenn diese Option aktiviert ist, hängt das Verhalten von der Release-Version ab:
|
|
cos-metrics-enabled |
Aktiviert die Absturzberichte. Mögliche Werte:true false (Standard). |
Standardmäßig deaktiviert |
Verbindung zu einer Instanz herstellen
Sie können sich zur VM-Instanz mit dem Knoten-Image cos
genauso wie mit anderen Google Compute Engine-Instanzen per SSH verbinden.
Beispiel:
gcloud compute ssh instance-name \ --project project-id \ --zone compute-zone
Startskripts ausführen
Sie können ein Startskript über den Metadatenserver mit dem Metadatenschlüssel startup-script
angeben. Sie können die
Google Cloud CLI, der API oder der Google Cloud Console
zu erstellen. Weitere Informationen finden Sie unter Startskripts ausführen.
.
Zeitsynchronisierung
Vor Meilenstein 85 verwendet Container-Optimized OS den systemd-timesyncd
-Dienst von systemd
, um die lokalen Systemuhr mit einem NTP-Server (Remote Network Time Protocol) über das SNTP-Protokoll zu synchronisieren. Die folgenden Einträge in der Konfigurationsdatei /etc/systemd/timesyncd.conf
enthalten kommentierte Standardkonfigurationswerte, die dem Administrator bei der Durchführung der gewünschten Änderungen helfen:
cat /etc/systemd/timesyncd.conf # comments omitted for brevity [Time] #NTP= #FallbackNTP=metadata.google.internal #RootDistanceMaxSec=5 #PollIntervalMinSec=32 #PollIntervalMaxSec=2048
Die maximal zulässige Root-Entfernung beträgt also 5 Sekunden und die minimalen und maximalen Abfrageintervalle für NTP-Nachrichten betragen 32 bzw. 2.048 Sekunden.
Ab Meilenstein 85 verwendet Container-Optimized OS den Dienst chronyd
, um die lokale Systemuhr über das NTP-Protokoll mit einem Remote-Netzwerkzeitprotokollserver (NTP) zu synchronisieren. Die folgenden Einträge in der Konfigurationsdatei /etc/chrony/chrony.conf
enthalten kommentierte Standardkonfigurationswerte, die dem Administrator bei der Durchführung der gewünschten Änderungen helfen:
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
Der NTP-Server wird über die DHCP-Antwort von eth0
festgelegt, die in der Regel der Metadatenserver von Compute Engine ist:
networkctl status eth0 | grep NTP NTP: 169.254.169.254
Zeitzone ändern
Die Standardzeitzone des Container-Optimized OS von Google ist UTC0. Sie können eine symbolische Verknüpfung zu Ihrer gewünschten Zeitzone wie im folgenden Beispiel erstellen:
sudo rm /etc/localtime sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime
Beachten Sie, dass /etc
zustandslos ist. Daher wird die Zeitzone bei jedem Neustart auf den Standardwert (UTC0) zurückgesetzt.
Automatische Updates aktivieren oder deaktivieren
Es gibt zwei Möglichkeiten, automatische Updates zu aktivieren oder zu deaktivieren. Die bevorzugte Methode
den Metadatenschlüssel der Instanz cos-update-strategy
auf update_enabled
oder
update_disabled
. Beispiel:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata cos-update-strategy=update_disabled
Ab Meilenstein 97 Sie können automatische Updates auch in den Projektmetadaten deaktivieren oder aktivieren:
gcloud compute project-info add-metadata \ --metadata cos-update-strategy=update_disabled
Mit systemctl
können Sie die automatischen Updates auch für eine laufende Instanz deaktivieren:
sudo systemctl stop update-engine sudo systemctl mask update-engine