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-dockerGoogle Cloud CLI は、Google がサポートするすべての Docker レジストリの認証情報ヘルパーを登録します。
docker imagesコマンドを使用して、Artifact Registry にイメージが含まれていることを確認します。docker imagesDocker は 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-west1PROJECT_NAME: Artifact Registry リポジトリをホストする Google プロジェクトの名前。クラスタのプロジェクトと同じ場合があります。リポジトリが別のプロジェクトにある場合は、クラスタと同じプロジェクトにない場合に Artifact Registry を使用するで追加の手順を確認してください。REPOSITORY_NAME: リポジトリの名前。IMAGE_NAME: イメージの名前。IMAGE_VERSION: イメージのバージョン。
kubectlでクラスタに構成を適用します。kubectl apply -f YAML_FILE_NAMEYAML_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:v1kubectlでクラスタに構成を適用します。kubectl apply -f hello-pod.yamlkubectl 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-west1PROJECT_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-west1PROJECT_NAME: Artifact Registry リポジトリをホストする Google プロジェクトの名前。クラスタのプロジェクトと同じでない場合があります。リポジトリが別のプロジェクトにある場合は、クラスタと同じプロジェクトにない場合に Artifact Registry を使用するで追加の手順を確認してください。
kubectlでクラスタに構成を適用します。kubectl apply -f hello-deployment.yamlkubectl podsで、Deployment が実行されていることを確認します。kubectl get pods --selector=app=products出力には、3 つの
RunningPod が表示されます。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 ファイルの名前。