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

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.
- eine systemd-Diensteinheit definieren
- eine Cloud-Init-Konfiguration definieren
- 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 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.
Unsere Ideen
Weitere Blogs
Contact



