読者です 読者をやめる 読者になる 読者になる

Got Some \W+ech?

Could be Japanese. Could be English. Android, セキュリティ, 機械学習などをメインに、たまにポエムったり雑感記載したりします。

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