# CCE密钥管理（对接 DEW）
#### 插件简介
CCE密钥管理（原名dew-provider）插件用于对接[密码安全中心](https://support.huaweicloud.com/productdesc-dew/dew_01_0093.html)(Data Encryption Workshop, DEW)。该插件允许用户将存储在集群外部（即专门存储敏感信息的数据加密服务）的凭据挂载至业务Pod内，从而将敏感信息与集群环境解耦，有效避免程序硬编码或明文配置等问题导致的敏感信息泄密。安装该插件后，您可以使用以下能力：
- [基础挂载能力]：通过CCE密钥管理（对接DEW）插件，可以将DEW中相关的凭据信息挂载至业务Pod中，从而减少信息泄露的风险。
- [定时轮转能力]：当Pod正常运行后，若其在SPC中声明的、存储在云凭据管理服务中的凭据发生了更新，通过定时轮转，可以将最新的凭据值刷新至Pod内。使用该能力时，需要将凭据的版本指定为"latest"。
- [实时感知SPC变化能力]：当Pod正常运行后，若用户修改了在SPC中声明的凭据信息（如新增凭据、改变原有凭据的版本号等），插件可实时感知该变化，并将更新后的凭据刷新至Pod内。
 
#### 约束与限制
- 密码安全中心包含密钥管理(Key Management Service, KMS)、云凭据管理(Cloud Secret Management Service，CSMS)和密钥对管理(Key Pair Service, KPS)等服务。当前，该插件仅支持对接其中的云凭据管理服务。
- 允许创建的SecretProviderClass对象个数上限：500个。
- 插件卸载时，会同时删除相关的CRD资源。即使重装插件，原有的SecretProviderClass对象也不可用，请谨慎操作。插件卸载再重装后，若需使用原有的SecretProviderClass资源，需重新手动创建。
 
 #### 安装插件
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"插件中心"，在右侧找到**CCE密钥管理（对接DEW）**插件，单击"安装"。
3. 设置"委托配置"。1.1.106及以上版本的插件支持该配置。 
   插件在运行时需要访问其他云服务资源，需要您通过委托配置授权插件对各类云服务资源进行操作。详情请参见[插件自定义委托说明](https://support.huaweicloud.com/usermanual-cce/cce_10_1099.html)。
   - 使用系统推荐委托：自动创建该插件的默认委托并使用，默认委托如果已存在则不会重复创建。
   
   - 使用已有委托：在选择委托的下拉列表中选择创建的委托。**请确保已对创建的自定义委托授予了必须的权限，否则插件功能可能无法正常使用。**
    
   
   
4. 在安装插件页面，在参数配置栏进行参数配置。参数配置说明如下。 
   
   | 配置项     | 参数                    | 参数说明                                                                                                                  |
   |:---|:---|:---|
   | 凭据同步周期 | rotation_poll_interval | 轮转时间间隔。单位：分钟，即m（注意不是min）。 轮转时间间隔表示向云凭据管理服务发起请求并获取最新的凭据的周期，合理的时间间隔范围为\[1m, 1440m\]，默认值为2m。 |
      
   
   
5. 单击"安装"。 
   待插件安装完成后，选择对应的集群，然后单击左侧导航栏的"插件中心"，可在"已安装插件"页签中查看相应的插件。
   
   
 
#### 组件说明
表1dew-provider组件 
| 容器组件             | 说明                                                                                                                                                                                                                                                                                                                                                               | 资源类型     |
|:---|:---|:---|
| dew-provider      | dew-provider负责与云凭据管理服务交互，从云凭据管理服务中获取指定的凭据，并挂载到业务Pod内。                                                                                                                                                                                                                                                                                                             | DaemonSet |
| csi-secrets-store | csi-secrets-store负责维护两个CRD资源，即SecretProviderClass（以下简称为SPC）和SecretProviderClassPodStatus（以下简称为spcPodStatus），其中**SPC** **用于描述用户需要的凭据信息（比如指定凭据的版本、凭据的名称等），由用户创建，并在业务** **Pod** **中进行引用** ；**spcPodStatus** **用于跟踪** **Pod** **与凭据的绑定关系，由** **csi-driver** **自动创建，用户无需关心**。一个Pod对应一个spcPodStatus，当Pod正常启动后，会生成一个与之对应的spcPodStatus；当Pod生命周期结束时，相应的spcPodStatus也会被删除。 | DaemonSet  |
   
 #### 基础挂载
将DEW中的凭据信息挂载至容器中，需要完成3个步骤。
1. 首先，创建ServiceAccount。
2. 其次，创建SecretProviderClass，用于定义和获取DEW中的凭据信息。 访问DEW服务的Token支持如下两种模式：
   - **使用插件关联的临时委托Token（集中式权限模式）**：在创建SecretProviderClass时，声明useWorkloadCred为" false " 。插件关联的委托默认为CCESecretEncryptAgency，具备读取DEW服务中任意凭据的权限，用户也可以在安装插件选择自定义委托，按需收缩权限。此模式配置简单，适合对权限分离要求不高的场景。
   
   - **使用业务负载ServiceAccount关联的临时委托Token（最小权限模式）** ：在创建SecretProviderClass时，声明useWorkloadCred为 "true "。用户需要为业务负载的ServiceAccount绑定一个单独的委托，并提前为该委托分配**仅能读取该负载所需的特定凭据的权限，**插件会使用该委托的临时凭据去访问DEW服务，而无需使用CCESecretEncryptAgency委托或插件自身自定义委托中的权限。此模式适合对安全要求较高的场景。
    
3. 最后，将ServiceAccount和SecretProviderClass挂载到业务Pod中，确保Pod能够安全访问相关凭据。目前，支持两种挂载方式：
   - 使用Volume挂载凭据：适合大规模数据的挂载，以卷的形式将凭据挂载到容器中。
   
   - 使用密钥挂载凭据：适合小型的敏感数据，支持以环境变量的形式挂载至容器中。
    
以下内容将分别介绍具体使用流程。
- [使用Volume挂载凭据（通过插件委托访问DEW服务）]
  
  1. 创建ServiceAccount，用于声明允许业务Pod使用的DEW凭据名称。进行该步骤之前，请确保DEW的凭据管理服务中已存在相应凭据。如果凭据未创建，则向凭据管理服务中获取相应凭据时会出错，从而导致Pod无法正常运行。如果需要在DEW的凭据管理服务中创建相关凭据，请参见[创建凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)。
     
     图1DEW凭据列表   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002215792974.png "点击放大")
     
     1. 执行以下命令，创建ServiceAccount对象的YAML文件。
        ```
        vim serviceaccount.yaml
        ```
        文件内容如下，可以在**cce.io/dew-resource** 字段中声明允许业务使用的凭据名称。如secret_1和secret_2，后续将允许在业务Pod中引用这两个凭据对象。**若用户引用未在此处声明的凭据，则会挂载失败，从而导致** **Pod** **无法运行**。
        ```
        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: nginx-spc-sa
          annotations:
            cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]"  #secrets that allow pod to use
        ```
        
     
     2. 执行以下命令，创建ServiceAccount对象。
        ```
        kubectl apply -f serviceaccount.yaml
        ```
        回显结果如下：
        ```
        serviceaccount/nginx-spc-sa created
        ```
        
     
     3. 执行以下命令，查看ServiceAccount对象是否已经正常创建。
        ```
        kubectl get sa
        ```
        回显结果如下，则说明名为"nginx-spc-sa"的ServiceAccount对象已正常创建，该对象将在后续的业务Pod中被引用。
        ```
        NAME            SECRETS   AGE
        default         1         18d   # 此为系统默认的ServiceAccount对象
        nginx-spc-sa    1         19s   # 此为刚刚创建的ServiceAccount对象
        ```
        
     
     
     
     
  
  2. 创建SecretProviderClass，用于定义和管理来自DEW的凭据信息，以便凭据可以被CCE集群中的Pod安全地挂载。 
     1. 执行以下命令，创建SecretProviderClass对象的YAML文件。
        ```
        vim secretproviderclass.yaml
        ```
        文件内容如下，**主要关注** **parameters.objects** **字段，该字段以数组的形式声明您需要挂载的凭据信息**。
        ```
        apiVersion: secrets-store.csi.x-k8s.io/v1
        kind: SecretProviderClass
        metadata:
          name: spc-test
        spec:
          provider: cce     # 固定为cce
          parameters:
            objects: |
                  - objectName: "secret_1"
                    objectAlias: "secret_test"
                    objectVersion: "v1"
                    objectType: "csms"
            useWorkloadCred: "false"  # 可选值，默认为false，表示使用插件关联的临时委托Token访问DEW服务。如果为true，表示使用业务负载关联的临时委托Token访问DEW服务
        ```
        表2objects参数说明 
        | 参数            | 参数类型    | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
        |:---|:---|:---|:---|
        | objectName    | String  | 是  | 表示凭据名称，需填写ServiceAccount中引用的凭据。**若同一个SecretProviderClass中定义了多个objectName，不允许重名**，否则会挂载失败。                                                                                                                                                                                                                                                                                                                                                                                                                           |
        | objectAlias | String | 否 | 表示凭据写入到容器内的文件名称。 - 若不指定，则凭据写入到容器内的文件名默认为objectName；  - 若指定，则**objectAlias与其他凭据的objectName和objectAlias均不允许重名，与自身的objectName也不允许重名**，否则会挂载失败。                                                            |
        | objectType   | String    | 是   | 表示凭据类型。**当前仅支持"csms"类型**，其他均为非法输入。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
        | objectVersion  | String  | 是  | 表示凭据的版本。 - 指定某个具体的版本：v1，v2，...  - 指定最新版本：latest。当指定objectVersion为"latest"时，若在云凭据管理服务侧对应的凭据发生了更新，更新后的凭据值将在经过一定时间间隔后（即rotation_poll_interval）刷新至Pod内，即自动开启[定时轮转能力]。   |
           
        
     
     2. 执行以下命令，创建SecretProviderClass对象。
        ```
        kubectl apply -f secretproviderclass.yaml
        ```
        回显结果如下：
        ```
        secretproviderclass/spc-test created
        ```
        
     
     3. 执行以下命令，查看SecretProviderClass对象是否已经正常创建。
        ```
        kubectl get spc
        ```
        回显结果如下，则说明一个名为"spc-test"的SecretProviderClass对象已正常创建，该对象将在后续的业务Pod中被引用。
        ```
        NAME   AGE
        spc-test   20h
        ```
        
     
     
     
     
  
  3. 创建业务Pod，这里以创建一个nginx应用为例。 
     1. 定义业务负载，在serviceAccountName中引用此前创建好的ServiceAccount对象，secretProviderClass中引用此前创建好的SPC对象，并在mountPath中指定容器内的挂载路径（这里需注意，用户不应该指定"/"，"/var/run"等特殊目录，否则可能影响容器的正常启动）。
        ```
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: nginx-spc
          labels:
            app: nginx
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: nginx
          template:
            metadata:
              labels:
                app: nginx
            spec:
              serviceAccountName: nginx-spc-sa   # 引用上面创建的ServiceAccount
              volumes:
                - name: secrets-store-inline
                  csi:
                    driver: secrets-store.csi.k8s.io   # 指定Secrets Store CSI驱动，为固定值
                    readOnly: true                     # 将卷设置为只读，确保凭据不会被修改
                    volumeAttributes:
                      secretProviderClass: "spc-test"  # 引用上面创建的SPC
              containers:
                - name: nginx-spc
                  image: nginx:alpine
                  imagePullPolicy: IfNotPresent
                  volumeMounts:
                    - name: secrets-store-inline
                      mountPath: "/mnt/secrets-store"  # 定义容器内凭据的挂载路径
                      readOnly: true
              imagePullSecrets:
                - name: default-secret
        ```
        
     
     2. 创建业务Pod。
        ```
        kubectl apply -f deployment.yaml
        ```
        回显结果如下：
        ```
        deployment/nginx-spc created
        ```
        
     
     3. 执行以下命令，查看Pod是否已经正常创建。
        ```
        kubectl get pod
        ```
        回显结果如下，Pod的"STATUS"为"Running"，则说明已正常创建。
        ```
        NAME                           READY   STATUS     RESTARTS     AGE
        nginx-spc-67c9d5b594-642np     1/1     Running    0            20s
        ```
        
     
     4. 获取spcPodStatus查看Pod与凭据的绑定情况。
        执行以下命令，获取spcps资源名称。
        ```
        kubectl get spcps
        ```
        回显结果如下：
        ```
        NAME                                          AGE
        nginx-spc-67c9d5b594-642np-default-spc-test   103s
        ```
        执行以下命令，查看Pod与凭据的绑定情况。
        ```
        kubectl get spcps nginx-spc-67c9d5b594-642np-default-spc-test -o yaml
        ```
        回显结果如下，则说明该Pod与凭据已绑定。
        ```
        ......
        status:
        mounted: true
        objects:    # 挂载的凭据信息
        - id: secret_1
        version: v1
        podName: nginx-spc-67c9d5b594-642np   # 引用了SPC对象的Pod
        secretProviderClassName: spc-test               # SPC对象
        targetPath: /mnt/paas/kubernetes/kubelet/pods/6dd29596-5b78-44fb-9d4c-a5027c420617/volumes/kubernetes.io~csi/secrets-store-inline/mount
        ```
        
     
     5. 检查指定的凭据是否正常写入。
        1. 执行以下命令，进入容器内部。
           ```
           kubectl exec -ti nginx-spc-67c9d5b594-642np -- /bin/sh
           ```
           
        
        2. 依次执行以下命令，查找指定凭据。
           ```
           cd /mnt/secrets-store/
           ls
           ```
           回显结果如下，则说明用户在SPC对象中声明的secret_1已正常写入Pod。
           ```
           secret_1
           ```
           
         
     
     6. 凭据挂载成功后，将在容器内mountPath指定路径下生成与objectAlias同名的文件，文件内容为DEW中该凭据的值。应用程序读取该文件即可获取凭据，读取方式与读取普通文件一致。
     
     
     
     
   
- [使用Volume挂载凭据（通过工作负载委托访问DEW服务）]
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  CCE密钥管理（dew-provider）插件版本要求1.1.111及以上。
  1. 为业务负载创建ServiceAccount，并绑定一个具备最小必要权限的IAM委托。进行该步骤之前，请确保DEW的凭据管理服务中已存在相应凭据。如果凭据未创建，则向凭据管理服务中获取相应凭据时会出错，从而导致Pod无法正常运行。如果需要在DEW的凭据管理服务中创建相关凭据，请参见[创建凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)。
     
     图2DEW凭据列表   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002516793030.png "点击放大")
     
     1. 执行以下命令，创建ServiceAccount对象的YAML文件。
        ```
        vim serviceaccount.yaml
        ```
        文件内容如下，可以在**cce.io/dew-resource** 字段中声明允许业务使用的凭据名称。如secret_1和secret_2，后续将允许在业务Pod中引用这两个凭据对象。**若用户引用未在此处声明的凭据，则会挂载失败，从而导致** **Pod** **无法运行**。
        ```
        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: nginx-spc-sa
          annotations:
            cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]"  #secrets that allow pod to use
        ```
        
     
     2. 执行以下命令，创建ServiceAccount对象。
        ```
        kubectl apply -f serviceaccount.yaml
        ```
        回显结果如下：
        ```
        serviceaccount/nginx-spc-sa created
        ```
        
     
     3. 执行以下命令，查看ServiceAccount对象是否已经正常创建。
        ```
        kubectl get sa
        ```
        回显结果如下，则说明名为"nginx-spc-sa"的ServiceAccount对象已正常创建，该对象将在后续的业务Pod中被引用。
        ```
        NAME            SECRETS   AGE
        default         1         18d   # 此为系统默认的ServiceAccount对象
        nginx-spc-sa    1         19s   # 此为刚刚创建的ServiceAccount对象
        ```
        
     
     4. 参考IAM用户指南创建委托并授权仅能读取业务负载所需的凭据，详情请参见[创建委托](https://support.huaweicloud.com/usermanual-iam/iam_06_0002.html)。
        示例如下，该委托的策略内容仅能读取secret_1和secret_2：
        ```
        {
            "Version": "1.1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "kms:dek:crypto",
                        "kms:cmk:get",
                        "kms:cmk:list"
                    ]
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "csms:secretVersion:get",
                        "csms:secret:get"
                    ],
                    "Resource": [
                        "CSMS:*:*:secretName:secret_1",
                        "CSMS:*:*:secretName:secret_2"
                    ]
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "csms:secret:list"
                    ]
                }
            ]
        }
        ```
        
     
     5. 在CCE服务的"权限管理 \> 容器组身份关联"页签中，选择集群后单击"创建"，并选择上一步创建的委托绑定至业务负载的ServiceAccount。
        图3为业务负载绑定IAM委托   
        ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002516630564.png "点击放大")
        
        
     
     
     
     
  
  2. 创建SecretProviderClass，用于定义和管理来自DEW的凭据信息，以便凭据可以被CCE集群中的Pod安全地挂载。 
     1. 执行以下命令，创建SecretProviderClass对象的YAML文件。
        ```
        vim secretproviderclass.yaml
        ```
        文件内容如下，**主要关注** **parameters.objects** **字段，该字段以数组的形式声明您需要挂载的凭据信息**。
        ```
        apiVersion: secrets-store.csi.x-k8s.io/v1
        kind: SecretProviderClass
        metadata:
          name: spc-test
        spec:
          provider: cce     # 固定为cce
          parameters:
            objects: |
                  - objectName: "secret_1"
                    objectAlias: "secret_test"
                    objectVersion: "v1"
                    objectType: "csms"
            useWorkloadCred: "true"  # 可选值，默认为false，表示使用插件关联的临时委托Token访问DEW服务。如果为true，表示使用业务负载关联的临时委托Token访问DEW服务
        ```
        表3objects参数说明 
        | 参数            | 参数类型      | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                                                                       |
        |:---|:---|:---|:---|
        | objectName     | String | 是     | 表示凭据名称，需填写ServiceAccount中引用的凭据。**若同一个SecretProviderClass中定义了多个objectName，不允许重名**，否则会挂载失败。                                                                                                                                                                                                                                                                  |
        | objectAlias     | String    | 否      | 表示凭据写入到容器内的文件名称。 - 若不指定，则凭据写入到容器内的文件名默认为objectName；  - 若指定，则**objectAlias与其他凭据的objectName和objectAlias均不允许重名，与自身的objectName也不允许重名**，否则会挂载失败。                                                       |
        | objectType      | String     | 是      | 表示凭据类型。**当前仅支持"csms"类型**，其他均为非法输入。                                                                                                                                                                                                                                                                                                                       |
        | objectVersion | String  | 是    | 表示凭据的版本。 - 指定某个具体的版本：v1，v2，...  - 指定最新版本：latest。当指定objectVersion为"latest"时，若在云凭据管理服务侧对应的凭据发生了更新，更新后的凭据值将在经过一定时间间隔后（即rotation_poll_interval）刷新至Pod内，即自动开启[定时轮转能力]。   |
           
        
     
     2. 执行以下命令，创建SecretProviderClass对象。
        ```
        kubectl apply -f secretproviderclass.yaml
        ```
        回显结果如下：
        ```
        secretproviderclass/spc-test created
        ```
        
     
     3. 执行以下命令，查看SecretProviderClass对象是否已经正常创建。
        ```
        kubectl get spc
        ```
        回显结果如下，则说明一个名为"spc-test"的SecretProviderClass对象已正常创建，该对象将在后续的业务Pod中被引用。
        ```
        NAME   AGE
        spc-test   20h
        ```
        
     
     
     
     
  
  3. 创建业务Pod，这里以创建一个nginx应用为例。 
     1. 定义业务负载，在serviceAccountName中引用此前创建好的ServiceAccount对象，secretProviderClass中引用此前创建好的SPC对象，并在mountPath中指定容器内的挂载路径（这里需注意，用户不应该指定"/"，"/var/run"等特殊目录，否则可能影响容器的正常启动）。
        ```
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: nginx-spc
          labels:
            app: nginx
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: nginx
          template:
            metadata:
              labels:
                app: nginx
            spec:
              serviceAccountName: nginx-spc-sa   # 引用上面创建的ServiceAccount
              volumes:
                - name: secrets-store-inline
                  csi:
                    driver: secrets-store.csi.k8s.io   # 指定Secrets Store CSI驱动，为固定值
                    readOnly: true                     # 将卷设置为只读，确保凭据不会被修改
                    volumeAttributes:
                      secretProviderClass: "spc-test"  # 引用上面创建的SPC
              containers:
                - name: nginx-spc
                  image: nginx:alpine
                  imagePullPolicy: IfNotPresent
                  volumeMounts:
                    - name: secrets-store-inline
                      mountPath: "/mnt/secrets-store"  # 定义容器内凭据的挂载路径
                      readOnly: true
              imagePullSecrets:
                - name: default-secret
        ```
        
     
     2. 创建业务Pod。
        ```
        kubectl apply -f deployment.yaml
        ```
        回显结果如下：
        ```
        deployment/nginx-spc created
        ```
        
     
     3. 执行以下命令，查看Pod是否已经正常创建。
        ```
        kubectl get pod
        ```
        回显结果如下，Pod的"STATUS"为"Running"，则说明已正常创建。
        ```
        NAME                           READY   STATUS     RESTARTS     AGE
        nginx-spc-67c9d5b594-642np     1/1     Running    0            20s
        ```
        
     
     4. 获取spcPodStatus查看Pod与凭据的绑定情况。
        执行以下命令，获取spcps资源名称。
        ```
        kubectl get spcps
        ```
        回显结果如下：
        ```
        NAME                                          AGE
        nginx-spc-67c9d5b594-642np-default-spc-test   103s
        ```
        执行以下命令，查看Pod与凭据的绑定情况。
        ```
        kubectl get spcps nginx-spc-67c9d5b594-642np-default-spc-test -o yaml
        ```
        回显结果如下，则说明该Pod与凭据已绑定。
        ```
        ......
        status:
        mounted: true
        objects:    # 挂载的凭据信息
        - id: secret_1
        version: v1
        podName: nginx-spc-67c9d5b594-642np   # 引用了SPC对象的Pod
        secretProviderClassName: spc-test               # SPC对象
        targetPath: /mnt/paas/kubernetes/kubelet/pods/6dd29596-5b78-44fb-9d4c-a5027c420617/volumes/kubernetes.io~csi/secrets-store-inline/mount
        ```
        
     
     5. 检查指定的凭据是否正常写入。
        1. 执行以下命令，进入容器内部。
           ```
           kubectl exec -ti nginx-spc-67c9d5b594-642np -- /bin/sh
           ```
           
        
        2. 依次执行以下命令，查找指定凭据。
           ```
           cd /mnt/secrets-store/
           ls
           ```
           回显结果如下，则说明用户在SPC对象中声明的secret_1已正常写入Pod。
           ```
           secret_1
           ```
           
         
     
     6. 凭据挂载成功后，将在容器内mountPath指定路径下生成与objectAlias同名的文件，文件内容为DEW中该凭据的值。应用程序读取该文件即可获取凭据，读取方式与读取普通文件一致。
     
     
     
     
   
