Blog

Wie man ein Container-Image auf Google Container Optimized OS ausführt

Mark van Holsteijn

Aktualisiert Oktober 16, 2025
5 Minuten

Manchmal hat Google Compute Engine einfach alles, was Sie brauchen: Rechenleistung, Speicherplatz, Lastausgleich, automatische Skalierung. In diesem Blog sehen Sie, wie Sie ein Container-Image im Cloud-native-Stil direkt auf einer Google Container Optimized OS-Instanz ausführen können, indem Sie cloud-init und terraform

Sie können ein Container-Image auf Google Container Optimized OS in nur drei Schritten ausführen.

  1. eine systemd-Diensteinheit definieren
  2. eine Cloud-Init-Konfiguration definieren
  3. eine von Google Compute Engine verwaltete Instanzgruppe definieren

Wenn Sie das Gelaber überspringen wollen, sehen Sie sich den Quellcode an

eine systemd-Diensteinheit definieren

Systemd ist ein wunderbarer System- und Dienstmanager, der auf den meisten Linux-Betriebssystemen läuft, darunter auch cos. Die Diensteinheit definiert einen Prozess, den Sie auf dem System ausführen möchten. Systemd kümmert sich darum, dass der Dienst gestartet und während seiner Lebensdauer am Laufen gehalten wird.

Die Konfiguration der systemd-Diensteinheit sieht wie folgt aus:

[Unit]
Description=The paas-monitor

[Service]
Type=simple

User=paas-monitor
Group=paas-monitor

ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
ExecStop=/usr/bin/docker stop paas-monitor

ExecStart=/usr/bin/docker run 
    --rm 
    --name paas-monitor 
    --publish 80:80 
    gcr.io/binx-io-public/paas-monitor:0.4.3 
    --port 80

Restart=always
SuccessExitStatus=0 SIGTERM

[Install]
WantedBy=multi-user.target
BindsTo=firewall-config.service

In der Konfigurationsdatei können Sie sehen, dass der Prozess unter dem Benutzer paas-monitor startet. Damit soll sichergestellt werden, dass der Docker Credential Helper die Datei ~/.docker/config.json aktualisieren kann. Sie können die Docker-Konfiguration unter Container Optimized OS nicht als Root-Benutzer ausführen, da das Root-Home-Verzeichnis schreibgeschützt gemountet ist.

Der paas-monitor ist eine Anwendung, mit der Sie Anwendungsplattformen beobachten können, während sie ihre Arbeit verrichten.

Beachten Sie, dass im Abschnitt install erwähnt wird, dass er an die unten gezeigte firewall-config.service gebunden ist:

[Unit]
Description=Configures the host firewall

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
ExecStop=/sbin/iptables -A INPUT -p tcp --dport 80 -j DROP

Dieser Dienst öffnet Port 80 der Firewall und wird vor dem Start des paas-monitor-Dienstes gestartet. Umgekehrt stoppt er, wenn der paas-monitor-Dienst beendet wird.

Um die Anwendung auszuführen, kopieren Sie die beiden Dienstkonfigurationsdateien in das Verzeichnis /etc/systemd/system und geben systemctl daemon-reload gefolgt von systemctl start paas-monitor.service

eine Cloud-Init-Konfiguration definieren

Um eine systemd-Diensteinheit auf einer virtuellen Maschine zu konfigurieren, haben Sie mindestens zwei Möglichkeiten: Entweder Sie erstellen ein neues Image einer virtuellen Maschine oder Sie erstellen eine Cloud-Init-Konfiguration.

Die Erstellung einer neuen virtuellen Maschine ist zwar das Nonplusultra der "unveränderlichen Infrastruktur", aber auch sehr langsam. Als gute Zwischenlösung können Sie eine Cloud-init-Konfigurationsdatei definieren. Mit Cloud-init können Sie die Konfiguration des Betriebssystems während des Bootvorgangs ergänzen. Sie ist schnell und bietet gleichzeitig eine hervorragende Reproduzierbarkeit der Konfiguration der virtuellen Maschine.

Die Cloud-init-Konfiguration sieht wie folgt aus:

#cloud-config  
users:  
  - name: paas-monitor  
    groups: docker  

runcmd:  
  - systemctl daemon-reload  
  - systemctl start paas-monitor.service

