我在从 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/