和创建其他类型的 API 对象(Pod、Deployment、StatefulSet、ConfigMap 等)一样,您也可以先在 yaml 文件中定义好 Secret,然后通过 kubectl apply -f 命令创建。此时,您可以通过如下两种方式在 yaml 文件中定义 Secret:

  • data:使用 data 字段时,取值的内容必须是 base64 编码的
  • stringData:使用 stringData 时,更为方便,您可以直接将取值以明文的方式写在 yaml 文件中

    在 yaml 中定义 data


  • 假设您要保存 username=admin 和 password=1f2d1e2e67df 到 Secret 中,请先将数据的值转化为 base64 编码,执行如下命令: ```bash echo -n ‘admin’ | base64 YWRtaW4= echo -n ‘1f2d1e2e67df’ | base64 MWYyZDFlMmU2N2Rm
  1. - 创建 secret.yaml 文件,内容如下所示:
  2. ```yaml
  3. apiVersion: v1
  4. kind: Secret
  5. metadata:
  6. name: mysecret
  7. type: Opaque
  8. data:
  9. username: YWRtaW4=
  10. password: MWYyZDFlMmU2N2Rm

  • 执行命令 kubectl apply -f ./secret.yaml 输出结果如下所示: ```yaml secret “mysecret” created
  1. <br /> 此时 Secret 创建成功
  2. <a name="wzyOx"></a>
  3. ## 在 yaml 中定义 stringData
  4. ---
  5. 有时,您并不想先将用户名和密码转换为 base64 编码之后再创建 Secret,则,您可以通过定义 stringData 来达成,此时 stringData 中的取值部分将被 apiserver 自动进行 base64 编码之后再保存。
  6. - 创建文件 secret.yaml,内容如下所示:
  7. ```yaml
  8. apiVersion: v1
  9. kind: Secret
  10. metadata:
  11. name: mysecret
  12. type: Opaque
  13. stringData:
  14. username: admin
  15. password: 1f2d1e2e67df

  • 执行命令 kubectl apply -f ./secret.yaml 输出结果如下所示: ```bash secret “mysecret” created
  1. 此时 Secret 创建成功
  2. - 执行命令 kubectl get -f ./secret.yaml -o yaml 输出结果如下所示:
  3. ```yaml
  4. apiVersion: v1
  5. data:
  6. password: MWYyZDFlMmU2N2Rm
  7. username: YWRtaW4=
  8. kind: Secret
  9. metadata:
  10. annotations:
  11. kubectl.kubernetes.io/last-applied-configuration: |
  12. {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"password":"1f2d1e2e67df","username":"admin"},"type":"Opaque"}
  13. creationTimestamp: "2019-09-23T14:16:56Z"
  14. name: mysecret
  15. namespace: default
  16. resourceVersion: "10318365"
  17. selfLink: /api/v1/namespaces/default/secrets/mysecret
  18. uid: 24602031-e18d-467a-b7fe-0962af8ec8b8
  19. type: Opaque


注意

  • 此时 annotation 中可以看到 password 的明文,这也许并不是您所期望的
  • 输出的 Secret 对象中,stringData 字段不再出现

同时定义了 data 和 stringData


TIP 如果您同时定义了 data 和 stringData,对于两个对象中 key 重复的字段,最终将采纳 stringData 中的 value

  • 创建文件 secret.yaml,该文件同时定义了 data 和 stringData,内容如下所示: ```yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= stringData: username: administrator
  1. - <br />
  2. - 执行命令 kubectl apply -f ./secret.yaml 输出结果如下所示:
  3. ```bash
  4. secret "mysecret" created

此时 Secret 创建成功

  • 执行命令 kubectl get -f ./secret.yaml -o yaml 输出结果如下所示: ```yaml apiVersion: v1 kind: Secret metadata: creationTimestamp: 2018-11-15T20:46:46Z name: mysecret namespace: default resourceVersion: “7579” uid: 91460ecb-e917-11e8-98f2-025000000001 type: Opaque data: username: YWRtaW5pc3RyYXRvcg==
  1. > <br />** TIP**此处 YWRtaW5pc3RyYXRvcg== 解码后的值是 administrator
  2. <a name="vwOK1"></a>
  3. ##
  4. <a name="qvnia"></a>
  5. ## 将配置文件存入 Secret
  6. ---
  7. 假设您的某个应用程序需要从一个配置文件中读取敏感信息,此时,您可以将该文件的内容存入 Secret,再通过数据卷的形式挂载到容器。[挂载方式未完待续]
  8. 例如,您的应用程序需要读取如下配置文件内容:
  9. ```bash
  10. apiUrl: "https://my.api.com/api/v1"
  11. username: user
  12. password: password

您可以使用下面的 secret.yaml 创建 Secret

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: mysecret
  5. type: Opaque
  6. stringData:
  7. config.yaml: |-
  8. apiUrl: "https://my.api.com/api/v1"
  9. username: user
  10. password: password
  • 执行命令 kubectl apply -f ./secret.yaml 输出结果如下所示: ```bash secret “mysecret” created
  1. 此时 Secret 创建成功
  2. - 执行命令 kubectl get -f ./secret.yaml -o yaml 输出结果如下所示:
  3. ```yaml
  4. apiVersion: v1
  5. kind: Secret
  6. metadata:
  7. creationTimestamp: 2018-11-15T20:40:59Z
  8. name: mysecret
  9. namespace: default
  10. resourceVersion: "7225"
  11. uid: c280ad2e-e916-11e8-98f2-025000000001
  12. type: Opaque
  13. data:
  14. config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19