本页面介绍 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.txt
和 password.txt
这两个文件创建一个名为 credentials
的 Secret,并将键分别设置为 username.txt
和 password.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,并将键设置为 username
和 password
,而不是使用文件名:
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
请注意,上文输出中的 password
和 user
采用 base64 编码。
base64 编码可以使信息被无法处理某些字符的应用和服务所理解。base64 编码不提供安全性。
使用 Secret
要将 Secret 用于您的工作负载,您可以指定引用 Secret 值的环境变量,或者挂载包含 Secret 的卷。
如需了解 Secret 的使用信息,请参阅使用 Secret。