基于地形的服务帐户在gcr.io上发布GKE权限



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

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

我使用以下yml文件(deployml.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从谷歌容器注册表中提取我猜这主要是一个权限问题。

如果我做

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(地形管理(中创建了一个地形管理项目

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

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

Compute Network Admin
Kubernetes Engine Cluster Admin
...

然后,我创建了实际的开发项目项目dev(使用该服务帐户的凭据(。在项目开发中tf-admin@terraform-admin.iam.gserviceaccount.com也是iam帐户作为

Owner
Compute Network Admin
Kubernetes Engine Cluster Admin

但是,它不是一个服务帐户。我看到的唯一服务帐户是

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

它是一个"计算引擎默认服务帐户",可能没有适当的权限。在项目开发中,我还有一个容器注册表,其中包含我的私有容器。

如前所述,我使用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服务帐户添加为项目开发中的服务帐户,还是应该为kubernetes向项目开发添加一个特定的服务帐户(同样,如何?(?

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

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

你可以在这里查看默认的GKE范围

最新更新