Container-Webserveranwendung bereitstellen

In dieser Anleitung wird beschrieben, wie Sie eine Containeranwendung in einer GDC-Umgebung (Google Distributed Cloud) mit Air Gap hochladen und in einem freigegebenen Kubernetes-Cluster ausführen. Eine containerisierte Arbeitslast wird in einem gemeinsamen Kubernetes-Cluster in einem Projekt-Namespace ausgeführt. Gemeinsam genutzte Cluster sind logisch von Projekten und voneinander getrennt, um unterschiedliche Fehlerbereiche und Isolierungsgarantien zu bieten. Ihr freigegebener Cluster muss jedoch an ein Projekt angehängt sein, damit containerisierte Arbeitslasten in einem Projekt verwaltet werden können.

Dieser Workflow richtet sich an Anwendungsentwickler in der Gruppe der Anwendungsoperatoren, die für die Erstellung von Anwendungsarbeitslasten für ihre Organisation verantwortlich sind. Weitere Informationen finden Sie unter Dokumentation zu Zielgruppen für GDC mit Air Gap.

Eines der größten Hindernisse bei der 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.

Ziele

  • Verwaltete Harbor-Registry erstellen
  • Container-Image per Push an die verwaltete Harbor-Registry übertragen
  • Gemeinsamen 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 auf die GDC-Bereitstellung beschränkt und werden nicht von anderen Google-Produkten verwaltet.

Mit dem Preisrechner können Sie eine Kostenschätzung Ihrer voraussichtlichen 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 die Speicher- und Compute-Nutzung zu verfolgen.

Hinweis

Um die Aufgaben in diesem Dokument auszuführen, müssen Sie die erforderlichen Berechtigungen anfordern und Ihre Umgebung vorbereiten.

IAM-Rollen anfordern

Sie benötigen bestimmte Rollen, um die Berechtigungen zu erhalten, die für die Durchführung dieses Tutorials erforderlich sind. Sie müssen Rollen anfordern, die auf Ihr Projekt und Ihre Organisation beschränkt sind.

Organisationsrollen

Wenn Sie einen freigegebenen Kubernetes-Cluster erstellen, löschen, bearbeiten oder ansehen möchten, bitten Sie Ihren IAM-Administrator der Organisation, Ihnen die Rolle User Cluster Admin (user-cluster-admin) zuzuweisen. Diese Rolle ist nicht an einen Namespace gebunden.

Wenn Sie nicht die Berechtigungen zum Erstellen eines freigegebenen Clusters haben, bitten Sie Ihren Plattformadministrator, einen für Sie zu erstellen.

Projektrollen

Bitten Sie Ihren Projekt-IAM-Administrator, Ihnen die folgenden Rollen in Ihrem Projekt-Namespace zuzuweisen, je nachdem, welche Aufgabe Sie ausführen möchten:

  • Namespace-Administrator (namepspace-admin): Projektressourcen erstellen, löschen, bearbeiten und ansehen. Diese Rolle ist erforderlich, um Containerarbeitslasten in Ihrem Projekt bereitzustellen.

  • Harbor Instance Admin (harbor-instance-admin): Harbor-Ressourcen, einschließlich Harbor-Instanzen, erstellen, löschen, bearbeiten und ansehen.

  • Harbor Instance Viewer (harbor-instance-viewer): Hiermit können Sie eine Harbor-Instanz ansehen und auswählen.

  • Harbor Project Creator (harbor-project-creator): Erstellen und ansehen von Harbor-Projekten.

Umgebung vorbereiten

Für dieses Dokument benötigen Sie die folgenden Ressourcen:

  1. Sie benötigen ein Projekt, um Ihre containerisierten Bereitstellungen zu verwalten. Erstellen Sie ein Projekt, falls Sie noch keines haben.

  2. Legen Sie den Namespace Ihres Projekts als Umgebungsvariable fest:

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. Laden Sie die gcloud CLI herunter und installieren Sie sie.

  4. Melden Sie sich beim zonalen Management-API-Server an und generieren Sie die 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 mit Air Gap 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-Registry-Instanz und ein Harbor-Projekt erstellen.

