Container-Images per Push übertragen und aus einem Cluster abrufen

Systemartefakte sind in der Artifact Registry des Infrastrukturclusters der Organisation vorhanden. Wenn ein Plattformadministrator (Platform Administrator, PA) eine Organisation in einer GDC-Appliance (Google Distributed Cloud) mit Air-Gap erstellt, werden alle Systemartefakte aus dem Infrastrukturcluster der Organisation repliziert.

Der Infrastrukturbetreiber muss neue Systemartefakte in den Organisationsinfrastrukturcluster übertragen. Das Pushen neuer Systemartefakte erfolgt nur, wenn der PA die Aktivierung optionaler Funktionen anfordert oder wenn das System Fehler oder Ausfälle aufweist, die Sie durch Patchen neuer Artefakte beheben können.

Hinweise

Bitten Sie Ihren Sicherheitsadministrator, Ihnen die folgenden Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie als Administrator für den Zugriff auf Ressourcen in Artifact Registry-Systemprojekten benötigen. Die Rollen hängen vom Cluster ab, in den Sie das Container-Image übertragen möchten.

Nachdem Sie die erforderlichen Berechtigungen erhalten haben, führen Sie die folgenden Schritte aus, bevor Sie ein Image per Push an die System-Artifact Registry des Infrastrukturclusters übertragen:

  1. Laden Sie die Distributed Cloud CLI herunter und installieren Sie sie. Folgen Sie dabei der Anleitung unter gdcloud-Befehlszeilenschnittstelle (CLI).

  2. Installieren Sie die docker-credential-gdcloud-Komponente gemäß der Anleitung unter Komponenten installieren:

    gdcloud components install docker-credential-gdcloud
    
  3. Mit dem konfigurierten Identitätsanbieter anmelden:

    gdcloud auth login
    
  4. Exportieren Sie die kubeconfig-Datei:

    gdcloud clusters get-credentials CLUSTER_NAME
    

    Ersetzen Sie CLUSTER_NAME durch den Namen des Clusters.

  5. Docker konfigurieren:

    gdcloud auth configure-docker
    

Container-Image aus einem Speicher-Bucket herunterladen

Folgen Sie der Anleitung in diesem Abschnitt, wenn die PA das Bild aus einem Speicher-Bucket herunterladen und in die System-Artifact Registry hochladen soll. Der PA muss Details wie die Projekt- und Bucket-Namen angeben.

Als IO benötigen Sie Berechtigungen zum Herunterladen des Container-Image aus dem Speicher-Bucket:

  • Bitten Sie Ihren Sicherheitsadministrator, Ihnen die Rolle „Project Bucket Object Viewer“ (project-bucket-object-viewer) im Namespace des Projekts zuzuweisen.

Weitere Informationen finden Sie im IAM-Runbook R0005.

Sie erhalten Lesezugriff auf den Bucket im Projekt und auf die Objekte in diesem Bucket.

Nachdem Sie die erforderlichen Berechtigungen erhalten haben, gehen Sie so vor, um das Container-Image aus dem Storage-Bucket des Namespace des PA-Projekts herunterzuladen:

  1. Fragen Sie den PA nach dem Secret-Namen des Buckets. Der Secret-Name sieht so aus:

    object-storage-key-std-user-ID
    

    Der Secret-Name enthält einen eindeutigen ID-Wert für den Zugriff auf den Bucket.

  2. Kopieren Sie den Secret-Namen des Buckets.

  3. Rufen Sie Anmeldedaten für den Bucket-Zugriff ab und konfigurieren Sie die gcloud CLI:

    SECRET_NAME=SECRET_NAME ACCESS_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.access-key-id}' | base64 -d)
    SECRET_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.secret-access-key}' | base64 -d)
    S3_ENDPOINT=objectstorage.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
    echo "Access Key: ${ACCESS_KEY}" \
    && echo "Secret Key: ${SECRET_KEY}" \
    && echo "S3 Endpoint: ${S3_ENDPOINT}"
    
    gdcloud config set storage/s3_access_key_id ${ACCESS_KEY}
    gdcloud config set storage/s3_secret_access_key ${SECRET_KEY}
    gdcloud config set storage/s3_endpoint ${S3_ENDPOINT}
    

    Ersetzen Sie SECRET_NAME durch den Wert, den Sie im vorherigen Schritt kopiert haben.

  4. Laden Sie das Container-Image aus dem Speicher-Bucket auf Ihre Workstation herunter:

    gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
    

    Ersetzen Sie Folgendes:

    • BUCKET_NAME: Der Name des Storage-Buckets, der das Container-Image enthält. Dieser Name wird von der PA bereitgestellt.
    • CONTAINER_IMAGE_NAME: Der Name der Container-Image-Datei, die Sie aus dem Storage-Bucket herunterladen möchten.

Image in die System Artifact Registry hochladen

