Разрешение GKE на gcr.io с учетной записью службы на основе terraform - PullRequest
0 голосов
/ 01 мая 2020

У меня проблемы с получением контейнеров от gcr.io

$ kubectl get po
NAME                              READY   STATUS             RESTARTS   AGE
api-deployment-74d8cf8768-x8bsk   0/2     ImagePullBackOff   4          2m43s

Я создаю эти развертывания со следующим файлом yml (deploy.yml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: api
  template:
    metadata:
      labels:
        component: api
    spec:
      containers:
      - name: api
        image: eu.gcr.io/api:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 5060

из GKE - ErrImagePull извлекает данные из реестра контейнеров Google Я предполагаю, что это в основном проблема с разрешениями.

Если я сделаю

kubectl describe pod api-deployment-74d8cf8768-x8bsk

, я получу

rpc error: code = Unknown desc = Error response from daemon: pull access denied for eu.gcr.io/<project-dev>/api, repository does not exist or may require 'docker login': denied: Permission denied for "latest" from request "/v2/<project-dev>/api/manifests/latest"

Однако неясно, как установить соответствующую учетную запись службы с помощью terraform.

Моя настройка заключается в следующем. Я создал проект администрирования terraform в GCP (terraform-admin) с учетной записью службы

tf-admin@terraform-admin.iam.gserviceaccount.com

, которая содержит состояние удаленного terraform et c. Учетная запись службы имеет множество ролей, таких как:

Compute Network Admin
Kubernetes Engine Cluster Admin
...

Затем я создаю свой фактический проект-проект project-dev (используя учетные данные этой учетной записи службы). В project-dev tf-admin@terraform-admin.iam.gserviceaccount.com это также учетная запись iam как

Owner
Compute Network Admin
Kubernetes Engine Cluster Admin

Однако это не служебная учетная запись. Единственная учетная запись службы, которую я вижу, это

<project-dev-ID>-compute@developer.gserviceaccount.com

, которая является «учетной записью службы по умолчанию Compute Engine», которая, вероятно, не имеет соответствующих разрешений. В проекте-dev у меня также есть реестр контейнеров, в котором содержатся мои частные контейнеры.

Как уже говорилось, я создаю свой кластер GKE, используя Terraform. Ниже приведен мой (сокращенно) файл yml.

resource "google_container_cluster" "primary" {
  name     = "gke-cluster"
  location = "${var.region}-b"

  node_locations = [
    "${var.region}-c",
    "${var.region}-d",
  ]

  node_version       = var.node_version
  initial_node_count = 3
  network            = var.vpc_name
  subnetwork         = var.subnet_name

  addons_config {

    horizontal_pod_autoscaling {
      disabled = false
    }

  }

  master_auth {
    username = 'user'
    password = 'password'
  }

  node_config {

    # I HAVE TRIED ADDING THIS, BUT IT RESULT IN AN ERROR
    # Error: googleapi: Error 400: The user does not have access to service account 
    # service_account = "tf-admin@terraform-admin.iam.gserviceaccount.com"

    oauth_scopes = [
      "https://www.googleapis.com/auth/compute",
      "https://www.googleapis.com/auth/devstorage.read_only",
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]

    labels = {
      env = var.gke_label["${terraform.workspace}"]
    }

    disk_size_gb = 10
    machine_type = var.gke_node_machine_type
    tags         = ["gke-node"]
  }
}

Теперь я должен попытаться (и если да, то как) добавить свою учетную запись службы tf-admin в качестве служебной учетной записи в project-dev или добавить конкретная c учетная запись службы (опять же, как?) для проекта-dev для kubernetes?

1 Ответ

0 голосов
/ 01 мая 2020

Вы можете использовать учетную запись службы вычислений по умолчанию <projectID>-compute@developer.gserviceaccount.com, которая имеет все необходимые разрешения для доступа к GCR. Просто убедитесь, что вы используете области по умолчанию для кластера или убедитесь, что области gcr включены вместе с разрешениями на чтение хранилища.

В качестве альтернативы, вы можете использовать Terraform для создания учетной записи службы с достаточными разрешениями (например, для хранилища). роль средства просмотра), а затем назначьте эту учетную запись службы пулу узлов. В этом случае вы захотите установить для oauth_scopes значение cloud_platform, чтобы области не мешали разрешениям IAM.

Вы можете просмотреть области GKE по умолчанию здесь

...