
# Secret
Secret是一种加密存储的资源对象，您可以将认证信息、证书、私钥等保存在密钥中，从而解决了密码、token、密钥等敏感数据的配置问题，而不需要把这些敏感数据暴露到镜像或者Pod Spec中，只需在容器启动时以环境变量等方式加载到容器中。
Secret与ConfigMap非常像，都是key-value键值对形式，使用方式也相同，不同的是Secret会加密存储，所以适用于存储敏感信息。
#### Base64编码
Secret与ConfigMap相同，是以键值对形式保存数据，所不同的是在创建时，Secret的Value必须使用Base64编码。
对字符串进行Base64编码，可以直接使用"echo -n 要编码的内容 \| base64"命令即可，示例如下：
```
root@ubuntu:~# echo -n "3306" | base64
MzMwNg==
```
#### 创建Secret
如下示例中定义的Secret中包含两条Key-Value。
```
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  key1: VkZNME0wVlpVbEpQVHpGTFdrSkRWVWhCV2s5T1ZrNUxUVlZNUjBzMFRWcElVMFpVUkVWV1N3PT0=   # Base64编码后的值
  key2: T0VkR1RGRlZVRlpVU2xCWFdUZFBVRUZCUmtzPQ==                                       # Base64编码后的值
```
#### 在环境变量中引用Secret
Secret最常见的用法是作为环境变量注入到容器中，如下示例。
```
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx:latest
    name: container-0
    resources:
      limits:
        cpu: 500m
        memory: 1024Mi
      requests:
        cpu: 500m
        memory: 1024Mi
    env:
    - name: key
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: key1
  imagePullSecrets:
  - name: imagepull-secret
```
#### 在Volume中引用Secret
在Volume中引用Secret，就是通过文件的方式直接将Secret的每条数据填入Volume，每条数据是一个文件，键就是文件名，键值就是文件内容。
如下示例中，创建一个名为vol-secret的Volume，这个Volume引用名为"mysecret"的Secret，再将Volume挂载到容器的"/tmp"路径下。Pod创建成功后，在容器的"/tmp"路径下，就有两个文件key1和key2，它们的值分别为"VkZNME0wVlpVbEpQVHpGTFdrSkRWVWhCV2s5T1ZrNUxUVlZNUjBzMFRWcElVMFpVUkVWV1N3PT0="和"T0VkR1RGRlZVRlpVU2xCWFdUZFBVRUZCUmtzPQ=="。
![](https://support.huaweicloud.com/devg-cci/public_sys-resources/note_3.0-zh-cn.png)
此处key1、key2的值为Base64编码后的值。
```
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx:latest
    name: container-0
    resources:
      limits:
        cpu: 500m
        memory: 1024Mi
      requests:
        cpu: 500m
        memory: 1024Mi
    volumeMounts:
    - name: vol-secret              # 挂载名为vol-secret的Volume
      mountPath: "/tmp"             #挂载路径，字符串长度不能超过256
  imagePullSecrets:
  - name: imagepull-secret
  volumes:
  - name: vol-secret
    secret:                         # 引用Secret
      secretName: mysecret
```
