# CCE密钥管理（对接DEW）插件
#### 插件简介
CCE密钥管理（对接DEW）插件用于对接[密码安全中心](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)等服务。当前，该插件仅支持对接其中的云凭据管理服务。
- 安装CCE密钥管理（对接DEW）插件，要求集群版本要求在1.28.8-r0、1.31.4-r0及以上。如果您的集群版本不符合该要求，则需要通过集群升级使用该功能。
- 安装CCE密钥管理（对接DEW）插件，需要提前配置访问DEW服务的VPC终端节点，具体操作请参见[配置访问DEW服务的VPC终端节点]。
- CCE密钥管理（对接DEW）插件允许创建的SecretProviderClass对象个数上限为500个。
- 插件卸载时，会同时删除相关的CRD资源。即使重装插件，原有的SecretProviderClass对象也不可用，请谨慎操作。插件卸载再重装后，若需使用原有的SecretProviderClass资源，需重新手动创建。
 
#### 计费说明
| 操作阶段↵ | 计费项     | 计费说明↵                                                                                                                                                                                                                                      | 相关文档↵                                                                                                                 |
|:---|:---|:---|:---|
| 安装插件    | 不计费   | 安装CCE密钥管理（对接DEW）插件时，暂不部署插件相关Pod实例，因此安装插件时不涉及费用。                                                                                                                                                                                           | -                                                                                                                    |
| 使用插件  | Pod费用 | 在业务Pod中挂载DEW密钥卷时，系统会自动以DaemonSet形式部署插件Pod实例，每个业务Pod对应一组插件Pod实例。插件Pod实例的具体规格，请参见[表1]。 当集群内某业务Pod不再挂载DEW密钥卷时，相关插件Pod实例会自动销毁，停止计费的时间与业务Pod停止使用时间一致。若重新挂载DEW密钥卷，插件Pod实例将自动重建。 | 关于Pod费用的详细说明，请参见[CCE Autopilot集群计费项](https://support.huaweicloud.com/price-cce-autopilot/cce_03_0006.html#section0)。↵ |
   
 #### 安装插件
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中，单击"集群 \> 插件中心"，在右侧找到**CCE密钥管理（对接DEW）**插件，单击"安装"。
3. 在"安装插件"页面，在"参数配置栏"配置"凭据同步周期"，具体说明如下： 
   
   | 配置项     | 参数                    | 参数说明                                                                                                                    |
   |:---|:---|:---|
   | 凭据同步周期 | rotation_poll_interval | 表示轮转时间间隔，单位为分钟，即m（注意不是min）。 轮转时间间隔表示向云凭据管理服务发起请求并获取最新的凭据的周期，合理的时间间隔范围为\[1m, 1440m\]，默认值为2m。 |
      
   
   
4. 配置无误后，在右下角单击"安装"。当插件状态变为运行中时，则说明插件安装成功。
 
#### 组件说明
 表1dew-provider组件 
| 容器组件             | 说明                                                                                                                                                                                                                                                                                                                                                               | 资源类型     | 资源规格（单Pod实例）                                                                                                                                                                                                                       |
|:---|:---|:---|:---|
| dew-provider      | dew-provider负责与云凭据管理服务交互，从云凭据管理服务中获取指定的凭据，并挂载到业务Pod内。                                                                                                                                                                                                                                                                                                             | DaemonSet | - 实例类型：通用型  - CPU：0.25Cores↵  - 内存：0.5GiB↵         |
| csi-secrets-store | csi-secrets-store负责维护两个CRD资源，即SecretProviderClass（以下简称为SPC）和SecretProviderClassPodStatus（以下简称为spcPodStatus），其中**SPC** **用于描述用户需要的凭据信息（比如指定凭据的版本、凭据的名称等），由用户创建，并在业务** **Pod** **中进行引用** ；**spcPodStatus** **用于跟踪** **Pod** **与凭据的绑定关系，由** **csi-driver** **自动创建，用户无需关心**。一个Pod对应一个spcPodStatus，当Pod正常启动后，会生成一个与之对应的spcPodStatus；当Pod生命周期结束时，相应的spcPodStatus也会被删除。 | DaemonSet  | - 实例类型：通用型  - CPU：0.25Cores↵  - 内存：0.5GiB↵   |
   
 #### 基础挂载
将DEW中的凭据信息挂载至容器中，需要完成3个步骤。首先，创建ServiceAccount，作为集群访问DEW的凭证；其次，创建SecretProviderClass，用于定义和获取DEW中的凭据信息；最后，将ServiceAccount和SecretProviderClass挂载到业务Pod中，确保Pod能够安全访问相关凭据。目前，支持两种挂载方式：
- 使用Volume挂载凭据：适合大规模数据的挂载，以卷的形式将凭据挂载到容器中。
- 使用密钥挂载凭据：适合小型的敏感数据，支持以环境变量的形式挂载至容器中。
以下内容将分别介绍两种方式的具体使用流程。
- [使用Volume挂载凭据]
  1. 创建ServiceAccount，用于声明允许业务Pod使用的DEW凭据名称。进行该步骤之前，请确保DEW的凭据管理服务中已存在相应凭据。如果凭据未创建，则向凭据管理服务中获取相应凭据时会出错，从而导致Pod无法正常运行。如果需要在DEW的凭据管理服务中创建相关凭据，请参见[创建凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)。
     
     图1DEW凭据列表   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/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"
        ```
        表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"等特殊目录，否则可能影响容器的正常启动）。
        ```
        vim deployment.yaml
        ```
        文件内容如下：
        ```
        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:                            # 将上方定义的volume挂载在容器中
                    - 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
        ```
        回显结果如下：
        ```
        NAME                     READY   STATUS   RESTARTS   AGE
        nginx-spc-67c9d5b594-642np     1/1     Running    0            20s
        ```
        
     
     4. 检查指定的凭据是否正常写入。
        1. 执行以下命令，进入容器内部。
           ```
           kubectl exec -ti nginx-spc-67c9d5b594-642np -- /bin/sh
           ```
           
        
        2. 依次执行以下命令，查找指定凭据。
           ```
           cd /mnt/secrets-store/
           ls
           ```
           回显结果如下，则说明用户在SPC对象中声明的secret_test已正常写入Pod。
           ```
           secret_test
           ```
           
        
        3. 获取spcPodStatus查看Pod与凭据的绑定情况。
           **Ctrl+d** 退出容器，并执行以下命令，获取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_test
           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
           ```
           
         
     
     
     
     
   
- [使用密钥挂载凭据]
  1. 创建ServiceAccount，用于声明允许业务Pod使用的DEW凭据名称。进行该步骤之前，请确保DEW的凭据管理服务中已存在相应凭据。如果凭据未创建，则向凭据管理服务中获取相应凭据时会出错，从而导致Pod无法正常运行。如果需要在DEW的凭据管理服务中创建相关凭据，请参见[创建凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)。
     
     图2DEW凭据列表   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/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安全地挂载**。** 在SecretProviderClass对象中，您可以描述需要的凭据信息，例如指定凭据的名称、版本等。
     
     1. 执行以下命令，创建SecretProviderClass对象的YAML文件。
        ```
        vim secretproviderclass.yaml
        ```
        文件内容如下，**主要关注** **parameters.objects** **字段，该字段以数组的形式声明您需要挂载的凭据信息**。
        ```
        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    # 与objectAlias保持一致
                  key: db_username_01
                - objectName: dbusername02    # 与objectAlias保持一致
                  key: db_username_02
        ```
        表3objects参数说明 
        | 参数           | 参数类型           | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
        |:---|:---|:---|:---|
        | 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。 说明： key不能带有\\，对其余特殊符号无限制。   - objectAlias：挂载到Pod中的文件名，该值需要和secretObjects中定义的[objectName]保持一致。   |
           
        表4secretObjects参数说明 
        | 参数           | 参数类型          | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                           |
        |:---|:---|:---|:---|
        | 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
        ```
        回显结果如下，则说明名为"nginx-deployment-spc-k8s-secrets"的SecretProviderClass对象已正常创建，该对象将在后续的业务Pod中被引用。
        ```
        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
     ```
     
     
   
 #### 定时轮转
当Pod正常运行后，若其在SPC中声明的、存储在云凭据管理服务中的凭据发生了更新，通过定时轮转，可以将最新的凭据值刷新至Pod内。使用该能力时，需要将凭据的版本指定为"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变化
当Pod正常运行后，若用户修改了在SPC中声明的凭据信息（如新增凭据、改变原有凭据的版本号等），插件可实时感知该变化，并将更新后的凭据刷新至Pod内。例如，在SPC对象中新增一个凭据secret_2。更新该SPC对象后，新增的secret_2将自动挂载至引用该SPC对象的Pod内。
```
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"
```
#### 查看组件日志
您可以通过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"
   ...
   ```
   
 
 #### 配置访问DEW服务的VPC终端节点
1. 登录[VPC终端节点控制台](https://console.huaweicloud.com/vpc/#/vpc/vpcmanager/vpceps)。
2. 在"终端节点"页面，单击"购买终端节点"。
3. 根据界面提示配置必选参数。更多参数说明，请参见[购买终端节点](https://support.huaweicloud.com/usermanual-vpcep/zh-cn_topic_0131645189.html)
   
   表5终端节点配置参数 
   | 参数       | 说明                                                                                              |
   |:---|:---|
   | 区域      | 终端节点所在区域，需要与CCE Autopilot集群所在区域保持一致。                                                            |
   | 计费模式     | 仅支持按需计费。按需计费是后付费模式，按终端节点的实际使用时长计费，可以随时开通/删除终端节点。                                                |
   | 服务类别    | 请选择"按名称查找服务"。                                                                                  |
   | 服务名称  | 请[提交工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)，联系DEW工作人员，获取当前区域的服务名称。 |
   | 创建内网域名  | 请勾选该参数。 终端节点创建完成后，即可通过内网域名直接访问终端节点。                              |
   | 虚拟私有云   | 请选择CCE Autopilot集群所在的虚拟私有云。                                                                      |
   | 子网      | 请选择一个已有子网。                                                                                       |
   | IPv4地址 | 表示终端节点的IPv4地址，可选择"自动分配"或"手动分配"。                                                                 |
      
   
   
4. 参数配置完成，单击"立即购买"，进行规格确认。 
   - 规格确认无误，单击"提交"，任务提交成功。
   
   - 参数信息配置有误，需要修改，单击"上一步"，修改参数，然后单击"提交"。
   
   
   
   
5. 返回终端节点列表，如果终端节点状态为"已接受"，表示终端节点已成功连接至终端节点服务。
 
#### 版本记录
表6CCE密钥管理（对接 DEW）插件版本记录 
| 插件版本   | 支持的集群版本 | 更新特性               |
|:---|:---|:---|
| 1.1.3                                  | 1.31.4-r0、1.32及以上                   | 支持CCE Autopilot 1.35集群                           |
| 1.1.2                                   | 1.31.4-r0、1.32及以上                    | 支持CCE Autopilot 1.34集群                          |
| 1.1.0                                | 1.28.8-r0、1.31.4-r0、1.32及以上        | 支持CCE Autopilot 1.32集群                          |
| 1.0.0 | 1.28.8-r0、1.31.4-r0及以上             | 支持CCE Autopilot集群 |
   
