在 gke 部署中使用服务帐户时出现问题

问题描述 投票:0回答:1

我在 terraform 中创建了一个服务帐户。我想用它来使用存储在工件中的 docker 映像来部署工作负载。

resource "google_service_account" "artifact_reader" {
 account_id = "artifact-reader" 
 display_name = "Artifact Reader Service Account for Deployments"

 project = var.project_id 
}

resource "google_project_iam_binding" "artifact_reader_binding" {
 project = var.project_id
 role = "roles/editor" 

 members = [
 "serviceAccount:${google_service_account.artifact_reader.email}"
 ]
}

它创建了一个可以使用

gcloud iam service-accounts describe
查看的服务并给出结果:

displayName: Artifact Reader Service Account for Deployments
email: [email protected]
etag: MDEwMjE5MjA=
name: projects/as1/serviceAccounts/[email protected]
oauth2ClientId: '116283672136579491873'
projectId: as1
uniqueId: '116283672136579491873'

到目前为止一切顺利...

我的 yaml 文件包含 Stateful Set 定义:

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
 name: my-ssh
 labels:
 app: ssh
spec:
 replicas: 1
 selector:
 matchLabels:
 app: ssh
 template:
 metadata:
 labels:
 app: ssh
 spec:
 serviceAccountName: [email protected] 
 containers:
 - name: ssh 
 image: europe-north1-docker.pkg.dev/as1/bounce/bounce:latest
 ports:
 - containerPort: 22

但是在部署过程中我遇到了错误:

在 StatefulSet my-ssh 中创建 Pod my-ssh-0 失败错误:pods “my-ssh-0”被禁止:查找服务帐户时出错 默认/[电子邮件受保护]:服务帐户 找不到“[电子邮件受保护]

我猜测“default/”是命名空间,但我没有在 yaml 文件中的任何位置或创建服务帐户时修改命名空间,因此服务帐户和部署应该位于同一命名空间中(?)。我还尝试在 yaml 文件内创建另一个服务帐户,但它没有工件存储库的权限,并且也以错误结束。 我在这里遗漏了一些拼图。如何才能部署成功?

kubernetes gcloud service-accounts
1个回答
0
投票

这很令人困惑,但是...

Google(又名 IAM)服务帐户!= Kubernetes 服务帐户。

不能使用 Google (IAM) 服务帐户 (

{account}@{project}.iam.gserviceaccount.com
) 作为 Kubernetes 服务帐户

您可以通过多种方式配置 Kubernetes 服务帐户来模拟 Google (IAM) 服务帐户;实际上,Google (IAM) 服务帐户与 Kubernetes 服务帐户成为“孪生”。

首选机制是工作负载身份联合(WIF)。虽然启用|配置有点曲折,但它工作得很好,是一个优雅的解决方案。

参见:

© www.soinside.com 2019 - 2024. All rights reserved.