# 通过OIDC认证模式安装配置CES Exporter
在使用华为云CCE容器承载cloudeye-exporter能力的过程中，用户在调用云服务API接口时，通常需要预先配置固定的AK/SK（访问密钥和安全密钥）。然而，这种做法无法满足用户对于更高安全性的需求，尤其是在需要频繁更换密钥或在多用户环境中管理密钥时。为了解决这一问题，用户希望采用更安全的认证方式，即通过SDK OIDC（OpenID Connect）方式自动获取临时AK/SK/Security Token，从而实现免AK/SK的访问。如何在不影响现有业务的前提下，实现这一安全访问方式的转换，成为当前亟待解决的问题。为此，华为云提供了一种新的认证鉴权方式，用户只需在启动cloudeye-exporter时指定-auth_mode参数为oidc，并配置相应的OIDC相关参数，即可实现安全、便捷的API接口调用。
#### 约束与限制
- CES Exporter导出指标时，需调用云服务接口查询资源，当前部分云服务不支持OIDC认证模式，这部分云服务可使用AK/SK认证模式对接。[表1]列出当前未支持oidc认证模式的云服务及相关维度。
  ![](https://support.huaweicloud.com/usermanual-ces/public_sys-resources/note_3.0-zh-cn.png)
  云监控服务最大支持4个层级维度，维度编号从0开始，编号3为最深层级。例如监控指标中的维度信息为"gaussdb_mysql_instance_id,gaussdb_mysql_node_id"时，表示对应的监控指标的维度存在层级关系，且"gaussdb_mysql_instance_id"为0层，"gaussdb_mysql_node_id"为1层。
   表1不支持OIDC认证模式的云服务 
  | 云服务                     | 命名空间               | 维度                                            | 维度描述                               |
  |:---|:---|:---|:---|
  | GeminiDB（兼容DynamoDB接口） | SYS.NoSQL         | ddb_table_id                                 | GeminiDB Serverless表ID           |
  | 湖仓构建                   | SYS.LakeFormation | instance_id                                    | LakeFormation实例ID                |
  | 云连接                     | SYS.CC             | cloud_connect_id,bwp_id,region_bandwidth_id   | 云连接ID,带宽包ID,域间带宽ID              |
  | 弹性文件服务            | SYS.SFS       | share_id                                       | 容量型SFS ID                       |
  | 弹性文件服务            | SYS.SFS       | bucket_name                                   | 通用文件系统ID                         |
  | 云数据库TaurusDB     | SYS.GAUSSDB  | gaussdb_mysql_instance_id,gaussdb_mysql_node_id | TaurusDB实例ID,TaurusDB节点ID       |
  | 云数据库TaurusDB     | SYS.GAUSSDB  | gaussdb_mysql_ha_id,gaussdb_mysql_ha_node_id   | TaurusDB经典架构实例ID,TaurusDB经典架构节点ID |
     
  
- CES Exporter目前仅支持安装在**Linux x86架构的操作系统** 中，主机规格选择**"4vCPUs \| 8GiB"或更高配置**。
- OIDC认证模式仅适用于基于**CCE集群**部署Exporter的场景。
- 当您部署CES Exporter服务器为**ECS** ，并且ECS的区域与指标实例数据来源服务所在**区域** 不同时，必须**绑定EIP** ，才能访问数据。绑定EIP的操作方法，请参见[为资源绑定EIP](https://support.huaweicloud.com/usermanual-eip/eip_0009.html#section2)。
- CES Exporter支持的**拓展标签** 信息请参阅[支持的拓展标签说明](https://support.huaweicloud.com/usermanual-ces/ces_01_0155.html#ces_01_0155__section1915431714423)。
 
#### 前提条件
- 请确保有一台具备docker能力的操作系统，用于构建cloudeye-exporter镜像。
- 请确保华为云账号具有导出监控数据依赖的权限，具体权限请参阅[CES Exporter导出监控数据依赖的接口及授权项](https://support.huaweicloud.com/usermanual-ces/ces_01_0153.html#ces_01_0153__section1383216312812)。
 
#### 操作流程
![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002696188015.png)
#### 获取CCE集群的签名密钥并创建ServiceAccount
1. 登录CCE节点，登录方式请参阅[登录节点](https://support.huaweicloud.com/usermanual-cce/cce_10_0185.html)。
2. 使用kubectl连接集群，具体操作请参阅[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
3. 执行以下命令，获取公钥。
   ```
   kubectl get --raw /openid/v1/jwks
   ```
   返回的结果即集群的公钥，回显结果示例如下，其中，使用星号省略敏感信息，实际为具体值：
   ```
   # kubectl get --raw /openid/v1/jwks
   {"keys":[{"use":"sig","kty":"RSA","kid":"*****","alg":"RS256","n":"*****","e":"AQAB"}]}
   ```
   
4. 执行以下命令，创建ServiceAccount。
   ```
   kubectl  create sa oidc-token
   ```
   ![](https://support.huaweicloud.com/usermanual-ces/public_sys-resources/note_3.0-zh-cn.png)
   **oidc-token** 是ServiceAccount的名称，**[在IAM配置身份提供商]** 和**[创建并运行有OIDC能力的cloudeye-exporter工作负载]**时均会用到。
   
 
 #### 在IAM配置身份提供商
1. 登录[IAM控制台](https://console.huaweicloud.com/iam/?locale=zh-cn#/iam/users)。
2. 在左侧导航栏选择"**身份提供商**"，进入"身份提供商"页面。
3. 单击右上角"**创建身份提供商**"。
4. 在"创建身份提供商"页面，输入名称并根据界面提示配置参数。
   图1创建身份提供商   
   ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002696188011.png "点击放大")
   - 协议：OpenID Connect
   
   - 类型：虚拟用户SSO
   
   - 状态：启用
    
5. 单击"确定"，完成创建身份提供商。
6. 在"身份提供商"页面，单击新建的身份提供商所在行"操作"列的"修改"。
7. 在"修改身份提供商"页面，修改"**访问方式** "为"**编程访问**"。
8. 根据以下参数说明，配置"配置信息"。
   - **身份提供商URL** ：
     1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
     
     2. 单击集群名称，进入集群详情页面。
     
     3. 在"概览"页面下的"**连接信息** "区域，查看集群是否开启了"**OpenID Connect 提供商** "功能。
        - 是，请参考操作步骤[查看身份提供商的URL。]
        
        - 否，请使用集群**默认**的身份提供商："https://kubernetes.default.svc.cluster.local"。
         
     
     4. 查看身份提供商的URL。
        1. 单击集群详情页面左侧"配置中心"。
        
        2. 单击"Kubernetes原生配置"页签。
        
        3. 在"Kubernetes原生配置"页面中，"**服务账户令牌发行者 (service-account-issuer)**"的值即为身份提供商的URL。
         
      
   
   - **客户端ID** ：自定义一个ID，对应[创建并运行有OIDC能力的cloudeye-exporter工作负载]中**exporter-deploy.yaml**配置文件中的audience，例如：ces-test。
   
   - **签名公钥** ：CCE集群的签名公钥，请参考[3]中的返回结果填写。
    
9. 在"身份转换规则"区域，单击"创建规则"，创建身份转换规则。
10. 在"创建规则"弹窗中，输入用户名，并配置规则参数，规则参数说明请参阅[配置身份转换规则](https://support.huaweicloud.com/usermanual-iam/iam_08_0008.html)。
    身份映射规则作用是将工作负载的ServiceAccount和IAM用户做映射。为保证身份提供商ID访问云服务时，具有admin用户组的权限，需要将步骤[4]中在集群**default命名空间** 下创建的名为**oidc-token** 的ServiceAccount，映射到**admin** 用户组，请按照如下模板设置身份转换规则的生效条件，如[图2]所示。
    图2创建规则   
    ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002696307899.png "点击放大")
    - **用户组**：admin
    
    - **属性**：sub
    
    - **条件**：any_one_of
    
    - **值** ：system:serviceaccount:default:oidc-token
      值的规则如下，其中，Namespace为创建的 ServiceAccount 所在集群命名空间，ServiceAccountName：ServiceAccount名称
      ```
      system:serviceaccount:{Namespace}:{ServiceAccountName}
      ```
      
      
11. 在"创建规则"弹窗中，单击"确定"。
12. 在"修改身份提供商"页面，单击"确定"，完成身份提供商配置。 单击身份提供商所在行"操作"列的"查看"，身份提供商详细信息已更新成功。
    
 
#### 构建cloudeye-exporter镜像
1. 登录安装了docker的操作系统，进入[cloudeye-exporter开源项目](https://github.com/huaweicloud/cloudeye-exporter/releases)，下载最新软件包。
2. 解压安装包至镜像构建的路径下。
   参考命令：
   ```
   mkdir cloudeye-exporter
   cd cloudeye-exporter
   wget https://github.com/huaweicloud/cloudeye-exporter/releases/download/${version}/cloudeye-exporter-${version}.tar.gz
   tar -xzvf cloudeye-exporter-${version}.tar.gz
   ```
   
3. 执行以下命令，创建docker构建文件Dockerfile
   ```
   vi Dockerfile
   ```
   以下为Dockerfile的构建内容示例。
   ```
   FROM alpine:latest
   RUN mkdir -p /exporter
   COPY cloudeye-exporter /exporter/
   COPY endpoints.yml /exporter/
   COPY clouds.yml /exporter/
   COPY i18n.json /exporter/
   COPY metric.yml /exporter/
   COPY unit_standard_transform.json /exporter/
   COPY logs.yml /exporter/
   WORKDIR /exporter
   RUN chmod +x ./cloudeye-exporter
   CMD ["/exporter/cloudeye-exporter"]
   ```
   
4. 创建成功后，目录结构如下所示。
   ```
   .
   |-- Dockerfile
   |-- cloudeye-exporter
   |-- clouds.yml
   |-- endpoints.yml
   |-- i18n.json
   |-- logs.yml
   |-- metric.yml
   |-- unit_standard_transform.json
   ```
   
5. 执行构建命令，生成镜像。
   ```
   docker build -t cloudeye-exporter:v1.0 .
   ```
   
 
#### 上传cloudeye-exporter镜像至华为云SWR服务
在启动cloudeye-exporter前，需要将cloudeye-exporter镜像上传至华为云SWR服务。
若您的CCE节点本身具备docker能力，可以直接在CCE节点上构建本地镜像即可，不需要生成离线包。若您的CCE节点不具备docker能力，则需要生成离线镜像包，并上传到SWR服务。
您可以执行以下命令确认CCE节点是否具备docker能力：
```
docker version
```
- 若命令返回结果为docker版本号，则说明当前CCE节点具备docker能力，操作步骤请参见[在CCE节点构建本地镜像]。
- 若命令执行失败，则说明当前CCE节点不具备docker能力，操作步骤请参见[上传cloudeye-exporter离线镜像至华为云SWR服务]。
 
- [在CCE节点构建本地镜像]
  
  若您的CCE节点本身具备docker能力，可以直接在CCE节点上构建本地镜像即可，不需要生成离线包。
  ![](https://support.huaweicloud.com/usermanual-ces/public_sys-resources/caution_3.0-zh-cn.png)
  目前，cloudeye-exporter本地镜像的tag不符合上传命令模板要求，如[图3]所示。因此，需要确定组织名称、镜像名称和版本名称后，为镜像打tag。
  图3本地镜像tag   
  ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002696188001.jpg "点击放大")
  1. 登录[SWR控制台](https://console.huaweicloud.com/swr/#/swr/organization)。
  
  2. 在"组织管理"页面，获取需要上传镜像的组织名称。
     图4组织管理   
     ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002666508084.png "点击放大") 
  
  3. 登录CCE节点，执行以下命令，设置tag。
     在本案例中，示例区域为华北-北京四，组织名称为**cloud.test** ，镜像名称为**cloudeye-exporter** ，镜像版本为**v1.0** 。
     ```
     ctr images tag docker.io/library/cloudeye-exporter:v1.0  swr.cn-north-4.myhuaweicloud.com/cloud.test/cloudeye-exporter:v1.0
     ```
     
  
  4. 在SWR控制台左侧导航栏中选择"我的镜像"。
  
  5. 在"我的镜像"页面，单击右上角"客户端上传"。
  
  6. 在"客户端上传"弹窗中，单击"生成上传指令"，弹出"上传指令"弹窗。
  
  7. 在"通用型上传指令"页签下，复制生成的上传指令。
     图5通用型上传指令   
     ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002696307917.png "点击放大") 
  
  8. 登录CCE节点，执行步骤[7]获取的上传指令，将镜像推送至SWR自有镜像仓库。
     ```
     ctr image push --user cn-north-4@XXXXX:xxxxxxxxxxxxxxxxx swr.cn-north-4.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
     ```
     推送完成后，在"我的镜像 \> 自有镜像"列表下显示该镜像。
     图6我的镜像   
     ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002696307903.png "点击放大") 
   
- [上传cloudeye-exporter离线镜像至华为云SWR服务]
  
  若您的CCE节点不具备docker能力，则需要生成离线镜像包，并上传到SWR服务。
  1. 登录安装了docker的操作系统，执行以下命令，生成docker镜像离线包。
     ```
     docker save -o cloudeye-exporter.tar cloudeye-exporter:v1.0
     ```
     
  
  2. 登录CCE节点，执行以下命令，将cloudeye-exporter.tar传送至CCE节点，并加载该离线包为CCE节点上的本地镜像。
     ```
     ctr images import cloudeye-exporter.tar
     ```
     
   
 #### 创建并运行有OIDC能力的cloudeye-exporter工作负载
1. 登录CCE节点，执行以下命令，创建主配置文件clouds.yml。
   ```
   cd /exporter
   vi clouds.yml
   ```
   clouds.yml的配置参数说明如所示。
   表2global参数说明 
   | 参数                             | 参数说明                                                                                                                                                                                                                                                                                                                                       | 取值样例      |
   |:---|:---|:---|
   | port                          | 监听端口，默认的监控端口为8087。                                                                                                                                                                                                                                                                                                                     | 8087     |
   | prefix                        | CES Exporter会自动将查询到的指标数据与配置的前缀进行拼接，默认前缀为huaweicloud，无需进行修改。                                                                                                                                                                                                                                                                              | huaweicloud |
   | scrape_batch_size             | 查询CES指标数据时分页数，例如：300表示每页包含300条指标数据。保持默认即可。                                                                                                                                                                                                                                                                                              | 300        |
   | resource_sync_interval_minutes | 资源信息更新频率，单位为分钟，默认180分钟更新一次。当参数值小于10分钟，资源信息更新频率为10分钟一次。                                                                                                                                                                                                                                                                                  | 180       |
   | ignore_ssl_verify            | Exporter查询资源/指标时，是否校验ssl证书。可选配置，若用户因ssl证书校验导致功能异常，可将该配置项配置为true跳过ssl证书校验 - true：查询资源或监控指标数据时，跳过ssl证书校验。如果由于ssl证书校验导致功能异常，例如查询监控数据失败，可将该配置项配置为true。  - false：查询资源或监控指标数据时，需要进行ssl证书校验。   | false    |
      
   表3auth参数说明 
   | 参数           | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 取值样例                                      |
   |:---|:---|:---|
   | auth_url      | IAM用户认证地址，格式为"https://iam.{region_id}.myhuaweicloud.com/v3"，region_id请参阅[地区和终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint/CES)页面"区域"列。                                                                                                                                                                                                                                                                                                                                                                                    | https://iam.cn-north-4.myhuaweicloud.com/v3 |
   | project_name | 华为云项目名称。 登录[IAM控制台](https://console.huaweicloud.com/iam/?locale=zh-cn#/iam/projects)即可查看当前账号下的所有项目。                                                                                                                                                                                                                                                                                                                                                                                                       | cn-north-4                               |
   | region       | 指标数据所属区域的区域ID，区域ID信息请参阅[地区和终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint/CES)。                                                                                                                                                                                                                                                                                                                                                                                                                                          | cn-north-4                                |
   | oidc         | oidc认证参数。 - **id_token_file_path**：存放id_token的文件路径，取值为：/var/run/secrets/tokens/oidc-token  - **idp_id** ：身份提供商ID，取值为[在IAM配置身份提供商]中的身份提供商名称。  - **domain_id** ：华为云用户ID，登录[IAM控制台](https://console.huaweicloud.com/iam/?locale=zh-cn#/iam/users)，单击用户名，在用户详情中即可查看用户ID。   | -                                          |
      
   示例如下
   ```
   global:
     port: ":8087"
     prefix: "huaweicloud"
     scrape_batch_size: 300
     resource_sync_interval_minutes: 180
     ignore_ssl_verify: false
   auth:
     auth_url: "https://iam.cn-north-4.myhuaweicloud.com/v3"
     project_name: "cn-north-4"
     region: "cn-north-4"
     oidc:
       id_token_file_path: "/var/run/secrets/tokens/oidc-token"
       idp_id: "CES-Exporter"
       domain_id: "a3e3e8729602496d839bdbdcc5defxxx"
   ```
   
2. 执行以下命令，导入主配置文件clouds.yml为ConfigMap。
   ```
   kubectl create configmap exporter-config --from-file=/exporter/clouds.yml
   ```
   导入完成后可以在集群中查看配置项数据，如[图7]所示。
   图7查看配置项数据   
   ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002666508072.png "点击放大") 
3. 执行以下命令，创建cloudeye-exporter工作负载。
   ```
   vi exporter-deploy.yaml
   ```
   需要挂载的工作负载**exporter-deploy.yaml** 配置内容如下所示。
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: cloudeye-exporter
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: cloudeye-exporter
         version: v1.0
     template:
       metadata:
         labels:
           app: cloudeye-exporter
           version: v1.0
       spec:
         containers:
         - name: container-1
           image: swr.cn-north-4.myhuaweicloud.com/cloud.test/cloudeye-exporter:v1.0  # 镜像推送至SWR时使用的tag
           command:
             - /exporter/cloudeye-exporter  # 启动命令
           args:
             - '-auth_mode'  # 启动参数
             - oidc  # 以oidc认证方式启动
           volumeMounts:
           - mountPath: "/var/run/secrets/tokens"  # 将Kubernetes生成的serviceAccountToken挂载到/var/run/secrets/tokens/oidc-token文件内
             name: oidc-token
           - mountPath: /exporter/clouds.yml  # 定义clouds.yml挂载路径
             name: exporter-config-volume  # 引用挂载卷
             subPath: clouds.yml  # subPath声明，防止覆盖其他文件而导致其不可访问
         imagePullSecrets:
         - name: default-secret
         serviceAccountName: oidc-token  # “创建ServiceAccount”中创建的ServiceAccount名称
         volumes:
         - name: oidc-token
           projected:
             defaultMode: 420
             sources:
             - serviceAccountToken:
                 audience: ces-test   # 取值为“在IAM创建身份提供商”下的客户端ID
                 expirationSeconds: 7200       # OIDC Token 过期时间，单位为秒
                 path: oidc-token              # 路径名称，可自定义
         - name: exporter-config-volume # 获取clouds.yml主配置
           configMap:
             name: exporter-config
   ```
   
4. 使用如下命令，将上述配置实例化为工作负载容器。
   ```
   kubectl  apply -f exporter-deploy.yaml
   ```
   
5. 查看实例化结果。
   1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
   
   2. 单击实例名称进入实例详情。
   
   3. 在左侧导航栏，单击"工作负载"。
   
   4. 在工作负载列表中，单击工作负载名称。
   
   5. 查看容器实例状态为"运行中"并获取实例IP，实例IP用于步骤[6]查询监控数据。
      图8查看实例状态   
      ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002696307911.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-ces/public_sys-resources/note_3.0-zh-cn.png)
      如果实例状态异常，请通过[提交工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)联系客服寻求技术支持，确认问题原因。
      
    
6. 查看是否可以正常查询监控数据。
   1. 登录CCE节点。
   
   2. 执行以下命令，查询监控数据，如果能够正常查询出监控数据，表示Exporter配置成功。
      ```
      curl http://{容器实例IP}:8087/metrics?services=SYS.ECS
      ```
      图9查询监控数据   
      ![](https://support.huaweicloud.com/usermanual-ces/zh-cn_image_0000002696188003.png "点击放大") 
    
 
