限定公開イメージ レジストリを使用する

デフォルトでは、GKE on AWS のインストールで公開コンテナ イメージにアクセスできます。このトピックでは、Artifact Registry などの非公開のコンテナ イメージ リポジトリで GKE on AWS を使用する方法について説明します。

バージョン 1.28 以降、GKE on AWS では、Kubernetes Secret を使うことなく、Artifact Registry または Container Registry から非公開イメージを pull できます。詳細については、Secret なしで非公開イメージ レジストリを使用するをご覧ください。

準備

このページの手順を実行するには、まず以下を実行します。

Artifact Registry のイメージを確認する

残りの手順を完了するには、コンテナ イメージが必要です。次の手順を実行して、コンテナ イメージの名前を取得します。

  1. Google Cloud SDK を使用して Artifact Registry に対する認証を行うように Docker コマンドライン ツールを構成します。

    gcloud auth configure-docker
    

    gcloud コマンドライン ツールは、Google がサポートするすべての Docker レジストリの認証ヘルパーを登録します。

  2. docker images コマンドを使用して、Artifact Registry にイメージが含まれていることを確認します。

    docker images
    

    Docker は Artifact Registry に接続し、リポジトリにある使用可能なイメージを返します。たとえば、次のレスポンスは us-west1-docker.pkg.devPROJECT_NAME リポジトリ内の hello-app という名前のコンテナ イメージを示しています。

    REPOSITORY                                                            TAG          IMAGE ID       CREATED          SIZE
    us-west1-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app   v1           f7cfe0d58569   21 minutes ago   11.5MB
    

コンテナ イメージの準備ができていない場合、コンテナ化されたアプリケーションのデプロイの手順で作成します。

サービス アカウントを作成する

ユーザー クラスタは、Identity and Access Management(IAM)サービス アカウントを使用して認証します。

新しいサービス アカウントを作成するには、次の手順に沿って操作します。

  1. Google Cloud CLI で IAM サービス アカウントを作成します。

    gcloud iam service-accounts create ACCOUNT_NAME
    

    ACCOUNT_NAME を新しい Google Cloud サービス アカウントの名前に置き換えます。

  2. サービス アカウントに Artifact Registry のアクセス許可を付与します。

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

    次のように置き換えます。

    • PROJECT_NAME は、Google Cloud プロジェクトに置き換えます。
    • ACCOUNT_NAME は、Google Cloud サービス アカウント名に置き換えます。
  3. アカウントのサービス アカウント キーをダウンロードします。

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

    次のように置き換えます。

    • PROJECT_NAME
    • ACCOUNT_NAME

これで、Artifact Registry に接続するユーザー クラスタを構成する準備が整いました。

鍵をクラスタに保存する

Artifact Registry に認証用の鍵を提供するには、次の手順でサービス アカウント キーを Kubernetes Secret として保存します。

  1. kubectl を使用して Secret を作成します。

      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)"
    

    次のように置き換えます。

    • LOCATION: リポジトリのリージョンまたはマルチリージョン ロケーション
    • PROJECT_NAME
    • ACCOUNT_NAME
  2. サービス アカウント キーのローカルコピーを削除します。

    rm registry-access-key.json
    

これにより、ワークロードでこの Secret を参照できます。

限定公開イメージを使用してワークロードを作成する

ワークロードを含む、限定公開のコンテナ リポジトリのイメージを使用するには、spec.imagePullSecrets フィールドにシークレット名を設定します。このフィールドは、PodDeployment のさまざまな場所にあります。

Pod の作成

Container Registry にアクセスできる Pod を作成するには、フィールド spec.imagePullSecrets を Secret 名に設定します。

  1. spec.imagePullSecrets を指定する Pod を作成します。

    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
    

    次のように置き換えます。

    • POD_NAME: Pod の名前
    • CONTAINER_NAME: Pod 内のコンテナの名前
    • LOCATION
    • PROJECT_NAME

    たとえば、イメージ hello-app を pull するには、次の YAML を 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. kubectl で、クラスタに構成を適用します。

    kubectl apply -f hello-pod.yaml
    
  3. kubectl get で、Pod が実行されていることを確認します。

    kubectl get pod/hello-pod
    

    レスポンスには、ステータスが Running の Pod が 1 つ含まれます。

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

Deployment を作成する

  1. Deployment で限定公開リポジトリを使用するには、テンプレート内で imagePullSecret を指定します。

    たとえば、hello-app イメージを使用する Deployment を構成するには、次の内容を持つ hello-deployment.yaml という名前のファイルを作成します。

    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
    

    次のように置き換えます。

    • LOCATION
    • PROJECT_NAME
  2. kubectl で、クラスタに構成を適用します。

    kubectl apply -f hello-deployment.yaml
    
  3. kubectl pods で、Deployment が実行されていることを確認します。

    kubectl get pods --selector=app=products
    

    出力には、3 つの Running Pod が表示されます。

    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
    

クリーンアップ

このページで作成したリソースを削除するには、次のコマンドを実行します。

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

次のステップ