Instanzen erstellen und konfigurieren

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 oder die gcloud CLI ausführen.

Console

  1. Rufen Sie die Seite "VM-Instanzen" auf.

    Zur Seite "VM-Instanzen"

  2. Klicken Sie auf Instanz erstellen.

  3. Geben Sie unter Name einen Namen für Ihre Instanz an.

  4. Markieren Sie im Abschnitt Container das Kästchen Container-Image für diese VM-Instanz bereitstellen.

  5. 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.
  6. Klicken Sie optional auf Erweiterte Containeroptionen. Weitere Informationen finden Sie unter Optionen zum Ausführen von Containern konfigurieren.

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

Ersetzen Sie Folgendes:

  • 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 der Image-Liste der Google Cloud Console mit dem Präfix cos verfügbar. 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 in 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 der API erstellen.

Console

Führen Sie die folgenden Schritte aus, um eine Compute Engine-Instanz mit einem installierten Container-Optimized OS und installiertem Docker auszuführen:

  1. Öffnen Sie in der Google Cloud Console die Seite zum Erstellen einer Compute Engine-Instanz.

    Neue Compute Engine-Instanz erstellen

  2. Geben Sie unter Name einen Namen für Ihre Instanz an.

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

  4. Wählen Sie im Abschnitt Bootlaufwerk ein Container-Optimized OS-Image aus.

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

Ersetzen Sie Folgendes:

  • 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

Wenn Sie das neueste verfügbare Container-Optimized OS dev, beta oder stable möchten, verwenden Sie das Flag --image-family folgendermaßen:

gcloud compute instances create instance-name \
    --image-family cos-beta \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

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/family/cos-stable'
      }
    }
  ]
}

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 enthalten cloud-init zur Konfiguration Ihrer Instanz beim Starten. 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-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename

Ersetzen Sie Folgendes:

  • instance-name ist der Name Ihrer VM-Instanz.
  • 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. Außerdem können Sie ab Meilenstein 97 Metadaten-Flags in Projektmetadaten mit dem Flag --metadata im Befehl gcloud compute project-info add-metadata festlegen. Auf Instanzebene definierte Flags haben Vorrang vor Flags, die auf Projektebene definiert wurden.

Das vorherige Beispiel kann mit dem folgenden Befehl erweitert werden, um Nutzungsstatistiken und die Erfassung von Crash-Dumps zu erfassen:

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

Andere Metadaten-Flags

Metadatenschlüssel Beschreibung Standardverhalten
cos-update-strategy Gibt das Updateverhalten an. Der einzige akzeptierte Wert ist update_disabled. Ist nichts festgelegt:
  • cos-dev und cos-beta: Updates der neuesten Betriebssystemversion in der entsprechenden Image-Familie
  • „Langzeitsupport“ und „cos-stable“: Updates der neuesten Betriebssystemversion vom selben Meilenstein
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, die API oder die Google Cloud Console verwenden, um ein Bootlaufwerk bereitzustellen. Weitere Informationen finden Sie unter Startup-Skripts 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 deaktivieren

Automatische Updates lassen sich auf zwei Arten deaktivieren. In der Regel ist es am besten, den Metadatenschlüssel der Instanz cos-update-strategy zu verwenden:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata cos-update-strategy=update_disabled

Ab Meilenstein 97 können Sie auch automatische Updates in den Projektmetadaten deaktivieren:

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