我在 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 文件内创建另一个服务帐户,但它没有工件存储库的权限,并且也以错误结束。 我在这里遗漏了一些拼图。如何才能部署成功?
这很令人困惑,但是...
Google(又名 IAM)服务帐户!= Kubernetes 服务帐户。
您不能使用 Google (IAM) 服务帐户 (
{account}@{project}.iam.gserviceaccount.com
) 作为 Kubernetes 服务帐户
您可以通过多种方式配置 Kubernetes 服务帐户来模拟 Google (IAM) 服务帐户;实际上,Google (IAM) 服务帐户与 Kubernetes 服务帐户成为“孪生”。
首选机制是工作负载身份联合(WIF)。虽然启用|配置有点曲折,但它工作得很好,是一个优雅的解决方案。
参见: