GKE on AWS では、Kubernetes Secret を使用せずに Artifact Registry または Container Registry から非公開イメージを pull できます。以前は、次の操作を行う必要がありました。
- Google Identity and Access Management(IAM)サービス アカウントを作成します。
- このサービス アカウントに、非公開レジストリにアクセスする権限を付与します。
- サービス アカウント キーをダウンロードして、クラスタに Kubernetes Secret として保存します。
- Pod または Deployment の YAML マニフェストでこの Secret を参照し、非公開コンテナ リポジトリのイメージにアクセスできるようにします。
- Google IAM サービス アカウントに関連付けられた鍵を定期的にローテーションして、管理します。
GKE on AWS では、これらの操作を行う必要はありません。非公開イメージを pull するために必要な認証と認可が自動的に処理されます。
始める前に
このページで説明する操作を行う前に、次のことを完了しておいてください。
- クラスタを作成する。
- ノードプールを作成する。
Docker イメージをビルドして、Artifact Registry に push する。このページの例では、
hello-app
コンテナを使用します。このコンテナをビルドするには、Google Cloud 上の GKE ドキュメントのコンテナ イメージをビルドするの手順と、Docker イメージを Artifact Registry に push するの手順に沿って操作します。GKE on AWS のバージョン 1.28 にアップグレードする。これにより、Kubernetes Secret を使用せずに Artifact Registry または Container Registry から非公開イメージを pull できるようになります。
Artifact Registry のイメージを確認する
残りの手順を完了するには、コンテナ イメージが必要です。次の手順でコンテナ イメージの名前を取得します。
Google Cloud SDK を使用して Artifact Registry に対する認証を行うように Docker コマンドライン ツールを構成します。
gcloud auth configure-docker
Google Cloud CLI は、Google がサポートするすべての Docker レジストリの認証情報ヘルパーを登録します。
docker images
コマンドを使用して、Artifact Registry にイメージが含まれていることを確認します。docker images
Docker は Artifact Registry に接続し、リポジトリにある使用可能なイメージを返します。たとえば、次のレスポンスは、
us-west1-docker.pkg.dev
のPROJECT_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 を設定するには、次の操作を行います。
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
: イメージのバージョン。
kubectl
でクラスタに構成を適用します。kubectl apply -f YAML_FILE_NAME
YAML_FILE_NAME
は、YAML ファイルの名前に置き換えます。
イメージ pull の Secret を使用せずに Pod を作成する例
イメージ pull の Secret を必要としない Kubernetes Pod の作成例を次に示します。Pod は、Artifact Registry から hello-app
イメージを pull します。
イメージ
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
kubectl
でクラスタに構成を適用します。kubectl apply -f hello-pod.yaml
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 を設定するには、次の操作を行います。
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
: イメージのバージョン。
kubectl
でクラスタに構成を適用します。kubectl apply -f name-of-your-yaml-file.yaml
イメージ pull の Secret を使用せずに Deployment を作成する例
イメージ pull の Secret を使用せずに Deployment を作成する例を次に示します。Deployment は、Artifact Registry から hello-app
イメージを pull します。
次の内容のファイルを
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 を使用するで追加の手順を確認してください。
kubectl
でクラスタに構成を適用します。kubectl apply -f hello-deployment.yaml
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 ファイルの名前。