Kubernetes 在GKE中创建具有共享网络的集群

Kubernetes 在GKE中创建具有共享网络的集群,kubernetes,networking,google-cloud-platform,terraform-provider-gcp,Kubernetes,Networking,Google Cloud Platform,Terraform Provider Gcp,我试图在GKE项目1中创建一个集群,共享项目2的网络 指定给服务帐户的角色: 项目1:Kubernetes引擎群集管理员、计算网络管理员、Kubernetes引擎主机服务代理用户 项目2:Kubernetes引擎服务代理、计算网络用户、Kubernetes引擎主机服务代理用户 服务帐户是在project-1下创建的。 在这两个项目中都启用了API和服务 但我一直在犯这个错误。 错误:googleapi:错误403:Kubernetes引擎服务代理缺少此项目所需的权限。有关更多信息,请参阅疑难解答

我试图在GKE项目1中创建一个集群,共享项目2的网络

指定给服务帐户的角色:
项目1:Kubernetes引擎群集管理员、计算网络管理员、Kubernetes引擎主机服务代理用户
项目2:Kubernetes引擎服务代理、计算网络用户、Kubernetes引擎主机服务代理用户

服务帐户是在project-1下创建的。 在这两个项目中都启用了API和服务

但我一直在犯这个错误。 错误:googleapi:错误403:Kubernetes引擎服务代理缺少此项目所需的权限。有关更多信息,请参阅疑难解答| Kubernetes引擎文档| Google Cloud:必需的“container.hostServiceAgent.use”权限用于“projects/project-2”。禁止使用

data "google_compute_network" "shared_vpc" {
    name = "network-name-in-project-2"
    project = "project-2"
}

 
data "google_compute_subnetwork" "shared_subnet" {
    name = "subnet-name-in-project-2"
    project = "project-2"
    region = "us-east1"
}

 # cluster creation under project 1
 # project 1 specified in Provider 
resource "google_container_cluster" "mowx_cluster" {
    name = var.cluster_name
    location = "us-east1"
    initial_node_count = 1
 
    master_auth {
        username = ""
        password = ""
 
        client_certificate_config {
            issue_client_certificate = false
        }
    }
 
    remove_default_node_pool = true
    cluster_autoscaling {
        enabled = false
    }
 
    # cluster_ipv4_cidr = var.cluster_pod_cidr
    ip_allocation_policy {
        cluster_secondary_range_name = "pods"
        services_secondary_range_name = "svc"
    }
 
    network = data.google_compute_network.shared_vpc.id
    subnetwork = data.google_compute_subnetwork.shared_subnet.id
}

这是一个基于评论中讨论的社区维基答案,并发布以提高可见性。请随意扩展它

您遇到的错误:

Error: googleapi: Error 403: Kubernetes Engine Service Agent is missing required permissions on this project. See Troubleshooting | Kubernetes Engine Documentation | Google Cloud for more info: required “container.hostServiceAgent.use” permission(s) for “projects/project-2”., forbidden
表示未创建必要的服务代理:

角色/container.serviceAgent
-Kubernetes引擎服务代理:

允许Kubernetes引擎帐户访问以管理群集资源。 包括访问服务帐户

该官员描述了此类问题的解决方案:

要解决此问题,如果您已从Google Kubernetes引擎服务帐户中删除了
Kubernetes引擎服务代理
角色, 把它加回去。否则,必须重新启用Kubernetes引擎API, 这将正确恢复您的服务帐户和权限。 您可以在gcloud工具或云控制台中执行此操作


上述解决方案的工作原理与您的用例中的帐户一样,因此必须(重新)创建帐户。

我认为您缺少的关键点是:Kubernetes引擎服务代理需要权限。这是分配给Google云服务的一种特殊类型的服务帐户。我在project 2下添加了project 1的服务帐户(名为Google API service Agent),并赋予了这两个角色。1.计算网络用户2。Kubernetes Engine主机服务代理用户,但我仍然收到错误。在哪里可以找到或创建“项目1的Kubernetes Engine服务代理”?项目1 IAM:1下只有两个自动生成服务帐户。计算引擎默认服务帐户2。Google API服务代理服务帐户列在IAM->Service Accounts下。要更改服务代理的角色,有时必须手动将服务代理电子邮件地址添加到IAM。文档对此进行了详细讨论。因此,只有当您通过gcloud命令创建gke集群时,它才会自动创建“Kubernetes Engine Service Agent for Project 1”。然后您可以使用terraform创建集群。