Secret

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

什么是 Secret?

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

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

创建 Secret

您可以使用 kubectl create secret 创建 Secret:

kubectl create secret type name data

其中:

  • type 可以是下列选项之一:

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

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

  • name 是您要创建的 Secret 的名称。

  • data 可以是下列选项之一:

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

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

或者,您也可以通过在 YAML 清单文件中定义 Secret 对象并使用以下命令部署该对象来创建 Secret:

kubectl create -f file-name.yaml

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

基于文件创建

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

--from-file

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

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

kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2

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

kubectl create secret type name --from-file /path/to/directory

例如,以下命令基于 username.txtpassword.txt 这两个文件创建一个名为 credentials 的 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

默认情况下,键是文件名。您可以使用 --from-file 扩展语法替换键:

kubectl create secret type name --from-file=key=/path/to/directory

以下示例基于 username.txt 和 password.txt 两个文件创建一个名为 credentials 的 Secret,并将键设置为 usernamepassword,而不是使用文件名:

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

--from-env-file

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

例如,以下命令基于 credentials.txt 单一文件创建一个名为 credentials 的 Secret,该文件包含多个键值对:

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

Secret 值在 Kubernetes 中采用 base64 编码。

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、包含两个键值对的通用 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

后续步骤