我们在自己部署autoscaler到gke集群中的时候遇到了403的问题,这个问题后来我们自己部署gcp-filestore-csi-driver的时候也遇到了。
Error listing migs from zone us-central1-c; err=googleapi: Error 403: Required 'compute.instanceGroupManagers.list' permission for 'projects/wujiuye-410808', forbidden
Failed to create GCE Manager: failed to fetch MIGs: googleapi: Error 403: Required 'compute.instanceGroupManagers.get' permission for 'projects/wujiuye-410808/zones/us-central1-c/instanceGroupManagers/gke-autoscaler-test2-test-group2-59ccd9f7-grp', forbidden
对于初次接触gcp平台,肯定会遇到这个问题。这其实是因为autoscaler和gcp-filestore-csi-driver都是需要调用googleapi的,而调用api就少不了鉴权。
gcp的鉴权方式不同于aws、aliyun等平台,通常使用aws、aliyun等平台我们需要配置ak、sk,而gcp我们需要配置GOOGLE_APPLICATION_CREDENTIALS环境变量,这个变量的值指向一个鉴权配置文件。
例如:
export GOOGLE_APPLICATION_CREDENTIALS=/etc/cloud_sa/autoscaler.json
autoscaler.json的内容怎么来呢?
首先登录gcp,找到IAM -> 服务账号 , 创建服务账号。
此案例中,我们创建名为autoscaler-deploy的服务账号,点击创建并继续。
如果我们是部署autoscaler,由于autoscaler需要调用GCE(Compute Engine)产品的API,所以需要给autoscaler选择拥有相关权限的角色。这里为了简单说明,我们直接选择Admin角色。下一步直接创建账号。
创建完服务账号后,我们需要为服务账号创建密钥,如下图。我们选择类型为JSON,点击创建。
创建完成会自动下载,拿到下载的密钥,我们再将密钥文件移动到GOOGLE_APPLICATION_CREDENTIALS环境变量指定的路径就可以了(如果是本地debug)。
如果是部署到gke集群中,我们可以这样做。
将密钥内容拷贝出来,创建一个Secret资源,例如:
apiVersion: v1
kind: Secret
metadata:
name: autoscaler-deploy-sa
namespace: [你的autoscaler部署的namespace]
data:
autoscaler-deploy.json: >-
[这里是密钥文件内容]
type: Opaque
然后修改autoscaler的Deployment给容器挂盘Secret资源,例如:
volumeMounts:
- name: cloud-sa-volume
readOnly: true
mountPath: /etc/cloud_sa
volumes:
- name: cloud-sa-volume
secret:
secretName: autoscaler-deploy-sa
然后给容器配置GOOGLE_APPLICATION_CREDENTIALS环境变量:
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: "/etc/cloud_sa/autoscaler-deploy.json"
这样部署autoscaler就可以正常访问googleapi了。
只是gcp并不推荐这种方式,而是推荐我们使用使用 “Workload Identity Federation”,可以直接将IAM-服务账号跟k8s里面的ServiceAccount绑定。
服务账号密钥泄露后可能会带来安全风险。我们建议您不要下载服务账号密钥,而应使用 Workload Identity Federation 。您可以在此 详细了解在 Google Cloud 上对服务账号进行身份验证的最佳方式。