Google Cloud、Kubernetes 和 Cloud SQL 代理:默认 Compute Engine 服务帐户问题
Posted
技术标签:
【中文标题】Google Cloud、Kubernetes 和 Cloud SQL 代理:默认 Compute Engine 服务帐户问题【英文标题】:Google Cloud, Kubernetes and Cloud SQL proxy: default Compute Engine service account issue 【发布时间】:2019-11-27 07:18:14 【问题描述】:我有 Google Cloud 项目 A、B、C、D。它们都对 Kubernetes 集群和部署使用类似的设置。项目 A、B 和 C 已于数月前建成。他们都使用 Google Cloud SQL 代理连接到 Google Cloud SQL 服务。现在,当我最近开始为项目 D 设置 Kubernetes 时,我在 Stackdriver 日志记录中看到以下错误:
the default Compute Engine service account is not configured with sufficient permissions to access the Cloud SQL API from this VM. Please create a new VM with Cloud SQL access (scope) enabled under "Identity and API access". Alternatively, create a new "service account key" and specify it using the -credential_file parameter
我比较了 Kubernetes 集群在 A、B、C 和 D 之间的区别,但它们看起来是一样的。
这是我正在使用的部署
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: my-site
labels:
system: projectA
spec:
selector:
matchLabels:
system: projectA
template:
metadata:
labels:
system: projectA
spec:
containers:
- name: web
image: gcr.io/customerA/projectA:alpha1
ports:
- containerPort: 80
env:
- name: DB_HOST
value: 127.0.0.1:3306
# These secrets are required to start the pod.
# [START cloudsql_secrets]
- name: DB_USER
valueFrom:
secretKeyRef:
name: cloudsql-db-credentials
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: cloudsql-db-credentials
key: password
# [END cloudsql_secrets]
# Change <INSTANCE_CONNECTION_NAME> here to include your GCP
# project, the region of your Cloud SQL instance and the name
# of your Cloud SQL instance. The format is
# $PROJECT:$REGION:$INSTANCE
# [START proxy_container]
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command:
- sh
- -c
- /cloud_sql_proxy -instances=my-gcloud-project:europe-west1:databaseName=tcp:3306
- -credential_file=/secrets/cloudsql/credentials.json
# [START cloudsql_security_context]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
# [END cloudsql_security_context]
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
# [END proxy_container]
# [START volumes]
volumes:
- name: cloudsql-instance-credentials
secret:
secretName: cloudsql-instance-credentials
# [END volumes]
所以看起来默认服务帐户没有足够的权限?通过 Google Cloud 控制台创建集群时,Google Cloud 不允许启用 Cloud SQL API。
根据我在谷歌上搜索到的这个问题,有人说问题出在 gcr.io/cloudsql-docker/gce-proxy 映像上,但我尝试了较新的版本,但仍然出现同样的错误。
【问题讨论】:
【参考方案1】:我找到了解决这个问题的方法,它在创建集群时设置了service-account
参数。请注意,我尚未测试新服务帐号所需的最低权限。
步骤如下:
创建新的服务帐户,不需要 API 密钥。我用的名字是“超级服务” 将角色 Cloud SQL admin、Compute Admin、Kubernetes Engine Admin、Editor 分配给新的服务帐号 使用gcloud
使用新的服务帐户创建这样的集群
gcloud container clusters create my-cluster \
--zone=europe-west1-c \
--labels=system=projectA \
--num-nodes=3 \
--enable-master-authorized-networks \
--enable-network-policy \
--enable-ip-alias \
--service-account=super-service@project-D.iam.gserviceaccount.com \
--master-authorized-networks <list-of-my-ips>
然后集群和部署至少部署没有错误。
【讨论】:
您的答案是正确的,但您也可以将所需的角色添加到 Compute Engine 默认服务帐户。 @JohnHanley ,最初我确实尝试将“Cloud SQL Admin”角色添加到默认服务帐户,但这还不够。这就是为什么它让我有点困惑。 @JohnHanley “此默认服务帐户可能有权使用您需要的 Google Cloud 服务,也可能没有权限。可以扩展默认服务帐户的范围,但这会产生安全风险,不建议这样做。” (cloud.google.com/kubernetes-engine/docs/tutorials/…) @QuicoMoya - 选择服务帐户(凭据/秘密)管理策略有很多方面。如果默认服务帐户没有所需的角色,则必须创建另一个服务帐户,然后必须将密钥材料分发到容器。在我看来,这也是一个安全风险。平衡集群所需的 IAM 角色和各个容器需要进行规划。我的评论不是什么是最好的,而是什么是可能的。以上是关于Google Cloud、Kubernetes 和 Cloud SQL 代理:默认 Compute Engine 服务帐户问题的主要内容,如果未能解决你的问题,请参考以下文章
从 Kubernetes pod 直接将数据写入 Google Cloud Storage
如何在 Google Cloud Platform 中编辑 Kubernetes 集群的描述字段?
Kubernetes 更新更改了 Google Cloud 中节点的静态+保留外部 IP
在 Google Cloud 上的何处配置 Kubernetes 集群自动扩缩器?
如何使用工作负载身份通过 Google Cloud .NET SDK 访问 Google Kubernetes Engine 中的 ESP?