google-kubernetes-engine - 基于 terraform 的服务帐户在 gcr.io 上的 GKE 权限问题

标签 google-kubernetes-engine service-accounts terraform-provider-gcp

我在从 gcr.io 获取容器时遇到了问题

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

我使用以下 yml 文件 (deployment.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 pulling from Google Container Registry我猜这主要是权限问题。

如果我这样做

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 设置适当的服务帐户。

我的设置如下。我使用服务帐户在 GCP (terraform-admin) 中创建了一个 terraform 管理项目

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

包含远程地形状态等。服务帐户有许多角色,例如:

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 默认服务帐户”。在 project-dev 上,我还有包含我的私有(private)容器的容器注册表。

如前所述,我使用 Terraform 创建了我的 GKE 集群。下面是我的(缩写的)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 中的服务帐户,或者我应该添加一个特定的服务帐户(同样,如何?)到 project-dev对于 kubernetes?

最佳答案

您可以使用默认计算服务帐户 <projectID>-compute@developer.gserviceaccount.com它确实具有访问 GCR 所需的所有权限。只需确保您使用集群的默认范围或确保启用 gcr 范围以及存储读取权限即可。

或者,您可以使用 Terraform 创建一个具有足够权限(例如存储查看者角色)的服务帐户,然后将该服务帐户分配给节点池。在这种情况下,您需要将 oauth_scopes 设置为 cloud_platform 以确保范围不会干扰 IAM 权限。

您可以查看默认的 GKE 范围 here

关于google-kubernetes-engine - 基于 terraform 的服务帐户在 gcr.io 上的 GKE 权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61544944/

相关文章:

c# - 我们可以使用服务帐户访问 GMAIL API 吗?

java - YouTube 分析和 Google 服务帐户

google-kubernetes-engine - 尝试在 GKE 上升级 Pod 时出错

airflow - Composer 2/GKE Autopilot 集群 PodOperator 任务的工作负载身份和服务帐户

kubernetes - 如何从 Terraform 中的不同目录访问文件和变量?

google-cloud-platform - 同时发生了政策变化。请使用指数退避重试整个读取-修改-写入

google-cloud-platform - 错误: instance type null does not match any allowed primitive type

go - 从容器内运行的应用程序使用 Gmail API

google-kubernetes-engine - 谷歌容器引擎 : pod creation stuck in 'Pending' status

kubernetes - 有没有办法向 kube-dns 添加任意记录?