GKE on AWS bietet eine Möglichkeit, private Images aus Artifact Registry oder Container Registry abzurufen, ohne ein Kubernetes-Secret verwenden zu müssen. Bisher mussten Sie die folgenden Schritte ausführen:
- Erstellen Sie ein Google-Dienstkonto für die Identitäts- und Zugriffsverwaltung (Identity and Access Management, IAM).
- Gewähren Sie dem Dienstkonto Berechtigungen für den Zugriff auf die private Registry.
- Laden Sie den Dienstkontoschlüssel herunter und speichern Sie ihn als Kubernetes-Secret in Ihrem Cluster.
- Verweisen Sie in Ihrem YAML-Manifest für Pods oder Deployments auf dieses Secret, damit sie auf Images aus dem privaten Container-Repository zugreifen können.
- Rotieren und verwalten Sie regelmäßig die Schlüssel, die mit dem Google-Dienstkonto für IAM verknüpft sind.
Mit GKE on AWS entfallen alle diese manuellen Schritte. Die für das Abrufen privater Images erforderliche Authentifizierung und Autorisierung werden automatisch verarbeitet.
Hinweis
Führen Sie zuerst die folgende Aufgaben aus, um die Schritte auf dieser Seite auszuführen:
- Cluster erstellen
- Erstellen Sie einen Knotenpool.
Docker-Image erstellen und in die Artifact Registry verschieben In den Beispielen auf dieser Seite wird der Container
hello-appverwendet. Um diesen Container zu erstellen, folgen Sie den Schritten unter Container-Images erstellen und Docker-Image per Push an Artifact Registry übertragen, die Teil der GKE-Dokumentation sind. Google CloudFühren Sie ein Upgrade auf Version 1.28 von GKE on AWS durch, damit Sie private Images aus Artifact Registry oder Container Registry abrufen können, ohne ein Kubernetes-Secret verwenden zu müssen.
In Artifact Registry nach Images suchen
Für die restlichen Schritte benötigen Sie ein Container-Image. Rufen Sie also den Namen Ihres Container-Images ab. Gehen Sie dazu so vor:
Konfigurieren Sie das Docker-Befehlszeilentool zur Authentifizierung bei Artifact Registry mit dem Google Cloud SDK:
gcloud auth configure-dockerDie Google Cloud CLI registriert einen Credential Helper für alle von Google unterstützten Docker-Registries.
Prüfen Sie mit dem Befehl
docker images, ob Ihre Artifact Registry ein Image enthält:docker imagesDocker stellt eine Verbindung zu Artifact Registry her und gibt die in Ihrem Repository verfügbaren Images zurück. Die folgende Antwort zeigt beispielsweise ein Container-Image mit dem Namen
hello-appim RepositoryPROJECT_NAMEaufus-west1-docker.pkg.dev.REPOSITORY TAG IMAGE ID CREATED SIZE us-west1-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app v1 f7cfe0d58569 21 minutes ago 11.5MB
Wenn Sie noch kein Container-Image haben, erstellen Sie eines anhand der Schritte unter Container-Webanwendung bereitstellen.
Pods mit privaten Images ohne Secrets zum Abrufen von Images erstellen
Wenn Sie einen Pod erstellen möchten, der auf ein privates Container-Image aus einer Registry zugreifen kann, müssen Sie das Feld spec.imagePullSecrets nicht mehr in der Pod-Spezifikation angeben. So richten Sie Ihren Pod ein:
Erstellen Sie eine Pod-Definition ohne das Feld
spec.imagePullSecrets:apiVersion: v1 kind: Pod metadata: name: POD_NAME spec: containers: - name: CONTAINER_NAME image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSIONErsetzen Sie Folgendes:
POD_NAME: der Name des PodsCONTAINER_NAME: der Name des Containers im PodLOCATION: die Google Cloud Region, die Ihre Registry enthält. Beispiel:us-west1PROJECT_NAME: der Name des Google-Projekts, in dem sich Ihr Artifact Registry-Repository befindet. Dies kann dasselbe Projekt wie Ihr Cluster sein. Wenn sich das Repository in einem anderen Projekt befindet, finden Sie unter Artifact Registry verwenden, wenn sie sich nicht im selben Projekt wie Ihr Cluster befindet weitere Schritte.REPOSITORY_NAME: der Name Ihres RepositorysIMAGE_NAME: der Name des ImagesIMAGE_VERSION: die Version des Images
Wenden Sie die Konfiguration mit
kubectlauf Ihren Cluster an:kubectl apply -f YAML_FILE_NAMEErsetzen Sie
YAML_FILE_NAMEdurch den Namen Ihrer YAML-Datei.
Beispiel für das Erstellen von Pods ohne Secrets zum Abrufen von Images
Hier ist ein Beispiel für das Erstellen eines Kubernetes-Pods ohne Secrets zum Abrufen von Images. Der Pod ruft das Image hello-app aus Artifact Registry ab.
Kopieren Sie die folgende YAML-Datei in eine Datei mit dem Namen
hello-pod.yaml, um das Imagehello-appabzurufen:apiVersion: v1 kind: Pod metadata: name: hello-pod spec: containers: - name: hello-container image: us-west1-docker.pkg.dev/example-project/hello-repo/hello-app:v1Wenden Sie die Konfiguration mit
kubectlauf Ihren Cluster an:kubectl apply -f hello-pod.yamlPrüfen Sie mit
kubectl get, ob der Pod ausgeführt wird:kubectl get pod/hello-podDie Antwort enthält einen Pod mit dem Status
Running.NAME READY STATUS RESTARTS AGE hello-pod 1/1 Running 0 15s
Deployments mit privaten Images ohne Secrets zum Abrufen von Images erstellen
Wenn Sie ein
Deployment
erstellen möchten, das auf ein privates Container-Image aus einer Registry zugreifen kann, müssen Sie das Feld spec.imagePullSecrets nicht mehr in der Deployment-Spezifikation angeben.
So richten Sie Ihr Deployment ein:
Erstellen Sie eine Deployment-Definition ohne das Feld
spec.imagePullSecrets:apiVersion: apps/v1 kind: Deployment metadata: name: DEPLOYMENT_NAME spec: replicas: NUMBER_OF_REPLICAS template: spec: containers: - name: CONTAINER_NAME image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSIONErsetzen Sie Folgendes:
DEPLOYMENT_NAME: der Name Ihres DeploymentsNUMBER_OF_REPLICAS: die Anzahl der Instanzen des im Deployment definierten Pods, die zu einem bestimmten Zeitpunkt ausgeführt werden sollenCONTAINER_NAME: der Name des Containers im PodLOCATION: die Google Cloud Region, die Ihre Registry enthält Beispiel:us-west1PROJECT_NAME: der Name des Google-Projekts, in dem sich Ihr Artifact Registry-Repository befindet. Dies muss nicht dasselbe Projekt wie Ihr Cluster sein. Wenn sich das Repository in einem anderen Projekt befindet, finden Sie unter Artifact Registry verwenden, wenn sie sich nicht im selben Projekt wie Ihr Cluster befindet weitere Schritte.REPOSITORY_NAME: der Name Ihres RepositorysIMAGE_NAME: der Name des ImagesIMAGE_VERSION: die Version des Images
Wenden Sie die Konfiguration mit
kubectlauf Ihren Cluster an.kubectl apply -f name-of-your-yaml-file.yaml
Beispiel für das Erstellen eines Deployments ohne Secrets zum Abrufen von Images
Hier ist ein Beispiel für das Erstellen eines Deployments ohne Secrets zum Abrufen von Images. Das Deployment ruft ein hello-app-Image aus Artifact Registry ab.
Erstellen Sie eine Datei mit dem Namen
hello-deployment.yamlund mit folgendem Inhalt:apiVersion: apps/v1 kind: Deployment metadata: name: hello-app-deployment spec: selector: matchLabels: app: products department: sales replicas: 3 template: metadata: labels: app: products department: sales spec: containers: - name: hello image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1 env: - name: "PORT" value: "50001"Ersetzen Sie Folgendes:
LOCATION: die Google Cloud Region, die Ihre Registry enthält. Beispiel:us-west1PROJECT_NAME: der Name des Google-Projekts, in dem sich Ihr Artifact Registry-Repository befindet. Dies muss nicht dasselbe Projekt wie Ihr Cluster sein. Wenn sich das Repository in einem anderen Projekt befindet, finden Sie unter Artifact Registry verwenden, wenn sie sich nicht im selben Projekt wie Ihr Cluster befindet weitere Schritte.
Wenden Sie die Konfiguration mit
kubectlauf Ihren Cluster an.kubectl apply -f hello-deployment.yamlPrüfen Sie mit
kubectl pods, ob Ihr Deployment ausgeführt wird.kubectl get pods --selector=app=productsDie Ausgabe zeigt drei
Running-Pods.NAME READY STATUS RESTARTS AGE hello-app-deployment-67d9c6d98c-b69f2 1/1 Running 0 14m hello-app-deployment-67d9c6d98c-d6k5c 1/1 Running 0 14m hello-app-deployment-67d9c6d98c-p2md5 1/1 Running 0 14m
Artifact Registry verwenden, wenn sie sich nicht im selben Projekt wie Ihr Cluster befindet
Wenn Sie ein Artifact Registry-Repository verwenden möchten, das sich in einem anderen Google-Projekt als dem befindet, das Ihren Cluster enthält, führen Sie die folgenden Schritte aus:
Gewähren Sie dem Dienstkonto für die virtuellen Maschinen des Knotenpools Ihres Clusters, dem Dienst-Agent für Maschinen mit dem Knotenpool, die erforderlichen Berechtigungen für den Zugriff auf diese Registry.
gcloud projects add-iam-policy-binding AR_PROJECT_ID \
--member=NODE_POOL_MACHINE_SERVICE_AGENT \
--role=ROLE
Mit diesem Schritt wird sichergestellt, dass Ihr Cluster Artefakte aus der Registry in diesem separaten Projekt abrufen kann.
Ersetzen Sie Folgendes:
AR_PROJECT_ID: die ID des Google-Projekts, in dem sich die Artifact Registry befindetNODE_POOL_MACHINE_SERVICE_AGENT: das Dienstkonto für den Knotenpool Ihres Clusters im folgenden Format:service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.comROLE: die Rolleroles/artifactregistry.readeroder eine benutzerdefinierte Rolle, die ausreichende Berechtigungen für den Zugriff auf Images im Artifact Registry-Repository gewährt
Private Google Container Registry verwenden
Wenn Sie eine private Google Container Registry in Ihren GKE on AWS-Cluster einbinden möchten, unabhängig vom Google-Projektstandort, führen Sie die folgenden Schritte aus:
Gewähren Sie dem Dienst-Agent für Maschinen mit dem Knotenpool, dem Dienstkonto für die virtuellen Maschineninstanzen des Knotenpools Ihres Clusters, Zugriff auf die Container Registry:
gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
--member=NODE_POOL_MACHINE_SERVICE_AGENT \
--role=ROLE
Mit diesem Schritt wird der Zugriff des Cluster-Dienstkontos auf die privaten Container-Images ermöglicht.
Ersetzen Sie Folgendes:
GCR_PROJECT_ID: die ID des Projekts, in dem sich die Container Registry befindetNODE_POOL_MACHINE_SERVICE_AGENT: das Dienstkonto des Knotenpools im Formatservice-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com.ROLE: Wählen Siestorage.objectVieweroder eine benutzerdefinierte Rolle für ausreichenden Zugriff auf die Container Registry aus. Seien Sie vorsichtig bei einem umfassenden Zugriff mitstorage.objectViewer.
Bereinigen
Führen Sie die folgenden Befehle aus, um die auf dieser Seite erstellten Ressourcen zu entfernen:
kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE
Ersetzen Sie Folgendes:
POD_YAML_FILE: der Name der YAML-Datei, in der Sie den Pod definiert habenDEPLOYMENT_YAML_FILE: der Name der YAML-Datei, in der Sie das Deployment definiert haben