从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范围