write_files:  
  - path: /etc/systemd/system/paas-monitor.service  
    permissions: '0644'  
    owner: root  
    content: |  
        [Unit]
        Description=The paas-monitor

        [Service]
        Type=simple

        User=paas-monitor
        Group=paas-monitor

        ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
        ExecStop=/usr/bin/docker stop paas-monitor

        ExecStart=/usr/bin/docker run 
            --rm 
            --name paas-monitor 
            --publish 80:80 
            gcr.io/binx-io-public/paas-monitor:0.4.3 
            --port 80

        Restart=always
        SuccessExitStatus=0 SIGTERM

        [Install]
        WantedBy=multi-user.target
        BindsTo=firewall-config.service

  - path: /etc/systemd/system/firewall-config.service
    permissions: 0644
    owner: root
    content: |
      [Unit]
      Description=Configures the host firewall

      [Service]
      Type=oneshot
      RemainAfterExit=true
      ExecStart=/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
      ExecStop=/sbin/iptables -A INPUT -p tcp --dport 80 -j DROP

Als erstes werden Sie feststellen, dass ein Benutzer paas-monitor erstellt wird, der der Gruppe docker hinzugefügt wird. Die weist systemd an, die Konfiguration zu laden und den Dienst zu starten. Der Abschnitt write_files schreibt die zuvor definierte Konfiguration der Diensteinheit.

eine von Google Compute Engine verwaltete Instanzgruppe definieren

Um eine von Google Compute Engine verwaltete Instanzgruppe zur Ausführung Ihres Dienstes zu definieren, erstellen Sie eine Vorlage, die Ihre cloud-init Konfiguration als user-data Metadaten an die virtuelle Maschine weitergibt, wie unten in Zeile 9 gezeigt.

resource "google_compute_instance_template" "paas-monitor" {  
  name_prefix = "paas-monitor"  
  description = "showing what happens"

  instance_description = "paas-monitor"  
  machine_type         = "e2-micro"  

  metadata = {  
    "user-data" = file("user-data.yaml")  
  }  

  disk {  
    source_image = "cos-cloud/cos-stable"  
    auto_delete  = true  
    boot         = true  
  }

  network_interface {  
    network = "default"  

    access_config {}  
  }  

  scheduling {  
    automatic_restart   = false  
    preemptible         = true  
    on_host_maintenance = "TERMINATE"  
  }  

  lifecycle {  
    create_before_destroy = true  
  }  
}

Jetzt, wo die virtuelle Maschine mit Ihrer cloud-init Konfigurationsdatei konfiguriert ist, können Sie diese Vorlage in einer verwalteten Instanzgruppendefinition verwenden:

resource "google_compute_region_instance_group_manager" "paas-monitor" {  
  name = "paas-monitor"  

  base_instance_name = "paas-monitor"  

  target_size = 1  

  version {  
    instance_template = google_compute_instance_template.paas-monitor.id  
  }  

  update_policy {
    type                           = "PROACTIVE"
    minimal_action                 = "RESTART"
    most_disruptive_allowed_action = "REPLACE"
    max_surge_fixed                = local.number_of_zones + 1
    max_unavailable_fixed          = local.number_of_zones
  }

  named_port {
    name = "paas-monitor"
    port = 80
  }

  auto_healing_policies {
    health_check      = google_compute_health_check.paas-monitor.id
    initial_delay_sec = 30
  }
}

resource "google_compute_health_check" "paas-monitor" {
  name        = "paas-monitor"
  description = "paas-monitor health check"

  timeout_sec         = 1
  check_interval_sec  = 1
  healthy_threshold   = 4
  unhealthy_threshold = 5

  http_health_check {
    port_name    = "paas-monitor"
    request_path = "/health"
    response     = "ok"
  }
}

data "google_compute_zones" "available" {
}

locals {
   number_of_zones = length(data.google_compute_zones.available.names)
}

Wie Sie sehen können, verweist die verwaltete Instanzgruppe auch auf die Instanzvorlage in Zeile 9. Das Schöne an der Verwendung einer verwalteten Instanzgruppe ist, dass sie sicherstellt, dass die gewünschte Anzahl von virtuellen Maschinen läuft. Die Zustandsprüfung stellt sicher, dass sie sich um rollierende Aktualisierungen kümmert, falls dies einmal erforderlich sein sollte. Dies geschieht, wenn Sie das Boot-Image der virtuellen Maschinen aktualisieren möchten. Kleinere Aktualisierungen, wie z.B. die Änderung des Cloud-Init, werden einfach durch einen Neustart der virtuellen Maschinen durchgeführt.

Fazit

Durch die Nutzung der Basisdienste von Google Compute Engine, Google Container Optimized OS, cloud-init und terraform ist es sehr einfach, Anwendungen im Cloud-Native-Stil mit Standardtools bereitzustellen, ohne mehr Komplexität als unbedingt nötig einzuführen.

Beachten Sie, dass die verwaltete Instanzgruppe als Ziel für einen Backend-Dienst eines Google Load Balancer verwendet werden kann. Sie können sogar einen Autoscaler einbauen, um das Ganze abzurunden. Einzelheiten dazu finden Sie in diesem Blog.

Bild von Brian Sarubbi aus Pixabay

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.