# 使用密钥
密钥创建后，可在工作负载环境变量和数据卷两个场景使用。
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/notice_3.0-zh-cn.png)
请勿对以下CCE系统使用的密钥做任何操作，详情请参见[集群系统密钥说明](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0388.html)。
- 请不要操作kube-system下的secrets。
- 请不要操作任何命名空间下的default-secret、paas.elb。其中，default-secret用于SWR的私有镜像拉取，paas.elb用于该命名空间下的服务对接ELB。
 
- [使用密钥设置工作负载的环境变量]
- [使用密钥配置工作负载的数据卷]
本节以下面这个Secret为例，具体介绍Secret的用法。
```
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: ******  #需要用Base64编码
  password: ******  #需要用Base64编码
```
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/notice_3.0-zh-cn.png)
- 在Pod里使用密钥时，需要Pod和密钥处于同一集群和命名空间中。
- 当Secret 被更新时，Kubernetes会同时更新数据卷中的数据。 但对于以[subPath](https://kubernetes.io/zh-cn/docs/concepts/storage/volumes#using-subpath)形式挂载的Secret数据卷，当Secret 被更新时，Kubernetes无法自动更新数据卷中的数据。
  
 
 #### 使用密钥设置工作负载的环境变量
**使用控制台方式**
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏选择"工作负载"，单击右上角"创建工作负载"。 
   在创建工作负载时，在"容器配置"中找到"环境变量"，单击"新增变量"。
   - **密钥导入** ：选择一个密钥，将密钥中所有键值都导入为环境变量。
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001997624129.png "点击放大")
     
   
   - **密钥项键值导入** ：将密钥中某个键的值导入作为某个环境变量的值。
     - 变量名称：工作负载中的环境变量名称，可自定义，默认为密钥中选择的键名。
     
     - 变量/变量引用：选择一个密钥及需要导入的键名，将其对应的值导入为工作负载环境变量。
     
     
     例如将mysecret这个密钥中"username"的值导入，作为工作负载环境变量"username"的值，导入后容器中将会有一个名为"username"的环境变量。
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001961223190.png "点击放大")
     
   
   
   
   
3. 配置其他工作负载参数后，单击"创建工作负载"。 
   等待工作负载正常运行后，您可[登录容器](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_00356.html)执行以下语句，查看该密钥是否已被设置为工作负载的环境变量。
   ```
   printenv username
   ```
   如输出与Secret中的内容一致，则说明该密钥已被设置为工作负载的环境变量。
   
   
**使用kubectl方式**
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)配置kubectl命令。
2. 创建并编辑nginx-secret.yaml文件。 
   **vi nginx-secret.yaml**
   YAML文件内容如下：
   - **密钥导入** ：如果要将一个密钥中所有数据都添加到环境变量中，可以使用envFrom参数，密钥中的Key会成为工作负载中的环境变量名称。
     ```
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: nginx-secret
     spec:
       replicas: 1
       selector:
         matchLabels:
           app: nginx-secret
       template:
         metadata:
           labels:
             app: nginx-secret
         spec:
           containers:
           - name: container-1
             image: nginx:latest
             envFrom:                 # 使用envFrom来指定环境变量引用的密钥
             - secretRef:
                 name: mysecret       # 引用的密钥名称
           imagePullSecrets:
           - name: default-secret
     ```
     
   
   - **密钥键值导入** ：您可以在创建工作负载时将密钥设置为环境变量，使用valueFrom参数单独引用Secret中的Key/Value。
     ```
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: nginx-secret
     spec:
       replicas: 1
       selector:
         matchLabels:
           app: nginx-secret
       template:
         metadata:
           labels:
             app: nginx-secret
         spec:
           containers:
           - name: container-1
             image: nginx:latest
             env:                             # 设置工作负载中的环境变量
             - name: SECRET_USERNAME         # 工作负载中的环境变量名称
               valueFrom:                    # 使用valueFrom来指定环境变量引用的密钥
                 secretKeyRef:
                   name: mysecret       # 引用的密钥名称
                   key: username        # 引用的密钥中的key
             - name: SECRET_PASSWORD            # 添加多个环境变量参数，可同时导入多个环境变量
               valueFrom:
                 secretKeyRef:
                   name: mysecret
                   key: password
           imagePullSecrets:
           - name: default-secret
     ```
     
   
   
   
   
3. 创建工作负载。 
   **kubectl apply -f nginx-secret.yaml**
   
   
4. 创建完成后，查看Pod中的环境变量。 
   1. 执行以下命令，查看已创建的Pod。
      ```
      kubectl get pod | grep nginx-secret
      ```
      预期输出如下：
      ```
      nginx-secret-***   1/1     Running   0              2m18s
      ```
      
   
   2. 执行以下命令，查看该Pod中的环境变量。
      ```
      kubectl exec nginx-secret-*** -- printenv SPECIAL_USERNAME SPECIAL_PASSWORD
      ```
      如输出与Secret中的内容一致，则说明该密钥已被设置为工作负载的环境变量。
      
   
   
   
   
 
 #### 使用密钥配置工作负载的数据卷
