gcp平台google api的授权,与autoscaler部署配置授权

原创 吴就业 90 0 2024-05-17

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://www.wujiuye.com/article/5cc18d078f9541338b6d112b58c8475f

作者:吴就业
链接:https://www.wujiuye.com/article/5cc18d078f9541338b6d112b58c8475f
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

我们在自己部署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 -> 服务账号 , 创建服务账号。

截屏2024-05-17 15.43.23

此案例中,我们创建名为autoscaler-deploy的服务账号,点击创建并继续。

截屏2024-05-17 15.44.53

如果我们是部署autoscaler,由于autoscaler需要调用GCE(Compute Engine)产品的API,所以需要给autoscaler选择拥有相关权限的角色。这里为了简单说明,我们直接选择Admin角色。下一步直接创建账号。

创建完服务账号后,我们需要为服务账号创建密钥,如下图。我们选择类型为JSON,点击创建。

截屏2024-05-17 15.47.06

创建完成会自动下载,拿到下载的密钥,我们再将密钥文件移动到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 上对服务账号进行身份验证的最佳方式。

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

通过实验理解csi卷创建、挂载、卸载、删除的全流程

基于自定义的csi驱动,通过实验串联理解真个csi的工作流程。

如何编写一个CSI驱动项目,k8s csi驱动开发

CSI驱动必不可少的几个组件:csi-provisioner、controller组件、csi-node-driver-registrar、node组件,controller组件和node组件就是需要我们开发的,其实就是实现几个gRPC接口。

Kubernetes CSI插件中持久卷的挂载和映射机制

持久卷是什么时候创建的,是什么时候挂载的,是怎么创建怎么挂载的?

在gcp平台上创建一个gke集群,怎么获取gke集群的证书

在gcp平台上,使用gke服务,创建一个k8s集群,若想在本地能够通过kubectl命令或者可视化工具访问到集群,需要通过gcloud命令获取访问集群的证书。

基于开源autoscaler二次开发的目的以及效果演示

基于开源的autoscaler二次开发,通过自部署autoscaler来替代GKE提供的节点自动扩缩容能力,获取更好的扩展性和更灵活的配置。主要增强以下特性:支持目标负载扩容、更快的缩容速度、支持低负载自动缩容-重调度。

autoscaler缩减低利用率的节点,修改为使用节点的实时指标而不是requests

但其实我们忽略了一点,autoscaler是根据部署在节点上的所有Pod声明的requests来计算资源使用率的,这个并不能反应真实情况。