Private Image-Registry verwenden

Ihre GKE on AWS-Installation kann standardmäßig auf öffentliche Container-Images zugreifen. In diesem Thema wird erläutert, wie Sie GKE on AWS mit einem privaten Container-Image-Repository wie Artifact Registry verwenden.

Ab Version 1.28 bietet GKE on AWS die Möglichkeit, private Images aus Artifact Registry oder Container Registry abzurufen, ohne ein Kubernetes Secret verwenden zu müssen. Weitere Informationen finden Sie unter Private Image-Registry ohne Secrets verwenden.

Hinweise

Führen Sie zuerst die folgende Aufgaben aus, um die Schritte auf dieser Seite auszuführen:

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:

  1. Konfigurieren Sie das Docker-Befehlszeilentool zur Authentifizierung bei Artifact Registry mit dem Google Cloud SDK:

    gcloud auth configure-docker
    

    Das gcloud-Befehlszeilentool registriert einen Credential Helper für alle von Google unterstützten Docker-Registrys.

  2. Prüfen Sie, ob Ihre Artifact Registry ein Image mit dem Befehl docker images enthält.

    docker images
    

    Docker 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-app im Repository PROJECT_NAME auf us-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.

Dienstkonto erstellen

Ihre Cluster authentifizieren sich über ein Dienstkonto für Identity and Access Management (IAM).

Um ein neues Dienstkonto zu erstellen, gehen Sie so vor:

  1. Erstellen Sie ein IAM-Dienstkonto mit dem Google Cloud CLI.

    gcloud iam service-accounts create ACCOUNT_NAME
    

    Ersetzen Sie ACCOUNT_NAME durch den Namen des neuen Google Cloud-Dienstkontos.

  2. Gewähren Sie dem Dienstkonto Artifact Registry-Berechtigungen.

    gcloud projects add-iam-policy-binding PROJECT_NAME \
      --member serviceAccount:ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com \
      --role roles/artifactregistry.reader
    

    Ersetzen Sie Folgendes:

    • PROJECT_NAME ist Ihr Google Cloud-Projekt.
    • ACCOUNT_NAME ist der Name Ihres Google Cloud-Dienstkontos.
  3. Laden Sie den Dienstkontoschlüssel des Kontos herunter.

    gcloud iam service-accounts keys create registry-access-key.json \
      --iam-account ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
    

    Ersetzen Sie Folgendes:

    • PROJECT_NAME
    • ACCOUNT_NAME

Sie können Ihren Nutzercluster jetzt so konfigurieren, dass er eine Verbindung zu Artifact Registry herstellt.

Schlüssel im Cluster speichern

Damit der Schlüssel für die Authentifizierung bei Artifact Registry bereitgestellt wird, speichern Sie mit folgenden Schritten den Dienstkontoschlüssel als Kubernetes-Secret:

  1. Verwenden Sie kubectl, um das Secret zu erstellen.

      kubectl create secret docker-registry registry-secret \
      --docker-server=LOCATION-docker.pkg.dev \
      --docker-username=_json_key \
      --docker-email=ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com \
      --docker-password="$(cat registry-access-key.json)"
    

    Ersetzen Sie Folgendes:

    • LOCATION: der regionale oder multiregionale Speicherort für das Repository.
    • PROJECT_NAME
    • ACCOUNT_NAME
  2. Löschen Sie die lokale Kopie des Dienstkontoschlüssels.

    rm registry-access-key.json
    

Sie können jetzt in Ihren Arbeitslasten auf dieses Secret verweisen.

Arbeitslast mit einem privaten Image erstellen

Wenn Sie ein Image aus einem privaten Container-Repository mit einer Arbeitslast verwenden möchten, setzen Sie das Feld spec.imagePullSecrets auf Ihren Secret-Namen. Dieses Feld befindet sich an unterschiedlichen Standorten für Pods und Deployments.

Pod erstellen

Zum Erstellen eines Pods, der auf die Container Registry zugreifen kann, legen Sie das Feld spec.imagePullSecrets auf den Namen Ihres Secrets fest.

  1. Erstellen Sie einen Pod, der spec.imagePullSecrets angibt.

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1
      imagePullSecrets:
      - name: registry-secret
    

    Ersetzen Sie Folgendes:

    • POD_NAME: der Name Ihres Pods
    • CONTAINER_NAME: der Name des Containers im Pod
    • LOCATION
    • PROJECT_NAME

    Wenn Sie zum Beispiel das Image hello-app abrufen möchten, kopieren Sie die folgende YAML-Datei in eine Datei mit dem Namen hello-pod.yaml.

    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:v1
      imagePullSecrets:
      - name: registry-secret
    
  2. Wenden Sie die Konfiguration mithilfe von kubectl auf Ihren Cluster an.

    kubectl apply -f hello-pod.yaml
    
  3. Bestätigen Sie mithilfe von kubectl get, dass der Pod ausgeführt wird.

    kubectl get pod/hello-pod
    

    Die Antwort enthält einen Pod mit dem Status Running.

    NAME        READY   STATUS    RESTARTS   AGE
    hello-pod   1/1     Running   0          15s
    

Deployment erstellen

  1. Zur Verwendung eines privaten Repositorys in einem Deployment geben Sie das imagePullSecret in der Vorlage an.

    Wenn Sie beispielsweise eine Bereitstellung konfigurieren möchten, das das Image hello-app verwendet, erstellen Sie eine Datei namens hello-deployment.yaml 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"
          imagePullSecrets:
          - name: registry-secret
    

    Ersetzen Sie Folgendes:

    • LOCATION
    • PROJECT_NAME
  2. Wenden Sie die Konfiguration mithilfe von kubectl auf Ihren Cluster an.

    kubectl apply -f hello-deployment.yaml
    
  3. Bestätigen Sie mithilfe von kubectl pods, dass Ihre Bereitstellung ausgeführt wird.

    kubectl get pods --selector=app=products
    

    Die 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
    

Bereinigen

Führen Sie die folgenden Befehle aus, um die auf dieser Seite erstellten Ressourcen zu entfernen:

kubectl apply -f hello-pod.yaml
kubectl delete -f hello-deployment.yaml

Nächste Schritte