Führen Sie die folgenden Schritte aus, um die Datei des Container-Images, die sich auf Ihrer Workstation befindet, per Push in die System-Artifact Registry auf dem Management API-Server zu übertragen:

  1. Öffnen Sie die Konsole.

  2. Rufen Sie den Pfad zum System Artifact Registry-Endpunkt des Clusters ab, in den Sie das Container-Image übertragen möchten:

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. Laden Sie das Container-Image, versehen Sie es mit einem Tag und übertragen Sie es per Push an den System Artifact Registry-Endpunkt des Clusters:

    docker load --input CONTAINER_IMAGE_PATH
    
    docker tag CONTAINER_IMAGE_PATH ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    
    docker push ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    

    Ersetzen Sie CONTAINER_IMAGE_PATH durch den Pfad der Container-Imagedatei in Ihrem lokalen Dateisystem. Ein gültiger Wert für diesen Pfad ist beispielsweise oracle_db.tar.

Harbor-Artefakt abrufen

In den meisten Fällen interagiert das GDC-System automatisch mit der System Artifact Registry (SAR), um das neueste Artefakt aus Harbor abzurufen. In einigen Sonderfällen müssen Sie diesen Vorgang manuell ausführen. So rufen Sie das Artefaktbild manuell aus Harbor ab:

  1. Legen Sie die Artefaktdetails fest, die von den einzelnen Anwendungen definiert werden:

    APP_NAME=APP
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    REPOSITORY=REPOSITORY
    

    Ersetzen Sie Folgendes:

    • APP: der Name der Anwendung.
    • HARBOR_PROJECT_NAME: der Name des Harbor-Projekts.
    • REPOSITORY: Name des Repositorys.
  2. Informationen zum Hafen abrufen:

    HARBOR_URL=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}')
    HARBOR_IP=${HARBOR_URL#https://}
    
  3. Rufen Sie das Artefakt-Tag ab. Es gibt zwei Möglichkeiten, das Tag abzurufen:

    • Methode 1: Dies ist die bevorzugte Option:

      1. Artefakte im lokalen Bundle auflisten und das entsprechende Tag abrufen:
      TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
      
    • 2. Methode: Verwenden Sie diese Methode nur, wenn die erste Methode nicht wie erwartet funktioniert:

      1. Listen Sie die Tags in Harbor auf und wählen Sie den neuesten aus:

          ADMIN_PASS=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} -n harbor-system get secret harbor-admin -o jsonpath="{.data.secret}" | base64 -d)
        
          curl -k -X GET \
            --header 'Accept: application/json' \
            --header "authorization: Basic $(echo -n admin:${ADMIN_PASS:?} | base64)" \
          "${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT:?}/repositories/${REPOSITORY:?}/artifacts?with_tag=true" | jq -r '.[] | select(.tags != null) | .tags[] | {tag: .name, updated:.push_time}'
        

        Die Ausgabe muss dem folgenden Beispiel ähneln:

        {
          "tag": "<tag1>",
          "updated": "<date1>"
        }
        {
          "tag": "<tag2>",
          "updated": "<date2>"
        }
        
      2. Exportieren Sie den Wert des Tags mit der zuletzt aktualisierten Zeit:

        TAG=MOST_RECENT_TAG
        

        Ersetzen Sie MOST_RECENT_TAG durch das Tag mit dem zuletzt aktualisierten Zeitstempel.

  4. Artefakte aus Harbor herunterladen:

    gdcloud artifacts pull --single-manifest-repo \
    ${HARBOR_IP:?}/${HARBOR_PROJECT:?}/${REPOSITORY:?}:${TAG:?} \
    ${APP_NAME:?}-${TAG:?}
    

    Wenn die folgende Fehlermeldung angezeigt wird, können Sie sie ignorieren:

    tee: '/root/logs/artifacts_pull_--single-manifest-repo_2023.07.13:14.59.24.log': Permission denied
    

Bekannte Probleme

Es gibt mehrere bekannte Probleme beim Abrufen des Harbor-Artefakts:

  • Möglicherweise müssen Sie das Argument --kubeconfig ${INFRA_ORG_KUBECONFIG:?} hinzufügen.
  • Der Befehl curl kann die folgende Fehlermeldung ausgeben: certificate signed by unknown authority. Sie können diesen Fehler mit einer der folgenden Methoden beheben:

    • Vorübergehende Lösung: Fügen Sie dem Befehl gdcloud artifacts pull das Flag --insecure hinzu.
    • Zuverlässige Lösung: Vertrauen Sie der Zertifizierungsstelle der Organisationsinfrastruktur. Weitere Informationen finden Sie unter Fehler beim Abrufen von Images.
  • Möglicherweise müssen Sie den Inhalt extrahieren:

    gdcloud artifacts extract ${APP_NAME:?}-${TAG:?} ${APP_NAME:?}-${TAG:?}-extracted