In dieser Anleitung wird beschrieben, wie Sie eine Containeranwendung in einer GDC-Umgebung (Google Distributed Cloud) ohne Internetverbindung hochladen und in einem Kubernetes-Cluster ausführen. Eine containerisierte Arbeitslast wird in einem Kubernetes-Cluster in einem Projekt-Namespace ausgeführt. Cluster sind logisch von Projekten und voneinander getrennt, um unterschiedliche Fehlerbereiche und Isolierungsgarantien zu bieten. Sie müssen jedoch dafür sorgen, dass Ihr Cluster an ein Projekt angehängt ist, damit containerisierte Arbeitslasten in einem Projekt verwaltet werden können.
Eines der größten Hindernisse für die Bereitstellung einer Container-App ist das Übertragen der Binärdatei für die App in Ihr Air-Gap-Rechenzentrum. Arbeiten Sie mit Ihrem Infrastrukturteam und Ihren Administratoren zusammen, um die Anwendung auf Ihren Arbeitsplatz zu übertragen oder dieses Tutorial direkt auf Ihrem CI/CD-Server (Continuous Integration/Continuous Delivery) zu implementieren.
In dieser Anleitung wird eine Beispiel-Webserver-App verwendet, die in der Google CloudArtifact Registry verfügbar ist.
Lernziele
- Verwaltete Harbor-Registry erstellen
- Container-Image per Push in die verwaltete Harbor-Registry übertragen
- Kubernetes-Cluster erstellen
- Beispiel-Containeranwendung im Cluster bereitstellen
Kosten
Da GDC für die Ausführung in einem Air-Gapped-Rechenzentrum konzipiert ist, sind Abrechnungsprozesse und ‑informationen nur auf die GDC-Bereitstellung beschränkt und werden nicht von anderen Google-Produkten verwaltet.
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Mit dem Dashboard für geschätzte Kosten können Sie zukünftige SKU-Kosten für Ihre Rechnungen prognostizieren.
Verwenden Sie die Dashboards zur Abrechnungsnutzung, um den Speicher- und Compute-Verbrauch zu verfolgen.
Hinweise
Sie benötigen ein Projekt, um Ihre containerisierten Bereitstellungen zu verwalten. Erstellen Sie ein Projekt, falls Sie noch keines haben.
Legen Sie den Namespace Ihres Projekts als Umgebungsvariable fest:
export NAMESPACE=PROJECT_NAMESPACE
Bitten Sie Ihren IAM-Administrator der Organisation, Ihnen die folgenden Rollen zuzuweisen:
Rolle „Namespace-Administrator“ (
namepspace-admin
) für Ihren Projekt-Namespace. Diese Rolle ist erforderlich, um Containerarbeitslasten in Ihrem Projekt bereitzustellen.Rolle „Harbor-Instanzadministrator“ (
harbor-instance-admin
) für den Namespace Ihres Projekts. Diese Rolle ist für den Lese- und Schreibzugriff auf alle Harbor-Ressourcen erforderlich. Sie ist auch erforderlich, um Harbor-Instanzen zu löschen.Rolle „Harbor Instance Viewer“ (
harbor-instance-viewer
) für den Namespace Ihres Projekts. Diese Rolle ist erforderlich, um eine Harbor-Instanz aufzurufen und auszuwählen.Rolle „Harbor Project Creator“ (
harbor-project-creator
) für Ihren Projektnamespace. Diese Rolle ist erforderlich, um auf ein Harbor-Projekt zuzugreifen und es zu verwalten.Rolle „User Cluster Admin“ (
user-cluster-admin
): Diese Rolle ist erforderlich, um einen Kubernetes-Cluster zu erstellen, und ist nicht an einen Namespace gebunden.
Melden Sie sich beim zonalen Management-API-Server an und generieren Sie die zugehörige kubeconfig-Datei mit einer Nutzeridentität. Legen Sie den kubeconfig-Pfad als Umgebungsvariable fest:
export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
Verwaltete Harbor-Registry erstellen
GDC Air-Gapped bietet Harbor as a Service, einen vollständig verwalteten Dienst, mit dem Sie Container-Images mit Harbor speichern und verwalten können.
Wenn Sie Harbor as a Service verwenden möchten, müssen Sie zuerst eine Harbor-Registrierungsinstanz und ein Harbor-Projekt erstellen.
Harbor-Registry-Instanz erstellen
So erstellen Sie eine Harbor-Container-Registry-Instanz:
Console
Wählen Sie im Navigationsmenü im Bereich CI/CD die Option Harbor Container Registry aus.
Wählen Sie die Zone aus, in der Sie Ihre Harbor-Instanz erstellen möchten. Eine Harbor-Instanz ist eine zonale Ressource und muss in jeder Zone manuell erstellt werden, um eine hohe Verfügbarkeit zu gewährleisten.
Klicken Sie auf Instanz erstellen.
Geben Sie den Namen der Instanz ein und akzeptieren Sie die Nutzungsbedingungen für den verwalteten Harbor-Dienst.
Klicken Sie auf Instanz erstellen.
Prüfen Sie, ob Ihre neue Harbor-Instanz im Abschnitt Harbor Instance (Harbor-Instanz) vorhanden ist.
Klicken Sie auf den externen Link Go to Harbor Instance (Zur Harbor-Instanz wechseln) und notieren Sie sich die Instanz-URL. Das Format der Instanz-URL ähnelt beispielsweise
harbor-1.org-1.zone1.google.gdc.test
. Die Instanz-URL darf das Präfixhttps://
nicht enthalten.Legen Sie die Instanz-URL als Variable fest, die später in der Anleitung verwendet werden soll:
export INSTANCE_URL=INSTANCE_URL
Ersetzen Sie INSTANCE_URL durch die URL der Harbor-Registry-Instanz.
Beispiel:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
Erstellen Sie die neue Harbor-Containerregistrierungsinstanz:
gdcloud harbor instances create INSTANCE_NAME \ --project=PROJECT \
Ersetzen Sie Folgendes:
INSTANCE_NAME
: der Name der Harbor-Instanz.PROJECT
: der Name des GDC-Projekts.
URL der Instanz auflisten:
gdcloud harbor instances describe INSTANCE_NAME \ --project=PROJECT
Die Ausgabe sieht dann ungefähr so aus:
# Several lines of code are omitted here. status: url: https://harbor-1.org-1.zone1.google.gdc.test
Legen Sie die Instanz-URL als Variable fest, die später in der Anleitung verwendet werden soll:
export INSTANCE_URL=INSTANCE_URL
Ersetzen Sie INSTANCE_URL durch die URL der Harbor-Registry-Instanz. Achten Sie darauf, dass die Instanz-URL nicht das Präfix
https://
enthält.Beispiel:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
Harbor-Projekt in der Registry erstellen
Sie müssen ein Harbor-Projekt in der Harbor-Registry-Instanz erstellen, um Ihre Container-Images zu verwalten:
Console
Klicken Sie auf der Seite Harbor Container Registry auf Create A Harbor Project (Harbor-Projekt erstellen).
Geben Sie den Namen des Projekts ein.
Klicken Sie auf Erstellen.
Legen Sie den Namen des Harbor-Projekts als Variable fest, die Sie später in der Anleitung verwenden können:
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
Erstellen Sie das neue Harbor-Projekt:
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=PROJECT \ --instance=INSTANCE_NAME
Ersetzen Sie Folgendes:
HARBOR_PROJECT
: Der Name des zu erstellenden Harbor-Projekts.PROJECT
: der Name des GDC-Projekts.INSTANCE_NAME
: der Name der Harbor-Instanz.
Legen Sie den Namen des Harbor-Projekts als Variable fest, die Sie später in der Anleitung verwenden können:
export HARBOR_PROJECT=HARBOR_PROJECT
Docker konfigurieren
Führen Sie die folgenden Schritte aus, um Docker in Ihrer Harbor-Registry zu verwenden:
Konfigurieren Sie Docker so, dass Harbor als Dienst vertraut wird. Weitere Informationen finden Sie unter Docker so konfigurieren, dass der Harbor-Stammzertifizierungsstelle vertraut wird.
Konfigurieren Sie die Docker-Authentifizierung für Harbor. Weitere Informationen finden Sie unter Docker-Authentifizierung für Harbor-Registry-Instanzen konfigurieren.
Kubernetes-Secret zum Abrufen von Images erstellen
Da Sie ein privates Harbor-Projekt verwenden, müssen Sie ein Kubernetes-Image-Pull-Secret erstellen.
Fügen Sie ein Harbor-Projektroboterkonto als Dienstkonto hinzu.
Wählen Sie in der Harbor-Konsole Ihr Harbor-Projekt aus.
Klicken Sie auf Robot-Konten.
Wählen Sie Neues Roboter-Konto aus.
Geben Sie Ihrem neuen Roboter-Konto einen Namen und legen Sie zusätzliche Einstellungen fest.
Klicken Sie auf Hinzufügen.
Der Name und das Secret des Roboterkontos werden auf dem Erfolgsbildschirm angezeigt. Lassen Sie diesen Bildschirm für den nächsten Schritt geöffnet.
Weitere Informationen finden Sie in der Dokumentation von Harbor: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.
Melden Sie sich in einem neuen Terminalfenster mit Ihrem Harbor-Projektroboterkonto und dem geheimen Token bei Docker an:
docker login ${INSTANCE_URL}
Geben Sie bei Aufforderung den Namen des Roboterprojekts für den Nutzernamen und das geheime Token für das Passwort ein, die im vorherigen Schritt auf dem Erfolgsbildschirm der Harbor-Konsole angegeben wurden.
Legen Sie einen beliebigen Namen für das Image-Pull-Secret fest:
export SECRET=SECRET
Erstellen Sie das für das Pullen des Images erforderliche Secret:
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n ${NAMESPACE}
Ersetzen Sie
DOCKER_CONFIG
durch den Pfad zur Datei.docker/config.json
.Prüfen Sie, ob Ihr Secret im Namespace Ihres GDC-Projekts vorhanden ist:
kubectl get secrets -n ${NAMESPACE}
Die Ausgabe sieht etwa so aus:
NAME TYPE DATA AGE my-secret kubernetes.io/dockerconfigjson 1 23s
Container-Image per Push an die verwaltete Harbor-Registry übertragen
In dieser Anleitung laden Sie das nginx
-Webserver-Image herunter und übertragen es in die verwaltete Harbor-Registry. Anschließend verwenden Sie es, um eine Beispiel-App für den nginx-Webserver in einem Kubernetes-Cluster bereitzustellen. Die Nginx-Webserver-App ist im öffentlichen Docker Hub-Repository verfügbar.
Rufen Sie das
nginx
-Image über ein externes Netzwerk aus Docker Hub auf Ihre lokale Workstation ab:docker pull nginx
Taggen Sie das lokale Image mit dem Repository-Namen:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
Übertragen Sie das
nginx
-Container-Image per Push an Ihre verwaltete Harbor-Registry:docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
Kubernetes-Cluster erstellen
Nachdem Sie das nginx
-Container-Image in der verwalteten Harbor-Registry gespeichert haben und darauf zugreifen können, erstellen Sie einen Kubernetes-Cluster, um den nginx-Webserver auszuführen.
Console
Wählen Sie im Navigationsmenü Kubernetes Engine > Cluster aus.
Klicken Sie auf Cluster erstellen.
Geben Sie im Feld Name einen Namen für den Cluster an.
Wählen Sie die Zone aus, in der Sie Ihren Kubernetes-Cluster erstellen möchten. Ein Kubernetes-Cluster ist eine zonale Ressource und muss in jeder Zone manuell erstellt werden, um eine hohe Verfügbarkeit zu gewährleisten.
Klicken Sie auf Projekt anhängen und wählen Sie ein Projekt aus, das Sie an Ihren Cluster anhängen möchten. Klicken Sie dann auf Speichern.
Klicken Sie auf Erstellen.
Warten Sie, bis der Cluster erstellt wurde. Wenn der Cluster verwendet werden kann, wird neben dem Clusternamen der Status
READY
angezeigt.
API
Erstellen Sie eine benutzerdefinierte Ressource vom Typ
Cluster
und speichern Sie sie als YAML-Datei, z. B.cluster.yaml
:apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform
Ersetzen Sie den Wert für
CLUSTER_NAME
durch den Namen des Clusters.Wenden Sie die benutzerdefinierte Ressource auf Ihre GDC-Instanz an:
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
Hängen Sie ein Projekt an Ihren Kubernetes-Cluster an. Derzeit können Sie kein Projekt mithilfe der API an den Cluster anhängen.
Weitere Informationen zum Erstellen eines Kubernetes-Clusters finden Sie unter Kubernetes-Cluster erstellen.
Beispielcontainer-App bereitstellen
Sie können jetzt das nginx
-Container-Image in Ihrem Kubernetes-Cluster bereitstellen.
Kubernetes stellt Anwendungen als Pod
-Ressourcen dar. Dies sind skalierbare Einheiten, die einen oder mehrere Container enthalten. Der Pod ist die kleinste bereitstellbare Einheit in Kubernetes. In der Regel werden Pods als eine Reihe von Replikaten bereitgestellt, die skaliert und über den Cluster verteilt werden können. Eine Möglichkeit, einen Satz von Replikaten bereitzustellen, ist ein Kubernetes-Deployment
.
In diesem Abschnitt erstellen Sie ein Kubernetes-Deployment
, um die nginx
-Containeranwendung in Ihrem Cluster auszuführen. Dieses Deployment hat Replikate oder Pods. Ein Deployment
-Pod enthält nur einen Container: das nginx
-Container-Image. Außerdem erstellen Sie eine Service
-Ressource, die Clients eine stabile Möglichkeit bietet, Anfragen an die Pods Ihres Deployment
zu senden.
Stellen Sie den nginx-Webserver in Ihrem Kubernetes-Cluster bereit:
Melden Sie sich im Kubernetes-Cluster an und generieren Sie die kubeconfig-Datei mit einer Nutzeridentität. Legen Sie den kubeconfig-Pfad als Umgebungsvariable fest:
export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
Erstellen und stellen Sie die benutzerdefinierten Kubernetes-Ressourcen
Deployment
undService
bereit:kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25 ports: - containerPort: 80 imagePullSecrets: - name: ${SECRET} --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - port: 80 protocol: TCP type: LoadBalancer EOF
Prüfen Sie, ob die Pods von der Bereitstellung erstellt wurden:
kubectl get pods -l app=nginx -n ${NAMESPACE}
Die Ausgabe sieht etwa so aus:
NAME READY STATUS RESTARTS AGE nginx-deployment-1882529037-6p4mt 1/1 Running 0 1h nginx-deployment-1882529037-p29za 1/1 Running 0 1h nginx-deployment-1882529037-s0cmt 1/1 Running 0 1h
Erstellen Sie eine Netzwerkrichtlinie, um den gesamten Netzwerk-Traffic zum Namespace zuzulassen:
kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOF
Exportieren Sie die IP-Adresse für den
nginx
-Dienst:export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \ -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
Testen Sie die
nginx
-Server-IP-Adresse mitcurl
:curl http://$IP
Bereinigen
Damit Ihrem GDC-Konto keine Gebühren für die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden, müssen Sie die erstellten Ressourcen löschen.
Container-Image löschen
Wenn Sie das Container-Image aus Ihrer GDC-Umgebung ohne Internetverbindung löschen möchten, löschen Sie entweder die Harbor-Instanz, die das Image enthält, oder behalten Sie die Harbor-Instanz bei und löschen Sie das einzelne Container-Image.
So löschen Sie das Container-Image aus der verwalteten Harbor-Registry über die GDC-Konsole:
Wählen Sie im Navigationsmenü im Bereich CI/CD die Option Harbor Container Registry aus.
Klicken Sie auf den externen Link Go to Harbor Instance (Zur Harbor-Instanz).
Löschen Sie das Container-Image über die Harbor-UI. Weitere Informationen finden Sie unter Harbor-Registrierungsinstanzen löschen.
Container-App löschen
Wenn Sie die bereitgestellte Container-App löschen möchten, löschen Sie entweder das GDC-Projekt, das die Ressourcen enthält, oder Sie behalten das GDC-Projekt bei und löschen die einzelnen Ressourcen.
Führen Sie die folgenden Schritte aus, um die einzelnen Ressourcen zu löschen:
Löschen Sie das
Service
-Objekt für Ihre Container-App:kubectl delete service nginx-service -n ${NAMESPACE}
Löschen Sie das
Deployment
-Objekt für Ihre Container-App:kubectl delete deployment nginx-deployment -n ${NAMESPACE}
Wenn Sie einen Kubernetes-Testcluster nur für diese Anleitung erstellt haben, löschen Sie ihn:
kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \ -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
Dadurch werden die Ressourcen des Kubernetes-Clusters gelöscht, z. B. die Compute-Instanzen, Laufwerke und Netzwerkressourcen:
Nächste Schritte
Ressourcenhierarchie und Details zur Ressourcenisolation
Informationen zum Verwalten von Containern, die in Ihren Kubernetes-Clustern bereitgestellt werden, finden Sie in der Dokumentation Kubernetes-Container für GDC.
Best Practices zum Einrichten Ihrer Containerarbeitslasten und anderer Dienstressourcen.