Google云、Kubernetes和云SQL代理:默认计算引擎服务帐户问题

Google云、Kubernetes和云SQL代理:默认计算引擎服务帐户问题,kubernetes,google-cloud-platform,gcloud,cloud-sql-proxy,Kubernetes,Google Cloud Platform,Gcloud,Cloud Sql Proxy,我有谷歌云项目A、B、C、D。它们都使用类似的设置来进行Kubernetes集群和部署。项目A、B和C已在几个月前建成。他们都使用谷歌云SQL代理连接到谷歌云SQL服务。现在,当我最近开始为项目D设置Kubernetes时,我在Stackdriver日志中看到以下错误: the default Compute Engine service account is not configured with sufficient permissions to access the Cloud SQL A

我有谷歌云项目A、B、C、D。它们都使用类似的设置来进行Kubernetes集群和部署。项目A、B和C已在几个月前建成。他们都使用谷歌云SQL代理连接到谷歌云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
我比较了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]
apiVersion:apps/v1beta2 种类:部署 元数据: 名称:我的网站 标签: 系统:projectA 规格: 选择器: 火柴标签: 系统:projectA 模板: 元数据: 标签: 系统:projectA 规格: 容器: -名称:网站 图片:gcr.io/customerA/projectA:alpha1 端口: -集装箱港口:80 环境: -名称:DB_主机 数值:127.0.0.1:3306 #启动吊舱需要这些秘密。 #[启动cloudsql\u机密] -姓名:DB_用户 价值来源: secretKeyRef: 名称:cloudsql数据库凭据 关键字:用户名 -名称:DB_密码 价值来源: secretKeyRef: 名称:cloudsql数据库凭据 密钥:密码 #[结束cloudsql_机密] #更改此处以包括您的GCP #项目、云SQL实例的区域和名称 #您的云SQL实例。格式是 #$PROJECT:$REGION:$INSTANCE #[启动代理\u容器] -名称:cloudsql代理 图片:gcr.io/cloudsqldocker/gce代理:1.11 命令: -嘘 --c -/cloud\u sql\u proxy-instances=my gcloud项目:europe-west1:databaseName=tcp:3306 --credential_file=/secrets/cloudsql/credentials.json #[启动cloudsql\u安全\u上下文] securityContext: runAsUser:2#非root用户 allowPrivilegeEscalation:false #[结束cloudsql\u安全\u上下文] 体积数量: -名称:cloudsql实例凭据 mountPath:/secrets/cloudsql 只读:正确 #[结束代理\u容器] #[开始卷] 卷数: -名称:cloudsql实例凭据 秘密: secretName:cloudsql实例凭据 #[末卷] 因此,默认服务帐户似乎没有足够的权限?谷歌云不允许在通过谷歌云控制台创建集群时启用云SQL API


根据我在谷歌上搜索到的这个问题,有人说问题出在gcr.io/cloudsql-docker/gce-proxy映像上,但我尝试了更新的版本,但仍然出现相同的错误。

我找到了这个问题的解决方案,它在创建集群时设置了
服务帐户
参数。请注意,我尚未测试新服务帐户所需的最低权限

以下是步骤:

  • 创建新服务帐户,不需要API密钥。我用的名字是“超级服务”
  • 为新服务帐户分配角色:云SQL管理员、计算管理员、Kubernetes引擎管理员、编辑器
  • 使用
    gcloud
    使用新服务帐户创建这样的集群
gcloud容器群集创建我的群集\
--区域=欧洲西部1-c\
--标签=系统=项目A\
--节点数=3\
--启用主授权网络\
--启用网络策略\
--启用ip别名\
--服务帐户=超级-service@project-D.iam.gserviceaccount.com\
--主授权网络

然后集群和部署至少在部署时没有出现错误。

您的回答是正确的,但您也可以将所需的角色添加到计算引擎默认服务帐户中。@JohnHanley,最初我确实尝试将“Cloud SQL Admin”角色添加到默认服务帐户中,但这还不够。这就是为什么我有点困惑的原因。@JohnHanley“此默认服务帐户可能有权限也可能没有权限使用您需要的Google云服务。可以扩展默认服务帐户的范围,但这可能会产生安全风险,因此不推荐使用。”()@QuicoMoya-选择服务帐户(凭证/机密)管理策略有很多方面。如果默认服务帐户没有所需的角色,则必须创建另一个服务帐户,然后必须将关键材料分发到容器。在我看来,这也是一种安全风险。平衡集群所需的IAM角色和单个容器需要规划。我的评论不是最好的,而是可能的。
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>