Harbor-Registry-Instanz erstellen

So erstellen Sie eine Harbor-Containerregistrierungsinstanz:

Console

  1. Wählen Sie im Navigationsmenü im Bereich CI/CD die Option Harbor Container Registry aus.

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

  3. Klicken Sie auf Instanz erstellen.

  4. Geben Sie den Namen der Instanz ein und akzeptieren Sie die Nutzungsbedingungen für die verwaltete Harbor-Instanz.

  5. Klicken Sie auf Instanz erstellen.

  6. Prüfen Sie, ob Ihre neue Harbor-Instanz im Abschnitt Harbor Instance (Harbor-Instanz) vorhanden ist.

  7. 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 nicht das Präfix https:// enthalten.

  8. Legen Sie die Instanz-URL als Variable fest, die Sie später in der Anleitung verwenden:

    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

  1. Erstellen Sie die neue Harbor-Container-Registry-Instanz:

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT \
    

    Ersetzen Sie Folgendes:

    • INSTANCE_NAME: der Name der Harbor-Instanz.
    • PROJECT: der Name des GDC-Projekts.
  2. 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
    
  3. Legen Sie die Instanz-URL als Variable fest, die Sie später in der Anleitung verwenden:

    export INSTANCE_URL=INSTANCE_URL
    

    Ersetzen Sie INSTANCE_URL durch die URL der Harbor-Registry-Instanz. Die Instanz-URL darf nicht das Präfix https:// enthalten.

    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

  1. Klicken Sie auf der Seite Harbor Container Registry (Harbor-Container-Registry) auf Create A Harbor Project (Harbor-Projekt erstellen).

  2. Geben Sie den Namen des Projekts ein.

  3. Klicken Sie auf Erstellen.

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

  1. 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.
  2. 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:

  1. Konfigurieren Sie Docker so, dass Harbor als Dienst vertraut wird. Weitere Informationen finden Sie unter Docker so konfigurieren, dass der Harbor-Stammzertifizierungsstelle vertraut wird.

  2. Konfigurieren Sie die Docker-Authentifizierung für Harbor. Weitere Informationen finden Sie unter Docker-Authentifizierung für Harbor-Registrierungsinstanzen konfigurieren.

Kubernetes-Secret zum Abrufen von Images erstellen

Da Sie ein privates Harbor-Projekt verwenden, müssen Sie ein Kubernetes-Image-Pull-Secret erstellen.

  1. Fügen Sie ein Harbor-Projektroboterkonto hinzu, das als Dienstkonto verwendet werden soll.

    1. Wählen Sie in der Harbor-Konsole Ihr Harbor-Projekt aus.

    2. Klicken Sie auf Robot Accounts (Roboterkonten).

    3. Wählen Sie Neues Roboterkonto aus.

    4. Geben Sie Ihrem neuen Roboter-Konto einen Namen und legen Sie zusätzliche Einstellungen fest.

    5. Klicken Sie auf Hinzufügen.

    6. Der Name und das Secret des Roboterkontos werden auf dem Erfolgsbildschirm angezeigt. Lassen Sie diesen Bildschirm geöffnet, damit Sie im nächsten Schritt darauf zugreifen können.

    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.

  2. Melden Sie sich in einem neuen Terminalfenster mit Ihrem Harbor-Projektroboterkonto und Ihrem geheimen Token bei Docker an:

    docker login ${INSTANCE_URL}
    

    Geben Sie bei Aufforderung den Namen des Roboterprojekts als Nutzername und das geheime Token als Passwort ein, die im vorherigen Schritt auf dem Erfolgsbildschirm der Harbor-Konsole angegeben wurden.

  3. Legen Sie einen beliebigen Namen für das Image-Pull-Secret fest:

    export SECRET=SECRET
    
  4. Erstellen Sie das Secret, das für das Abrufen des Images erforderlich ist:

    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.

  5. 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-nginx-Webserver-App in einem gemeinsam genutzten Kubernetes-Cluster bereitzustellen. Die Nginx-Webserver-App ist im öffentlichen Docker Hub-Repository verfügbar.

  1. Laden Sie das nginx-Image von Docker Hub über ein externes Netzwerk auf Ihre lokale Workstation herunter:

    docker pull nginx
    
  2. Taggen Sie das lokale Image mit dem Repository-Namen:

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. Ü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 gemeinsam genutzten Kubernetes-Cluster, um den Nginx-Webserver auszuführen.

