Secret を使用せずに限定公開イメージのレジストリを使用する

GKE on AWS では、Kubernetes Secret を使用せずに Artifact Registry または Container Registry から非公開イメージを pull できます。以前は、次の操作を行う必要がありました。

  1. Google Identity and Access Management(IAM)サービス アカウントを作成します。
  2. このサービス アカウントに、非公開レジストリにアクセスする権限を付与します。
  3. サービス アカウント キーをダウンロードして、クラスタに Kubernetes Secret として保存します。
  4. Pod または Deployment の YAML マニフェストでこの Secret を参照し、非公開コンテナ リポジトリのイメージにアクセスできるようにします。
  5. Google IAM サービス アカウントに関連付けられた鍵を定期的にローテーションして、管理します。

GKE on AWS では、これらの操作を行う必要はありません。非公開イメージを pull するために必要な認証と認可が自動的に処理されます。

始める前に

このページで説明する操作を行う前に、次のことを完了しておいてください。

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

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

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

    gcloud auth configure-docker
    

    Google Cloud CLI は、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
    

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

イメージ pull の Secret を使用せずに非公開イメージで Pod を作成する

レジストリの非公開コンテナ イメージにアクセスできる Pod を作成するときに、Pod の仕様に spec.imagePullSecrets フィールドを含める必要がなくなりました。Pod を設定するには、次の操作を行います。

  1. spec.imagePullSecrets フィールドのない Pod 定義を作成します。

    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_VERSION
    

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

    • POD_NAME: Pod の名前。
    • CONTAINER_NAME: Pod 内のコンテナの名前。
    • LOCATION: レジストリを含む Google Cloud リージョン。例: us-west1
    • PROJECT_NAME: Artifact Registry リポジトリをホストする Google プロジェクトの名前。クラスタのプロジェクトと同じ場合があります。リポジトリが別のプロジェクトにある場合は、クラスタと同じプロジェクトにない場合に Artifact Registry を使用するで追加の手順を確認してください。
    • REPOSITORY_NAME: リポジトリの名前。
    • IMAGE_NAME: イメージの名前。
    • IMAGE_VERSION: イメージのバージョン。
  2. kubectl でクラスタに構成を適用します。

    kubectl apply -f YAML_FILE_NAME
    

    YAML_FILE_NAME は、YAML ファイルの名前に置き換えます。

イメージ pull の Secret を使用せずに Pod を作成する例

イメージ pull の Secret を必要としない Kubernetes Pod の作成例を次に示します。Pod は、Artifact Registry から hello-app イメージを pull します。

  1. イメージ 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
    
  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
    

イメージ pull の Secret を使用せずに非公開イメージで Deployment を作成する

レジストリから非公開コンテナ イメージにアクセスできる Deployment を作成するときに、Deployment 仕様に spec.imagePullSecrets フィールドを含める必要がなくなりました。Deployment を設定するには、次の操作を行います。

  1. spec.imagePullSecrets フィールドのない Deployment 定義を作成します。

    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_VERSION
    

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

    • DEPLOYMENT_NAME: Deployment の名前。
    • NUMBER_OF_REPLICAS: Deployment で定義された Pod のインスタンスの数(任意の時点で実行されるインスタンスの数)。
    • CONTAINER_NAME: Pod 内のコンテナの名前。
    • LOCATION: レジストリを含む Google Cloud リージョン。例: us-west1
    • PROJECT_NAME: Artifact Registry リポジトリをホストする Google プロジェクトの名前。クラスタのプロジェクトと同じでない場合があります。リポジトリが別のプロジェクトにある場合は、クラスタと同じプロジェクトにない場合に Artifact Registry を使用するで追加の手順を確認してください。
    • REPOSITORY_NAME: リポジトリの名前。
    • IMAGE_NAME: イメージの名前。
    • IMAGE_VERSION: イメージのバージョン。
  2. kubectl でクラスタに構成を適用します。

    kubectl apply -f name-of-your-yaml-file.yaml
    

イメージ pull の Secret を使用せずに Deployment を作成する例

イメージ pull の Secret を使用せずに Deployment を作成する例を次に示します。Deployment は、Artifact Registry から hello-app イメージを pull します。

  1. 次の内容のファイルを 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"
    

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

    • LOCATION: レジストリを含む Google Cloud リージョン。例: us-west1
    • PROJECT_NAME: Artifact Registry リポジトリをホストする Google プロジェクトの名前。クラスタのプロジェクトと同じでない場合があります。リポジトリが別のプロジェクトにある場合は、クラスタと同じプロジェクトにない場合に Artifact Registry を使用するで追加の手順を確認してください。
  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
    

クラスタと同じプロジェクトにない場合に Artifact Registry を使用する

クラスタのプロジェクトとは異なる Google プロジェクトにある Artifact Registry リポジトリを使用するには、次の操作を行います。

クラスタのノードプール仮想マシン インスタンスのサービス アカウント(ノードプール マシン サービス エージェント)に、このレジストリにアクセスするために必要な権限を付与します。

gcloud projects add-iam-policy-binding AR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

これにより、クラスタは別のプロジェクトのレジストリからアーティファクトを取得できます。

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

  • AR_PROJECT_ID: Artifact Registry をホストする Google プロジェクトの ID。
  • NODE_POOL_MACHINE_SERVICE_AGENT: クラスタのノードプールのサービス アカウント。形式は service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com です。
  • ROLE: roles/artifactregistry.reader ロールまたは、Artifact Registry リポジトリのイメージにアクセスするための十分な権限を付与するカスタムロール。

非公開の Google Container Registry を使用する

Google プロジェクトのロケーションに関係なく、非公開の Google Container Registry を GKE on AWS クラスタと統合する手順は次のとおりです。

ノードプール マシン サービス エージェント(クラスタのノードプール仮想マシン インスタンスのサービス アカウント)に、Container Registry へのアクセスを許可します。

gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

これにより、クラスタ サービス アカウントが非公開コンテナ イメージにアクセスできるようになります。

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

  • GCR_PROJECT_ID: Container Registry をホストするプロジェクトの ID。
  • NODE_POOL_MACHINE_SERVICE_AGENT: ノードプール サービス アカウント。形式は service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com です。
  • ROLE: storage.objectViewer または Container Registry に対して十分な権限のあるカスタムロールを選択します。storage.objectViewer では広範な権限が付与されるので注意してください。

クリーンアップ

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

kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE

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

  • POD_YAML_FILE: Pod を定義した YAML ファイルの名前。
  • DEPLOYMENT_YAML_FILE: Deployment を定義した YAML ファイルの名前。

次のステップ