GCP + k8sで共有registryからコンテナImageを読み込む #gcp #メモ
プロジェクト毎にregistry作るの意味なくね?と思ったので、ほぼ全てのコンテナImageをアップロードしたregistry付きプロジェクト(以降project-reg)を作った。
ここに対してImageをpullするには、docker login -e
相当のことをpodでしなければならない。
Service Account on GCPを作成
project-regにroles/storage.objectViewerロールの付与されたService Accountを作成。 Terraformだと↓。
resource "google_service_account" "container_registry_reader" { account_id = "docker-image-reader" display_name = "Docker Image Reader(Puller)" } resource "google_project_iam_policy" "project_owner" { project = "${var.project_id}" policy_data = "${data.google_iam_policy.image_puller.policy_data}" } data "google_iam_policy" "image_puller" { binding { role = "roles/storage.objectViewer" members = [ "serviceAccount:${google_service_account.container_registry_reader.email}", ] } }
該当Service Accountのkeyを作成
Terraformのやりかたはわからなかった。
gcloud iam service-accounts keys create docker-image-reader-secret.json --iam-account=docker-image-reader@project.iam.gserviceaccount.com
Kubernetesにシークレットを作成
% kubectl create secret docker-registry gcr-pull-key --docker-email=docker-image-reader@project.iam.gserviceaccount.com --docker-password="$(cat docker-image-reader-secret.json)" --docker-server=https://gcr.io --docker-username=_json_key
PODのサービスアカウントを更新
% kubectl get sa default -o yaml > ./service_accounts.yaml % vim service_accounts.yaml # [delete line with key "resourceVersion"] # [add lines with "imagePullSecret:"] % kubectl replace sa default -f ./service_accounts.yaml
PODのコンテナ更新
% vim deployment.yaml % kubectl replace --filename ./deployment.yaml