# 创建密钥
#### 操作场景
密钥（Secret）是Kubernetes中用于存储敏感信息等的资源类型，例如工作负载所需要认证信息、密钥等。Secret的内容由用户决定，创建完成后，支持以文件挂载或环境变量注入两种方式，被容器工作负载安全调用。
借助Secret，能够将敏感信息与容器镜像解耦，避免敏感数据明文暴露在镜像或配置文件中，大幅降低数据泄露风险，同时提升工作负载的安全性与可移植性。
#### 约束与限制
[静态Pod](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/static-pod/)中不可使用Secret。
#### 创建密钥
您可以通过以下方式进行创建。
- [通过控制台创建密钥]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 在左侧导航栏中选择"配置与密钥"，选择"密钥"页签，在右上角单击"创建密钥"。
  
  3. 填写参数。 
      表1基本信息说明 
     | 参数       | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     |:---|:---|
     | 名称      | 新建的密钥的名称，同一个命名空间内命名必须唯一。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
     | 命名空间  | 新建密钥所在的命名空间，默认为default。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
     | 描述      | 密钥的描述信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
     | 密钥类型     | 新建的密钥类型。 - Opaque：一般密钥类型。  - kubernetes.io/dockerconfigjson：存放拉取私有仓库镜像所需的认证信息。  - kubernetes.io/tls：Kubernetes的TLS密钥类型，用于存放7层负载均衡服务所需的证书。kubernetes.io/tls类型的密钥示例及说明请参见[TLS Secret](https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/#tls-secret)。  - IngressTLS：CCE提供的TLS密钥类型，用于存放7层负载均衡服务所需的证书。  - 其他：若需要创建其他类型的密钥，请手动输入密钥类型。                              |
     | 密钥数据     | 工作负载密钥的数据可以在容器中使用。 - 当密钥为Opaque类型时，单击"添加"，在弹出的窗口中输入键值对，并且可以勾选"自动Base64转码"。 键需要由数字、字母、点号（.）、中划线（-）、下划线（_）组成，且不能以".."开头，1-63个字符。   - 当密钥为kubernetes.io/dockerconfigjson类型时，单击"添加"，输入私有镜像仓库的账号和密码。  - 当密钥为kubernetes.io/tls或IngressTLS类型时，上传证书文件和私钥文件。 说明： - 证书是自签名或CA签名过的凭据，用来进行身份认证。  - 证书请求是对签名的请求，需要使用私钥进行签名。      |
     | 标签管理（可选） | 密钥的标签，单击"添加标签"，输入键值对的形式。键值需要以字母或者数字开头和结尾，由字母、数字、连接符（-）、下划线（_）、点号（.）组成且63个字符之内。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
        
     
     
  
  4. 配置完成后，单击"确定"。 
     密钥列表中会出现新创建的密钥。
     
     
   
- [使用kubectl创建密钥]
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)配置kubectl命令。
  
  2. 通过Base64编码加密密钥值。 
     ```
     # echo -n "待编码内容" | base64
     ******
     ```
     
     
  
  3. 创建并编辑cce-secret.yaml文件。 
     ```
     vi cce-secret.yaml
     ```
     Opaque类型的YAML示例如下，其余类型请参见[Secret资源文件配置示例]：
     ```
     apiVersion: v1
     kind: Secret
     metadata:
       name: mysecret
     type: Opaque
     data:
       <your_key>: <your_value>  #填写键值对，其中value需要用Base64编码
     ```
     
     
  
  4. 创建密钥。 
     ```
     kubectl create -f cce-secret.yaml
     ```
     创建完成后可以查询到密钥。
     ```
     kubectl get secret -n default
     ```
     
     
   
 #### Secret资源文件配置示例
本章节主要介绍Secret资源描述文件的配置示例。
- Opaque类型 定义的Secret文件secret.yaml内容如下。其中data字段以键值对的形式填写，value需要用Base64编码，Base64编码方法请参见[如何进行Base64编码]。
  ```
  apiVersion: v1
  kind: Secret
  metadata:
    name: mysecret           # secret的名称
    namespace: default       #命名空间，默认为default
  data:
    <your_key>: <your_value>  #填写键值对，其中value需要用Base64编码
  type: Opaque
  ```
  
