Container-Webserveranwendung bereitstellen

In dieser Anleitung wird beschrieben, wie Sie eine Containeranwendung in einer isolierten Google Distributed Cloud (GDC)-Appliance-Umgebung hochladen und in dieser Umgebung ausführen. Sie erfahren, wie Sie Harbor-Projekte erstellen, Bilder in Harbor hochladen und Arbeitslasten erstellen. Eine containerisierte Arbeitslast wird in einem Projektnamespace ausgeführt.

Die isolierte GDC-Appliance-Umgebung enthält eine vorkonfigurierte Harbor Registry namens tear-harbor in einem GDC-Projekt namens tear. Diese Registry wird in diesem Beispiel verwendet.

In dieser Anleitung wird eine Beispiel-Webserver-App verwendet, die in der Google Cloud Artifact Registry verfügbar ist.

Ziele

  • Container-Image in die verwaltete Harbor-Registry übertragen.
  • Beispielcontainer-App im Cluster bereitstellen.

Hinweis

  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 Projektnamespace als Umgebungsvariable fest:

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

  4. Bitten Sie Ihren IAM-Administrator der Organisation, Ihnen die folgenden Rollen zuzuweisen:

    • Rolle „Namespace-Administrator“ (namespace-admin) für Ihren Projektnamespace. Diese Rolle ist erforderlich, um Containerarbeitslasten in Ihrem Projekt bereitzustellen.

    • Rolle „Harbor-Instanzbetrachter“ (harbor-instance-viewer) für Ihren Projekt Namespace. Diese Rolle ist erforderlich, um eine Harbor-Instanz anzusehen und auszuwählen.

    • Rolle „Harbor-Projektersteller“ (harbor-project-creator) für Ihren Projekt-Namespace. Diese Rolle ist erforderlich, um auf ein Harbor-Projekt zuzugreifen und es zu verwalten.

  5. Melden Sie sich im Kubernetes Cluster an und generieren Sie die kubeconfig-Datei mit einer Nutzeridentität. Achten Sie darauf, dass Sie den kubeconfig-Pfad als Umgebungsvariable festlegen:

    export KUBECONFIG=CLUSTER_KUBECONFIG
    

Harbor-Projekt in der Registry erstellen

GDC bietet Harbor als Dienst an. Das ist ein vollständig verwalteter Dienst, mit dem Sie Container-Images mit Harbor speichern und verwalten können.

Wenn Sie Harbor als Dienst verwenden möchten, müssen Sie in der Registry-Instanz tear-harbor ein Harbor-Projekt erstellen, um Ihre Container-Images zu verwalten:

  1. Sie benötigen die URL von tear-harbor. Listen Sie die URL der Instanz auf:

    gdcloud harbor instances describe tear-harbor --project=tear
    

    Die Ausgabe sieht etwa so aus: harbor-1.org-1.zone1.google.gdc.test.

  2. Legen Sie die Instanz-URL als Variable fest, die Sie später in der Anleitung verwenden können:

    export INSTANCE_URL=INSTANCE_URL
    

    Geben Sie die Instanz-URL ohne das Präfix https:// ein.

  3. Bevor Sie das Projekt erstellen, müssen Sie sich mit der URL aus dem vorherigen Schritt in Harbor anmelden. Öffnen Sie diese URL in einem Browser und melden Sie sich in der Harbor-Instanz an.

  4. Erstellen Sie das Harbor-Projekt:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=tear \
        --instance=tear-harbor
    

    Ersetzen Sie HARBOR_PROJECT durch den Namen des zu erstellenden Harbor-Projekts. Sie können das Harbor-Projekt nicht in einem beliebigen Projektnamespace erstellen. Sie müssen das Projekt tear verwenden.

  5. 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-Registry-Instanzen konfigurieren.

  3. Da tear-harbor eine vorkonfigurierte Harbor-Registry ist, müssen Sie dem Zertifikat vertrauen, das von der internen Zertifizierungsstelle von Google Distributed Cloud mit Air Gap signiert wurde:

    1. Bitten Sie Ihren IO um die folgenden Informationen:

      1. die externe URL des Harbor-Clusters.
      2. die .crt-Datei der internen Zertifizierungsstelle von Google Distributed Cloud mit Air Gap. Die Datei wird in der Regel in der Steuerungsebene als Secret mit dem Namen trust-store-internal-only im Namespace anthos-creds gespeichert.
    2. Erstellen Sie wie im vorherigen Schritt einen Ordner mit dem Namen der externen URL des Harbor-Clusters und speichern Sie die .crt-Datei in diesem Ordner.