Console

  1. Wählen Sie im Navigationsmenü Kubernetes Engine > Cluster aus.

  2. Klicken Sie auf Cluster erstellen.

  3. Geben Sie im Feld Name einen Namen für den Cluster an.

  4. 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 Hochverfügbarkeit zu gewährleisten.

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

  6. Klicken Sie auf Erstellen.

  7. Warten Sie, bis der Cluster erstellt wurde. Wenn der Cluster verwendet werden kann, wird neben dem Clusternamen der Status READY angezeigt.

API

  1. 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 CLUSTER_NAME durch den Namen des Clusters.

  2. Wenden Sie die benutzerdefinierte Ressource auf Ihre GDC-Instanz an:

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. Hängen Sie ein Projekt an Ihren Kubernetes-Cluster an. Derzeit können Sie kein Projekt über die API an den Cluster anhängen.

Weitere Informationen zum Erstellen eines freigegebenen Kubernetes-Clusters finden Sie unter Freigegebenen Cluster erstellen. Weitere Informationen zu den verfügbaren Clusterkonfigurationsoptionen finden Sie unter Kubernetes-Clusterkonfigurationen.

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. Normalerweise stellen Sie Pods als eine Reihe von Replikaten bereit, die gemeinsam in Ihrem Cluster skaliert und verteilt werden können. Eine Möglichkeit, einen Satz von Replikaten bereitzustellen, besteht in der Nutzung eines Deployment von Kubernetes.

In diesem Abschnitt erstellen Sie ein Kubernetes-Deployment, um die nginx-Container-App in Ihrem Cluster auszuführen. Dieses Deployment hat Replikate oder Pods. Ein Deployment-Pod enthält nur einen Container: das Container-Image nginx. Außerdem erstellen Sie eine Service-Ressource, über die Clients Anfragen stabil an die Pods Ihrer Deployment senden können.

Stellen Sie den Nginx-Webserver in Ihrem Kubernetes-Cluster bereit:

  1. 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
    
  2. Erstellen und stellen Sie die benutzerdefinierten Kubernetes-Ressourcen Deployment und Service 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
    
  3. Prüfen Sie, ob die Pods vom Deployment 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
    
  4. Erstellen Sie eine Netzwerkrichtlinie, die den gesamten Netzwerkverkehr zum Namespace zulässt:

    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
    
  5. 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}'`
    
  6. Testen Sie die nginx-Server-IP-Adresse mit curl:

      curl http://$IP
    

Bereinigen

Wenn Sie vermeiden möchten, dass Ihrem GDC-Konto 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, können Sie entweder die Harbor-Instanz löschen, die das Image enthält, oder die Harbor-Instanz beibehalten und das einzelne Container-Image löschen.

So löschen Sie das Container-Image aus der verwalteten Harbor-Registrierung über die GDC-Konsole:

  1. Wählen Sie im Navigationsmenü im Bereich CI/CD die Option Harbor Container Registry aus.

  2. Klicken Sie auf den externen Link Go to Harbor Instance (Zur Harbor-Instanz).

  3. 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, können Sie entweder das GDC-Projekt löschen, das die Ressourcen enthält, oder das GDC-Projekt beibehalten und die einzelnen Ressourcen löschen.

So löschen Sie die einzelnen Ressourcen:

  1. Löschen Sie das Service-Objekt für Ihre Container-App:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. Löschen Sie das Deployment-Objekt für Ihre Container-App:

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. 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