- kubernetes.io/dockerconfigjson类型 定义的Secret文件secret.yaml内容如下。其中.dockerconfigjson需要用Base64，Base64编码方法请参见[如何进行Base64编码]。
  ```
  apiVersion: v1
  kind: Secret
  metadata:
    name: mysecret           # secret的名称
    namespace: default       #命名空间，默认为default
  data:
    .dockerconfigjson: eyJh*****    #Base64编码后的内容
  type: kubernetes.io/dockerconfigjson
  ```
  获取.dockerconfigjson内容的步骤如下：
  1. 获取镜像仓库的登录信息：
     - 镜像仓库地址：本文中以address为例，请根据实际信息替换。
     
     - 用户名：本文中以username为例，请根据实际信息替换。
     
     - 密码：本文中以password为例，请根据实际信息替换。
      
  
  2. 使用Base64将键值对username:password进行编码，获取编码后的内容填入[3]中。
     ```
     echo -n "username:password" | base64
     ```
     回显如下：
     ```
     dXNlcm5hbWU6cGFzc3dvcmQ=
     ```
     
  
  3. 使用Base64对以下JSON内容进行编码。
     ```
     echo -n '{"auths":{"address":{"username":"username","password":"password","auth":"dXNlcm5hbWU6cGFzc3dvcmQ="}}}' | base64
     ```
     回显如下：
     ```
     eyJhdXRocyI6eyJhZGRyZXNzIjp7InVzZXJuYW1lIjoidXNlcm5hbWUiLCJwYXNzd29yZCI6InBhc3N3b3JkIiwiYXV0aCI6ImRYTmxjbTVoYldVNmNHRnpjM2R2Y21RPSJ9fX0=
     ```
     编码后的内容即为.dockerconfigjson内容。
     
   

- kubernetes.io/tls类型
  其中tls.crt和tls.key需要用Base64，Base64编码方法请参见[如何进行Base64编码]。
  ```
  kind: Secret
  apiVersion: v1
  metadata:
    name: mysecret           # secret的名称
    namespace: default       #命名空间，默认为default
  data:
    tls.crt: LS0tLS1CRU*****FURS0tLS0t  #证书内容，需要Base64编码
    tls.key: LS0tLS1CRU*****VZLS0tLS0=  #私钥内容，需要Base64编码
  type: kubernetes.io/tls
  ```
  
- IngressTLS类型
  其中tls.crt和tls.key需要用Base64，Base64编码方法请参见[如何进行Base64编码]。
  ```
  kind: Secret
  apiVersion: v1
  metadata:
    name: mysecret           # secret的名称
    namespace: default       #命名空间，默认为default
  data:
    tls.crt: LS0tLS1CRU*****FURS0tLS0t  #证书内容，需要Base64编码
    tls.key: LS0tLS1CRU*****VZLS0tLS0=  #私钥内容，需要Base64编码
  type: IngressTLS
  ```
  
 
 #### 如何进行Base64编码
对字符串进行Base64编码，可以直接使用以下命令：
```
echo -n "待编码内容" | base64
```
#### 相关操作
密钥创建完成后，您还可以执行[表2]中的操作。
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
密钥列表中包含系统密钥资源，系统密钥资源不可更新，也不能删除，只能查看。
 表2其他操作 
| 操作     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|
| 编辑YAML | 单击密钥名称后的"编辑YAML"，可编辑当前密钥的YAML文件。                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 更新密钥  | 1. 选择需要更新的密钥名称，单击"更新"。  2. 参考[表1]更改信息。  3. 单击"确定"。   |
| 删除密钥   | 选择要删除的密钥，单击"更多 \> 删除"。 根据系统提示删除密钥。                                                                                                                                                                                                                                                                                                                                                                                      |
| 批量删除密钥 | 1. 勾选需要删除的密钥名称。  2. 单击页面左上角的"批量删除"，删除选中的密钥。  3. 根据系统提示删除密钥。                                               |
   
