Secret

本页面介绍 Kubernetes 中的 Secret 对象及其在 Google Kubernetes Engine (GKE) 中的用途。

什么是 Secret?

Secret 是用于存储集群中的密码、OAuth 令牌和 SSH 密钥等敏感数据的安全对象。将敏感数据存储在 Secret 中比存储在明文 ConfigMap 或 Pod 规范中更加安全。使用 Secret 可以控制敏感数据的用途,并降低将数据暴露给未授权用户的风险。

您还可以利用自己在 Cloud KMS 中管理的密钥实现应用层 Secret 加密。如需了解详情,请参阅应用层 Secret 加密

创建 Secret

您可以使用命令行或 YAML 文件创建 Secret。

kubectl

如需创建 Secret,请运行以下命令:

kubectl create secret SECRET_TYPE SECRET_NAME DATA

请替换以下内容:

  • SECRET_TYPE:Secret 类型,可以是以下类型之一:

    • generic:基于本地文件、目录或字面量值创建 Secret。
    • docker-registry:创建要用于 Docker 注册表的 dockercfg Secret。用于针对 Docker 注册表进行身份验证。
    • tls:基于指定的公钥/私钥对创建 TLS Secret。公键/私键对必须已经存在。公钥证书必须采用 .PEM 编码,且与指定的私钥相匹配。

    对于大多数 Secret,请使用 generic 类型。

  • SECRET_NAME:您要创建的 Secret 的名称。

  • DATA:要添加到 Secret 的数据,可以是以下数据之一:

    • 包含一个或多个配置文件的目录的路径,使用 --from-file--from-env-file 标志指示
    • 键值对,每个键值对都使用 --from-literal 标志指定。

如需详细了解 kubectl create,请参阅参考文档

YAML 文件

如需使用 YAML 文件创建 Secret,请在该文件中定义 Secret 对象,然后使用以下命令部署该对象:

kubectl create -f FILE_NAME.yaml

如需查看示例,请参阅使用 Secret 安全地分发凭据

从文件创建 Secret

如需基于一个或多个文件创建 Secret,请使用 --from-file--from-env-file。该文件必须是明文,但文件的扩展名无关紧要。

使用 --from-file 创建 Secret

当您使用 --from-file 创建 Secret 时,Secret 的值就是文件的内容。如果您的 Secret 值包含多个键值对,请改用 --from-env-file

您可以传入单个文件或多个文件:

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_FILE1 \
  --from-file PATH_TO_FILE2

请替换以下内容:

  • SECRET_TYPE:Secret 类型,可以是以下类型之一:

    • generic:基于本地文件、目录或字面量值创建 Secret。
    • docker-registry:创建要用于 Docker 注册表的 dockercfg Secret。用于针对 Docker 注册表进行身份验证。
    • tls:基于指定的公钥/私钥对创建 TLS Secret。公键/私键对必须已经存在。公钥证书必须采用 .PEM 编码,且与指定的私钥相匹配。

      对于大多数 Secret,请使用 generic 类型。

  • SECRET_NAME:您要创建的 Secret 的名称。

  • PATH_TO_FILE:文件的路径。

还可以传入包含多个文件的目录:

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_DIRECTORY

PATH_TO_DIRECTORY 替换为该目录的路径。

例如,以下命令基于 username.txtpassword.txt 这两个文件创建一个名为 credentialsgeneric 类型 Secret,并将键分别设置为 username.txtpassword.txt

kubectl create secret generic credentials \
  --from-file ./username.txt \
  --from-file ./password.txt

Secret 值在 Kubernetes 中采用 base-64 编码。

运行 kubectl get secret credentials -o yaml 会返回以下输出:

apiVersion: v1
data:
  password.txt: MTIzNAo=
  username.txt: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: ...
  name: credentials
  namespace: default
  resourceVersion: "2011810"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: ...
type: Opaque

默认情况下,键是文件名。在此示例中,键为 password.txtusername.txt。您可以使用 --from-file 标志中的扩展语法替换默认键:

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file=KEY_NAME=PATH_TO_DIRECTORY

KEY_NAME 替换为您要为该键设置的名称。

以下示例创建了一个 generic 类型 Secret credentials 两个文件 username.txtpassword.txt,并将键设置为 usernamepassword,而不是使用文件名:

kubectl create secret generic credentials \
  --from-file=username=./username.txt \
  --from-file=password=./password.txt

使用 --from-env-file 创建 Secret

如需将多个键值对加载到单个 Secret 中,请将这些键值对存储在一个或多个明文文件中,然后使用 --from-env-file 而非 --from-file 来加载它们。您可以通过多次指定此标志来加载多个文件。此标志具有与 --from-file 相同的限制

以下示例使用单个文件 credentials.txt 创建一个 generic 调用 Secret credentials,其中包含多个键值对。

  1. 创建 credentials.txt 文件:

    # Each of these key-value pairs is loaded into the Secret
    username=jane
    password=d7xnNss7EGCFZusG
    

    Secret 值在 Kubernetes 中采用 base64 编码。

  2. 创建 Secret

    kubectl create secret generic credentials \
      --from-env-file ./credentials.txt
    

运行 kubectl get secret credentials -o yaml 会返回以下输出:

apiVersion: v1
data:
  password: ZDd4bk5zczdFR0NGWnVzRw==
  username: amFuZQ==
kind: Secret
metadata:
  creationTimestamp: 2019-06-04T15:39:27Z
  name: credentials
  namespace: default
  resourceVersion: "14507319"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque

限制

kubectl 会忽略非常规文件,例如符号链接、设备和管道。子目录也会被忽略;kubectl create secret 不会递归到子目录中。

基于字面量值创建

如需基于字面量值创建 Secret,请使用 --from-literal

例如,以下命令创建一个名为 literal-token、包含两个键值对的 generic 类型 Secret:

kubectl create secret generic literal-token \
  --from-literal user=admin \
  --from-literal password=1234

为每个键值对指定 --from-literal。这些值自动采用 base64 编码。

运行 kubectl get secret literal-token -o yaml 会返回以下输出:

apiVersion: v1
data:
  password: MTIzNA==
  user: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: ...
  name: literal-token
  namespace: default
  resourceVersion: "2012831"
  selfLink: /api/v1/namespaces/default/secrets/literal-token
  uid: ...
type: Opaque

在此输出中,passworduser 均采用 base64 编码。 base64 编码可以使信息被无法处理某些字符的应用和服务所理解。base64 编码不提供安全性。

使用 Secret

要将 Secret 用于您的工作负载,您可以指定引用 Secret 值的环境变量,或者挂载包含 Secret 的卷。

如需了解 Secret 的使用信息,请参阅使用 Secret

后续步骤