密钥(Secret)挂载将密钥中的数据挂载到指定的容器路径，密钥内容由用户决定。用户需要提前创建密钥，操作步骤请参见[创建密钥](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0153.html)。
**使用控制台方式**
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏选择"工作负载"，在右侧选择"无状态负载"页签。单击右上角"创建工作负载"。 
   在创建工作负载时，在"容器配置"中找到"数据存储"，选择"添加存储卷 \> 密钥(Secret)"。
   
   
3. 选择密钥挂载参数，如[表1]。
   
    表1密钥挂载 
   | 参数   | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   |:---|:---|
   | 密钥    | 选择对应的密钥名称。 密钥需要提前创建，具体请参见[创建密钥](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0153.html)。                                                                                                                                                                                                                                                                                                                                                                                              |
   | 挂载路径  | 请输入挂载路径。密钥挂载完成后，会在容器中的挂载路径下生成以密钥中的key为文件名， value为文件内容的密钥文件。 数据存储挂载到容器上的路径。请不要挂载在系统目录下，如"**/** "、"**/var/run"** 等，会导致容器异常。建议挂载在空目录下，若目录不为空，请确保目录下无影响容器启动的文件，否则文件会被替换，导致容器启动异常，工作负载创建失败。 须知： 挂载高危目录的情况下 ，建议使用低权限账号启动，否则可能会造成宿主机高危文件被破坏。                                                                                                                                                                                                                                                                    |
   | 子路径 | 请输入挂载路径的子路径。 - 使用子路径挂载本地磁盘，实现在单一Pod中重复使用同一个Volume，不填写时默认为根。  - 子路径可以填写Secret的键值，子路径若填写为不存在的键值则数据导入不会生效。  - 通过子路径导入的数据不会随Secret的更新而动态更新。   |
   | 权限  | 只读。只能读容器路径中的数据卷。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
      
   图1使用密钥挂载到工作负载数据卷   
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001997703549.png "点击放大")
   
   
4. 其余信息都配置完成后，单击"创建工作负载"。 
   等待工作负载正常运行后，本示例将在/etc/foo目录下生成username和password两个文件，且文件的内容分别为密钥值。
   您可[登录容器](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_00356.html)执行以下语句，查看容器中的username和password两个文件。
   ```
   cat /etc/foo/username
   ```
   预期输出与Secret中的内容一致。
   
   
**使用kubectl方式**
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)配置kubectl命令。
2. 创建并编辑nginx-secret.yaml文件。 
   **vi nginx-secret.yaml**
   如下面的示例所示，mysecret密钥的username和password以文件方式保存在/etc/foo目录下。
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: nginx-secret
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: nginx-secret
     template:
       metadata:
         labels:
           app: nginx-secret
       spec:
         containers:
         - name: container-1
           image: nginx:latest
           volumeMounts:
           - name: foo
             mountPath: /etc/foo          # 挂载到/etc/foo目录下
             readOnly: true
       volumes:
       - name: foo
         secret:
           secretName: mysecret      # 引用的密钥名称
   ```
   您还可以使用items字段控制Secret键的映射路径，例如，将username存放在容器中的/etc/foo/my-group/my-username目录下。
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
   - 使用items字段指定Secret键的映射路径后，没有被指定的键将不会被以文件形式创建。例如，下面的例子中的password键未被指定，则该文件将不会被创建。
   
   - 如果要使用Secret中全部的键，那么必须将全部的键都列在items字段中。
   
   - items字段中列出的所有键必须存在于相应的Secret 中。否则，该卷不被创建。
    
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: nginx-secret
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: nginx-secret
     template:
       metadata:
         labels:
           app: nginx-secret
       spec:
         containers:
         - name: container-1
           image: nginx:latest
           volumeMounts:
           - name: foo
             mountPath: /etc/foo          # 挂载到/etc/foo目录下
             readOnly: true
       volumes:
       - name: foo
         secret:
           secretName: mysecret      # 引用的密钥名称
           items:
           - key: username      # 引用的密钥中的键名
             path: my-group/my-username    # Secret键的映射路径
   ```
   
   
3. 创建工作负载。 
   **kubectl apply -f nginx-secret.yaml**
   
   
4. 等待工作负载正常运行后，在/etc/foo目录下会生成username和password两个文件。 
   1. 执行以下命令，查看已创建的Pod。
      ```
      kubectl get pod | grep nginx-secret
      ```
      预期输出如下：
      ```
      nginx-secret-***   1/1     Running   0              2m18s
      ```
      
   
   2. 执行以下命令，查看该Pod中的username或password文件。
      ```
      kubectl exec nginx-secret-*** -- cat /etc/foo/username
      ```
      预期输出与Secret中的内容一致。
      
   
   
   
   
 