- [使用密钥挂载凭据（通过插件委托访问DEW服务）]
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  CCE密钥管理（dew-provider）插件版本要求1.1.1及以上。
  1. 创建ServiceAccount，用于声明允许业务Pod使用的DEW凭据名称。进行该步骤之前，请确保DEW的凭据管理服务中已存在相应凭据。如果凭据未创建，则向凭据管理服务中获取相应凭据时会出错，从而导致Pod无法正常运行。如果需要在DEW的凭据管理服务中创建相关凭据，请参见[创建凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)。
     
     图4DEW凭据列表   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002215792974.png "点击放大")
     
     1. 执行以下命令，创建ServiceAccount对象的YAML文件。
        ```
        vim serviceaccount.yaml
        ```
        文件内容如下，可以在**cce.io/dew-resource** 字段中声明允许业务使用的凭据名称。如secret_1和secret_2，后续将允许在业务Pod中引用这两个凭据对象。**若用户引用未在此处声明的凭据，则会挂载失败，从而导致** **Pod** **无法运行**。
        ```
        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: nginx-spc-sa
          annotations:
            cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]"  #secrets that allow pod to use
        ```
        
     
     2. 执行以下命令，创建ServiceAccount对象。
        ```
        kubectl apply -f serviceaccount.yaml
        ```
        回显结果如下：
        ```
        serviceaccount/nginx-spc-sa created
        ```
        
     
     3. 执行以下命令，查看ServiceAccount对象是否已经正常创建。
        ```
        kubectl get sa
        ```
        回显结果如下，则说明名为"nginx-spc-sa"的ServiceAccount对象已正常创建，该对象将在后续的业务Pod中被引用。
        ```
        NAME            SECRETS   AGE
        default         1         18d   # 此为系统默认的ServiceAccount对象
        nginx-spc-sa    1         19s   # 此为刚刚创建的ServiceAccount对象
        ```
        
     
     
     
     
  
  2. 创建SecretProviderClass。 
     1. 根据如下模板创建secretproviderclass.yaml。
        ```
        apiVersion: secrets-store.csi.x-k8s.io/v1
        kind: SecretProviderClass
        metadata:
          name: nginx-deployment-spc-k8s-secrets
        spec:
          provider: cce
          parameters: 
            # 引用凭据管理服务中的凭据
            objects: |
              - objectName: "secret_1"
                objectType: "csms"
                objectVersion: "latest"
                jmesPath:
                  - path: key1
                    objectAlias: dbusername01
                  - path: key2
                    objectAlias: dbusername02
          # 根据凭据中的内容创建密钥，然后在Pod中进行挂载使用
          secretObjects:                
            - secretName: my-secret-01
              type: Opaque
              data:
                - objectName: dbusername01
                  key: db_username_01
                - objectName: dbusername02
                  key: db_username_02
        ```
        表4objects参数说明 
        | 参数           | 参数类型           | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
        |:---|:---|:---|:---|
        | objectName     | String          | 是   | 凭据名称，需填写ServiceAccount中引用的凭据。若同一个SecretProviderClass中定义了多个objectName，不允许重名，否则会挂载失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
        | objectType      | String         | 是   | 凭据类型。当前仅支持"csms"类型，其他均为非法输入。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
        | objectVersion | String         | 是    | 凭据的版本。 - 指定某个具体的版本：v1,v2,...  - 指定最新版本：latest。当指定objectVersion为"latest"时，若在云凭据管理服务侧对应的凭据发生了更新，更新后的凭据值将在经过一定时间间隔后（即rotation_poll_interval）刷新至Pod内，即自动开启[定时轮转能力]。                                                                                                                                                                                                                                                    |
        | jmesPath        | Array of Object | 是     | [jmesPath](https://jmespath.org)是一种从json格式的对象中提取key-value的工具，CCE密钥管理插件使用该工具支持Secret挂载功能。当凭据中有多个key时，您需要填入多个path和objectAlias。 - path：填写DEW服务凭据中的key。 说明： 1.1.57以下版本的插件中，key不能带有+、-、{}、()等特殊符号。 1.1.57及以上版本的插件中，key不能带有\\，对其余特殊符号无限制。   - objectAlias：挂载到Pod中的文件名，该值需要和secretObjects中定义的[objectName]保持一致。   |
           
        表5secretObjects参数说明 
        | 参数           | 参数类型          | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                      |
        |:---|:---|:---|:---|
        | secretName | String          | 是    | 密钥名称。                                                                                                                                                                                                                                                                                                      |
        | type        | String         | 是     | 密钥类型。                                                                                                                                                                                                                                                                                                       |
        | data         | Array of Object | 是      | - objectName：在Pod中挂载的文件名，该值需要和objects中定义的[objectAlias]保持一致。  - key：密钥中的key，在Pod中可使用key值对加密内容进行引用。   |
           
        
     
     2. 执行如下命令创建SecretProviderClass对象。
        ```
        kubectl apply -f secretproviderclass.yaml
        ```
        回显内容如下：
        ```
        secretproviderclass/nginx-deployment-spc-k8s-secrets created
        ```
        
     
     3. 执行以下命令，查看SecretProviderClass对象是否已经正常创建。
        ```
        kubectl get spc
        ```
        回显结果如下：
        ```
        NAME                               AGE
        nginx-deployment-spc-k8s-secrets   20h
        ```
        
     
     
     
     
  
  3. 创建业务Pod，这里以创建一个nginx应用为例。 
     1. 定义业务负载，在serviceAccountName中引用此前创建好的ServiceAccount对象，secretProviderClass中引用此前创建好的SPC对象，并在mountPath中指定容器内的挂载路径（这里需注意，用户不应该指定"/"，"/var/run"等特殊目录，否则可能影响容器的正常启动）。
        ```
        vim deployment.yaml
        ```
        文件内容如下：
        ```
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: nginx-deployment-k8s-secrets
          labels:
            app: nginx-k8s-secrets
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: nginx-k8s-secrets
          template:
            metadata:
              labels:
                app: nginx-k8s-secrets
            spec:
              serviceAccountName: nginx-spc-sa   # 引用上面创建的ServiceAccount
              containers:
              - name: nginx-deployment-k8s-secrets
                image: nginx
                volumeMounts:   # 在容器中挂载SPC
                  - name: secrets-store-inline   # 需要挂载的volume名称
                    mountPath: "/mnt/secrets"    # 需要挂载的容器路径
                    readOnly: true
                env:    # 设置环境变量，以便容器可以在运行时通过这些环境变量引用密钥
                  - name: DB_USERNAME_01      # 工作负载中的变量名
                    valueFrom:
                      secretKeyRef:
                        name: my-secret-01    # SPC中定义的密钥名称
                        key: db_username_01   # SPC中定义的密钥key值
                  - name: DB_USERNAME_02
                    valueFrom:
                      secretKeyRef:
                        name: my-secret-01
                        key: db_username_02
              imagePullSecrets:
                - name: default-secret
              volumes:    # 使用SPC中定义的密钥创建volume
                - name: secrets-store-inline  # 自定义的volume名称
                  csi:
                    driver: secrets-store.csi.k8s.io
                    readOnly: true
                    volumeAttributes:
                      secretProviderClass: nginx-deployment-spc-k8s-secrets   # 上一步中创建的SPC名称
        ```
        
     
     2. 创建业务Pod。
        ```
        kubectl apply -f deployment.yaml
        ```
        回显结果如下：
        ```
        deployment/nginx-deployment-k8s-secrets created
        ```
        
     
     3. 执行以下命令，查看Pod是否已经正常创建。
        ```
        kubectl get pod
        ```
        回显结果如下：
        ```
        NAME                                              READY   STATUS     RESTARTS     AGE
        nginx-deployment-k8s-secrets-6c945565fb-s7smv     1/1     Running    0            20s
        ```
        
     
     4. 执行以下命令，验证结果。
        ```
        kubectl get secrets
        ```
        回显结果如下，结果表明已使用SPC对象中声明的凭据secret_1创建一个密钥my-secret-01。
        ```
        NAME             TYPE                             DATA   AGE
        default-secret   kubernetes.io/dockerconfigjson   1      33d
        my-secret-01     Opaque                           2      1h
        ```
        
     
     5. 检查指定的凭据是否正常写入容器。
        1. 执行以下命令，进入容器内部。
           ```
           kubectl exec -ti nginx-deployment-k8s-secrets-6c945565fb-s7smv -- /bin/sh
           ```
           
        
        2. 依次执行以下命令，查找指定凭据。
           ```
           echo $DB_USERNAME_01
           echo $DB_USERNAME_02
           ```
           回显结果如下，则说明凭据已通过环境变量正常注入容器。
           ```
           value1
           value2
           ```
           
         
     
     6. DEW凭据已通过Deployment中的env配置注入为容器环境变量，变量名与env.name一致。应用程序可以通过读取环境变量获取凭据值，读取方式与读取普通环境变量一致。
     
     
     
     
   
- [使用密钥挂载凭据（通过工作负载委托访问DEW服务）]
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  CCE密钥管理（dew-provider）插件版本要求1.1.111及以上。
  1. 为业务负载创建ServiceAccount，并绑定一个具备最小必要权限的IAM委托。进行该步骤之前，请确保DEW的凭据管理服务中已存在相应凭据。如果凭据未创建，则向凭据管理服务中获取相应凭据时会出错，从而导致Pod无法正常运行。如果需要在DEW的凭据管理服务中创建相关凭据，请参见[创建凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)。
     
     图5DEW凭据列表   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002516793030.png "点击放大")
     
     1. 执行以下命令，创建ServiceAccount对象的YAML文件。
        ```
        vim serviceaccount.yaml
        ```
        文件内容如下，可以在**cce.io/dew-resource** 字段中声明允许业务使用的凭据名称。如secret_1和secret_2，后续将允许在业务Pod中引用这两个凭据对象。**若用户引用未在此处声明的凭据，则会挂载失败，从而导致** **Pod** **无法运行**。
        ```
        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: nginx-spc-sa
          annotations:
            cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]"  #secrets that allow pod to use
        ```
        
     
     2. 执行以下命令，创建ServiceAccount对象。
        ```
        kubectl apply -f serviceaccount.yaml
        ```
        回显结果如下：
        ```
        serviceaccount/nginx-spc-sa created
        ```
        
     
     3. 执行以下命令，查看ServiceAccount对象是否已经正常创建。
        ```
        kubectl get sa
        ```
        回显结果如下，则说明名为"nginx-spc-sa"的ServiceAccount对象已正常创建，该对象将在后续的业务Pod中被引用。
        ```
        NAME            SECRETS   AGE
        default         1         18d   # 此为系统默认的ServiceAccount对象
        nginx-spc-sa    1         19s   # 此为刚刚创建的ServiceAccount对象
        ```
        
     
     4. 参考IAM用户指南创建委托并授权仅能读取业务负载所需的凭据，详情请参见[创建委托](https://support.huaweicloud.com/usermanual-iam/iam_06_0002.html)。
        示例如下，该委托的策略内容仅能读取secret_1和secret_2：
        ```
        {
            "Version": "1.1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "kms:dek:crypto",
                        "kms:cmk:get",
                        "kms:cmk:list"
                    ]
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "csms:secretVersion:get",
                        "csms:secret:get"
                    ],
                    "Resource": [
                        "CSMS:*:*:secretName:secret_1",
                        "CSMS:*:*:secretName:secret_2"
                    ]
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "csms:secret:list"
                    ]
                }
            ]
        }
        ```
        
     
     5. 在CCE服务的"权限管理 \> 容器组身份关联"页签中，选择集群后单击"创建"，并选择上一步创建的委托绑定至业务负载的ServiceAccount。
        图6为业务负载绑定IAM委托   
        ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002516630564.png "点击放大")
        
        
     
     
     
     
  
  2. 创建SecretProviderClass。 
     1. 根据如下模板创建secretproviderclass.yaml。
        ```
        apiVersion: secrets-store.csi.x-k8s.io/v1
        kind: SecretProviderClass
        metadata:
          name: nginx-deployment-spc-k8s-secrets
        spec:
          provider: cce
          parameters: 
            # 引用凭据管理服务中的凭据
            objects: |
              - objectName: "secret_1"
                objectType: "csms"
                objectVersion: "latest"
                jmesPath:
                  - path: key1
                    objectAlias: dbusername01
                  - path: key2
                    objectAlias: dbusername02
            useWorkloadCred: "true"    # 可选值，默认为false，表示使用dew-provider插件关联的临时委托Token访问DEW服务。如果为true，表示使用业务负载关联的临时委托Token访问DEW服务
          # 根据凭据中的内容创建密钥，然后在Pod中进行挂载使用
          secretObjects:                
            - secretName: my-secret-01
              type: Opaque
              data:
                - objectName: dbusername01
                  key: db_username_01
                - objectName: dbusername02
                  key: db_username_02
        ```
        表6objects参数说明 
        | 参数           | 参数类型             | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
        |:---|:---|:---|:---|
        | objectName  | String         | 是      | 凭据名称，需填写ServiceAccount中引用的凭据。若同一个SecretProviderClass中定义了多个objectName，不允许重名，否则会挂载失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
        | objectType  | String           | 是   | 凭据类型。当前仅支持"csms"类型，其他均为非法输入。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
        | objectVersion | String          | 是   | 凭据的版本。 - 指定某个具体的版本：v1,v2,...  - 指定最新版本：latest。当指定objectVersion为" latest"时，若在云凭据管理服务侧对应的凭据发生了更新，更新后的凭据值将在经过一定时间间隔后（即rotation_poll_interval）刷新至Pod内，即自动开启[定时轮转能力]。                                                                                                                                                                                                                                                |
        | jmesPath     | Array of Object | 是    | [jmesPath](https://jmespath.org)是一种从json格式的对象中提取key-value的工具，CCE密钥管理插件使用该工具支持Secret挂载功能。当凭据中有多个key时，您需要填入多个path和objectAlias。 - path：填写DEW服务凭据中的key。 说明： 1.1.57以下版本的插件中，key不能带有+、-、{}、()等特殊符号。 1.1.57及以上版本的插件中，key不能带有\\，对其余特殊符号无限制。   - objectAlias：挂载到Pod中的文件名，该值需要和secretObjects中定义的[objectName]保持一致。   |
           
        表7secretObjects参数说明 
        | 参数          | 参数类型          | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                         |
        |:---|:---|:---|:---|
        | secretName | String          | 是  | 密钥名称。                                                                                                                                                                                                                                                                                                      |
        | type        | String        | 是    | 密钥类型。                                                                                                                                                                                                                                                                                                         |
        | data        | Array of Object | 是  | - objectName：在Pod中挂载的文件名，该值需要和objects中定义的[objectAlias]保持一致。  - key：密钥中的key，在Pod中可使用key值对加密内容进行引用。   |
           
        
     
     2. 执行如下命令创建SecretProviderClass对象。
        ```
        kubectl apply -f secretproviderclass.yaml
        ```
        回显内容如下：
        ```
        secretproviderclass/nginx-deployment-spc-k8s-secrets created
        ```
        
     
     3. 执行以下命令，查看SecretProviderClass对象是否已经正常创建。
        ```
        kubectl get spc
        ```
        回显结果如下：
        ```
        NAME                               AGE
        nginx-deployment-spc-k8s-secrets   20h
        ```
        
     
     
     
     
  
  3. 创建业务Pod，这里以创建一个nginx应用为例。 
     1. 定义业务负载，在serviceAccountName中引用此前创建好的ServiceAccount对象，secretProviderClass中引用此前创建好的SPC对象，并在mountPath中指定容器内的挂载路径（这里需注意，用户不应该指定"/"，"/var/run"等特殊目录，否则可能影响容器的正常启动）。
        ```
        vim deployment.yaml
        ```
        文件内容如下：
        ```
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: nginx-deployment-k8s-secrets
          labels:
            app: nginx-k8s-secrets
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: nginx-k8s-secrets
          template:
            metadata:
              labels:
                app: nginx-k8s-secrets
            spec:
              serviceAccountName: nginx-spc-sa   # 引用上面创建的ServiceAccount
              containers:
              - name: nginx-deployment-k8s-secrets
                image: nginx
                volumeMounts:   # 在容器中挂载SPC
                  - name: secrets-store-inline   # 需要挂载的volume名称
                    mountPath: "/mnt/secrets"    # 需要挂载的容器路径
                    readOnly: true
                env:    # 设置环境变量，以便容器可以在运行时通过这些环境变量引用密钥
                  - name: DB_USERNAME_01      # 工作负载中的变量名
                    valueFrom:
                      secretKeyRef:
                        name: my-secret-01    # SPC中定义的密钥名称
                        key: db_username_01   # SPC中定义的密钥key值
                  - name: DB_USERNAME_02
                    valueFrom:
                      secretKeyRef:
                        name: my-secret-01
                        key: db_username_02
              imagePullSecrets:
                - name: default-secret
              volumes:    # 使用SPC中定义的密钥创建volume
                - name: secrets-store-inline  # 自定义的volume名称
                  csi:
                    driver: secrets-store.csi.k8s.io
                    readOnly: true
                    volumeAttributes:
                      secretProviderClass: nginx-deployment-spc-k8s-secrets   # 上一步中创建的SPC名称
        ```
        
     
     2. 创建业务Pod。
        ```
        kubectl apply -f deployment.yaml
        ```
        回显结果如下：
        ```
        deployment/nginx-deployment-k8s-secrets created
        ```
        
     
     3. 执行以下命令，查看Pod是否已经正常创建。
        ```
        kubectl get pod
        ```
        回显结果如下：
        ```
        NAME                                              READY   STATUS     RESTARTS     AGE
        nginx-deployment-k8s-secrets-6c945565fb-s7smv     1/1     Running    0            20s
        ```
        
     
     4. 执行以下命令，验证结果。
        ```
        kubectl get secrets
        ```
        回显结果如下，结果表明已使用SPC对象中声明的凭据secret_1创建一个密钥my-secret-01。
        ```
        NAME             TYPE                             DATA   AGE
        default-secret   kubernetes.io/dockerconfigjson   1      33d
        my-secret-01     Opaque                           2      1h
        ```
        
     
     5. 检查指定的凭据是否正常写入容器。
        1. 执行以下命令，进入容器内部。
           ```
           kubectl exec -ti nginx-deployment-k8s-secrets-6c945565fb-s7smv -- /bin/sh
           ```
           
        
        2. 依次执行以下命令，查找指定凭据。
           ```
           echo $DB_USERNAME_01
           echo $DB_USERNAME_02
           ```
           回显结果如下，则说明凭据已通过环境变量正常注入容器。
           ```
           value1
           value2
           ```
           
         
     
     6. DEW凭据已通过Deployment中的env配置注入为容器环境变量，变量名与env.name一致。应用程序可以通过读取环境变量获取凭据值，读取方式与读取普通环境变量一致。
     
     
     
     
  
  4. 执行以下命令，验证结果。 
     ```
     kubectl get secrets
     ```
     回显结果如下，结果表明已使用SPC对象中声明的凭据secret_1创建一个密钥my-secret-01。
     ```
     NAME             TYPE                             DATA   AGE
     default-secret   kubernetes.io/dockerconfigjson   1      33d
     my-secret-01     Opaque                           2      1h
     ```
     
     
   
 #### 定时轮转
在[插件使用说明]，通过使用该插件，用户可完成基本的凭据挂载功能，即能够将存储在凭据管理服务中的凭据写入到Pod内。
若将在SPC对象中声明的凭据版本改为"latest"，如下所示：
```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: spc-test
spec:
  provider: cce
  parameters:
    objects: |
          - objectName: "secret_1"
            objectVersion: "latest"  # change "v1"to "latest"
            objectType: "csms"
```
更新该SPC对象后，插件将周期性地向凭据管理服务发起请求，获取凭据secret_1最新版本的值，并将其刷新至引用了该SPC对象的Pod内。此处插件周期性发起请求的时间间隔由[安装插件]时设置的rotation_poll_interval参数确定。
 #### 实时感知SPC变化
在[使用Volume挂载凭据（通过插件委托访问DEW服务）]、[定时轮转]的演示中，其实已经使用到了实时感知SPC变化的能力。为了演示说明，在SPC对象中新增一个凭据secret_2，如下所示：
```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: spc-test
spec:
  provider: cce
  parameters:
    objects: |
          - objectName: "secret_1"
            objectVersion: "latest"
            objectType: "csms"
          - objectName: "secret_2"
            objectVersion: "v1"
            objectType: "csms"
```
更新该SPC对象后，新增的secret_2将很快挂载至引用了该SPC对象的Pod内。
#### 查看组件日志
您可以通过kubectl命令行的方式，查看组件日志，具体步骤如下：
1. 执行以下命令，查看插件的Pod名称。
   ```
   kubectl get pod -n kube-system
   ```
   回显结果如下：
   ```
   NAME                          READY   STATUS      RESTARTS   AGE
   csi-secrets-store-76tj2       3/3     Running     0           11h
   dew-provider-hm5fq            1/1     Running     0           11h
   ```
   
2. 执行以下命令，查看dew-provider组件的Pod日志。
   ```
   kubectl logs dew-provider-hm5fq -n kube-system
   ```
   回显结果为具体的日志信息，这里不再展现。
   ```
   ...
   I0321 13:49:29.319708       1 dew_provider.go:43] object [secret_1]'s version [v1] doesn't change, read from local
   I0321 13:49:29.319735       1 server.go:108] Start writing into mount point
   I0321 13:49:29.319793       1 server.go:117] Write [secret_1/]'s value into file successfully
   I0321 13:49:29.319801       1 server.go:123] Write secret file finished
   I0321 13:49:29.320284       1 server.go:67] "Servicing mount request" Pod="nginx-deployment-k8s-secrets-6c945565fb-s7smv" Namespace="default" ServiceAccount="nginx-spc-sa"
   I0321 13:49:29.617666       1 dew_provider.go:107] "Get secret successfully" name="secret_1" version="v1"
   ...
   ```
   
3. 执行以下命令，查看csi-secrets-store组件Pod日志。由于csi-secrets-store组件的Pod包含多个容器，在查看日志信息时，**需通过** **"-c"** **命令指定某个容器** 。其中，secrets-store容器作为该插件的主业务容器，其包含了主要的日志信息。
   ```
   kubectl logs csi-secrets-store-76tj2 -c secrets-store -n kube-system
   ```
   回显结果为具体的日志信息，这里不再展现。
   ```
   ...
   I0321 10:17:29.314888       1 secrets-store.go:46] "Initializing Secrets Store CSI Driver" driver="secrets-store.csi.k8s.io" version="local-dev" buildTime=""
   I0321 10:17:29.314987       1 reconciler.go:143] "starting rotation reconciler" rotationPollInterval="2m0s"
   I0321 10:17:29.315141       1 server.go:126] "Listening for connections" address="//mnt/paas/kubernetes/kubelet/plugins/csi.sock"
   I0321 10:17:30.933328       1 nodeserver.go:359] "node: getting default node info\n"
   I0321 10:19:19.269337       1 nodeserver.go:353] "Using gRPC client" provider="cce" pod="nginx-spc-744b4c57dc-x74xq"
   I0321 10:19:19.543221       1 secretproviderclasspodstatus_controller.go:224] "reconcile started" spcps="default/nginx-spc-744b4c57dc-x74xq-default-spc-test"
   ...
   ```
   
 
#### 版本记录
表8CCE密钥管理（对接 DEW）插件版本记录 
| 插件版本    | 支持的集群版本                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 更新特性                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|
| 1.1.130 | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 v1.36   | 修复部分问题                                                                                                                                                                                                                                                                                    |
| 1.1.125 | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 v1.36 | 支持CCE v1.36集群                                                                                                                                                                                                                                                                             |
| 1.1.123   | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35                                                                     | 修复部分问题                                                                                                                                                                                                                                                                                      |
| 1.1.119    | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35                                                                    | 支持CCE v1.35集群                                                                                                                                                                                                                                                                               |
| 1.1.112   | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                      | 修复部分问题                                                                                                                                                                                                                                                                                     |
| 1.1.111 | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                         | 支持使用业务负载或插件自身的临时委托凭证访问DEW服务                                                                                                                                                                                                                                                                 |
| 1.1.95  | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                | 支持CCE v1.34集群                                                                                                                                                                                                                                                                             |
| 1.1.82 | v1.27 v1.28 v1.29 v1.30 v1.31 v1.32 v1.33                                                                      | 修复部分问题                                                                                                                                                                                                                                                                                    |
| 1.1.81      | v1.27 v1.28 v1.29 v1.30 v1.31 v1.32 v1.33                                                                             | 支持CCE v1.33集群                                                                                                                                                                                                                                                                               |
| 1.1.75      | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31 v1.32                                                                                      | 支持CCE v1.32集群                                                                                                                                                                                                                                                                               |
| 1.1.60   | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31                                                                                                                                               | 修复部分问题                                                                                                                                                                                                                                                                                     |
| 1.1.57 | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31                                                                                                                                       | 支持CCE v1.31集群                                                                                                                                                                                                                                                                             |
| 1.1.33    | v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 v1.30                                                                               | 适配CCE v1.30集群                                                                                                                                                                                                                                                                                 |
| 1.1.3   | v1.21 v1.23 v1.25 v1.27 v1.28 v1.29                                                                                                                                  | 修复部分问题                                                                                                                                                                                                                                                                                     |
| 1.1.2     | v1.21 v1.23 v1.25 v1.27 v1.28 v1.29                                                                                                                                      | - 适配CCE v1.29集群  - 支持同步csms凭据时创建secret   |
| 1.0.31    | v1.21 v1.23 v1.25 v1.27 v1.28                                                                                                                                                                                                        | - 适配CCE v1.27集群  - 适配CCE v1.28集群             |
| 1.0.9    | v1.19 v1.21 v1.23 v1.25                                                                                                                                                                                                                                                                      | -                                                                                                                                                                                                                                                                                         |
| 1.0.6   | v1.19 v1.21 v1.23 v1.25                                                                                                                                                                                                                                                                               | -                                                                                                                                                                                                                                                                                        |
| 1.0.3    | v1.19 v1.21 v1.23 v1.25                                                                                                                                                                                                                                                                       | 适配CCE v1.25集群                                                                                                                                                                                                                                                                               |
| 1.0.2       | v1.19 v1.21 v1.23                                                                                                                                                                                                                                                                                                                                              | 适配CCE v1.23集群                                                                                                                                                                                                                                                                             |
| 1.0.1    | v1.19 v1.21                                                                                                                                                                                                                                                                                                                                                                                                                 | 支持主动感知SecretProviderClass对象的变化                                                                                                                                                                                                                                                               |
   
