【问题标题】:Terraform GKE problem pulling from private gcr从私有 gcr 中提取的 Terraform GKE 问题
【发布时间】:2020-08-16 11:58:08
【问题描述】:

由于我无法通过 Terraform 使用标准 GKE 集群(请参阅 GKE permission issue on gcr.io with service account based on terraform),因此我现在创建了一个带有单独节点池的集群。但是,我仍然无法从 eu.gcr.io 私有仓库中提取基本容器。

我的terraform yml如下。

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

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

      network     = var.vpc_name
      subnetwork  = var.subnet_name

      remove_default_node_pool = true
      initial_node_count       = 1
      # minimum kubernetes version for master
      min_master_version = var.min_master_version

      master_auth {
        username = var.gke_master_user
        password = var.gke_master_pass
      }

    }

resource "google_container_node_pool" "primary_preemptible_nodes" {
  name     = "gke-node-pool"
  location = "${var.region}-a"

  cluster     = google_container_cluster.primary.name
  version     = var.node_version
  node_count  = 3

  node_config {
    preemptible  = true

    metadata = {
      disable-legacy-endpoints = "true"
    }

    # based on project number
    service_account = "328126791642-compute@developer.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",
    ]
  }
}

一切都创造得很好。然后我想用

部署在集群上

我使用以下 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/project-dev/api:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 5060

它继续给予:

Failed to pull image "eu.gcr.io/project-dev/api:latest": 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/lcm_api/manifests/latest".

Warning Failed 94s (x2 over 111s) kubelet, gke-cluster-dev-node-pool-90efd247-7vl4 错误:ErrImagePull

我在 kubernetes 集群中有开放的云壳,并且

docker pull eu.gcr.io/project-dev/api:latest 

工作得很好。

我在这里的想法严重不足(并考虑回到 AWS)。会不会和容器推送到 eu.gcr.io 的权限有关?

我用:

docker login -u _json_key --password-stdin https://eu.gcr.io < /home/jeroen/.config/gcloud/tf_admin.json

在本地,其中 tf_admin.json 是我创建基础架构项目的管理项目的服务帐户。然后我推

docker push eu.gcr.io/project-dev/api:latest   

另一个想法。从文档和其他 stackoverflow 问题(参见例如GKE - ErrImagePull pulling from Google Container Registry)来看,拥有正确的服务帐户和 oauth-scopes 似乎很关键。拉动时如何检查它是否使用了正确的服务帐户?以及是否正确分配了范围?

【问题讨论】:

    标签: terraform google-kubernetes-engine service-accounts terraform-provider-gcp gcr.io


    【解决方案1】:

    似乎带有 OAuth 范围的官方 terraform 示例已过时,不应使用。我的解决方法是通过 OAuth 范围授予所有权限并使用 IAM 角色来管理它:

        oauth_scopes = [
          "https://www.googleapis.com/auth/cloud-platform",
        ]
    

    您也可以查看similar issue

    【讨论】:

    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2023-04-06
    • 2021-05-01
    相关资源
    最近更新 更多