Kubernetes-Secret für das Abrufen von Images erstellen

Da Sie ein privates Harbor-Projekt verwenden, müssen Sie ein Kubernetes-Secret für das Abrufen von Images erstellen.

  1. Fügen Sie ein Roboter-Konto für das Harbor-Projekt hinzu. Folgen Sie der Anleitung in der Harbor-UI, um das Roboter-Konto zu erstellen und das Roboter-Secret-Token zu kopieren: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.

  2. Notieren Sie sich den Namen des neuen Roboter-Projektkontos. Er hat die folgende Syntax:

    <PREFIX><PROJECT_NAME>+<ACCOUNT_NAME>
    

    Das Format des Namens des Roboter-Projektkontos ähnelt beispielsweise harbor@library+artifact-account.

    Weitere Informationen zum Ermitteln des Namens Ihres Roboter-Projektkontos in Harbor, finden Sie in der Harbor-Dokumentation: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#view-project-robot-accounts.

  3. Melden Sie sich mit Ihrem Roboter-Projektkonto und dem Secret-Token in Docker an:

    docker login ${INSTANCE_URL}
    

    Geben Sie bei Aufforderung den Namen des Roboter-Projektkontos für Username und das Secret-Token für Password ein.

  4. Legen Sie einen beliebigen Namen für das Secret für das Abrufen von Images fest:

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

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n NAMESPACE
    

    Ersetzen Sie Folgendes:

    • DOCKER_CONFIG: der Pfad zur Datei .docker/config.json.
    • NAMESPACE: der Namespace für das Secret, das Sie erstellen.

Container-Image in 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 stellen Sie damit eine Beispiel-Webserver-App für nginx in einem Kubernetes-Cluster bereit. Die Webserver-App für nginx ist in der öffentlichen Google Cloud Artifact Registry verfügbar.

  1. Rufen Sie das nginx-Image über ein externes Netzwerk aus der Google Cloud Artifact Registry auf Ihre lokale Workstation ab:

    docker pull gcr.io/cloud-marketplace/google/nginx:1.25
    
  2. Legen Sie den Namen des Images fest. Der vollständige Image-Name hat folgendes Format:

    ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx
    
  3. Taggen Sie das lokale Image mit dem Repository-Namen:

    docker tag gcr.io/cloud-marketplace/google/nginx:1.25 ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  4. Übertragen Sie das nginx-Container-Image in Ihre verwaltete Harbor-Registry:

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

Beispielcontainer-App bereitstellen

Sie können jetzt das nginx-Container-Image im Appliance-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 ein Satz von Replikaten bereitgestellt, die skaliert und über den Cluster verteilt werden können. Eine Möglichkeit, um einen Satz von Replikaten bereitzustellen, ist ein Kubernetes-Deployment.

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 nginx-Container-Image. Sie erstellen auch eine Service-Ressource, die Clients eine stabile Möglichkeit bietet, Anfragen an die Pods Ihres Deployment zu senden.

Webserver für nginx bereitstellen:

  1. 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
    
  2. Prüfen Sie, ob die Pods durch das 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
    
  3. Erstellen Sie eine Netzwerkrichtlinie, um den gesamten Netzwerkverkehr 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
    
  4. 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}'`
    
  5. Testen Sie die IP-Adresse des nginx-Servers mit curl:

      curl http://$IP
    

Nächste Schritte

  • Informationen zum Verwalten von Containern finden Sie in der Containern Dokumentation.