第 20 章 Secrets
20.1. 使用 secret
本主题讨论 secret 的重要属性,并概述了开发人员如何使用它们。
Secret
对象类型提供了一种机制来保存敏感信息,如密码、OpenShift Container Platform 客户端配置文件、dockercfg
文件和私有源存储库凭证等。secret 将敏感内容与 Pod 分离。您可以使用卷插件将 secret 信息挂载到容器中,系统也可以使用 secret 代表 Pod 执行操作。
YAML Secret 对象定义
apiVersion: v1 kind: Secret metadata: name: test-secret namespace: my-namespace type: Opaque 1 data: 2 username: dmFsdWUtMQ0K 3 password: dmFsdWUtMg0KDQo= stringData: 4 hostname: myapp.mydomain.com 5
- 1
- 2
- 3
- 与
data
映射中的键关联的值必须采用 base64 编码。 - 4
- 与
stringData
映射中的键关联的值由纯文本字符串组成。 - 5
stringData
映射中的条目将转换为 base64,然后该条目将自动移动到data
映射中。此字段是只读的,只能通过data
字段返回。从本地 .docker/config.json 文件创建 secret:
$ oc create secret generic dockerhub \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson
此命令将生成名为
dockerhub
的 secret JSON 规格并创建该对象。
YAML Opaque Secret 对象定义
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque 1
data:
username: dXNlci1uYW1l
password: cGFzc3dvcmQ=
- 1
- 指定一个 opaque secret。
Docker 配置 JSON 文件对象定义
apiVersion: v1 kind: Secret metadata: name: aregistrykey namespace: myapps type: kubernetes.io/dockerconfigjson 1 data: .dockerconfigjson:bm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== 2
20.1.1. 机密的属性
主要属性包括:
- Secret 数据可以独立于其定义来引用。
- Secret 数据卷由临时文件工具 (tmpfs) 支持,永远不会停留在节点上。
- Secret 数据可以在命名空间内共享。
20.1.2. 创建 Secret
您必须先创建 secret,然后创建依赖于此 secret 的 pod。
在创建 secret 时:
- 使用 secret 数据创建 secret 对象。
- 更新 pod 的服务帐户以允许引用该 secret。
-
创建以环境变量或文件(使用
secret
卷)形式消耗 secret 的 pod。
您可以使用 create 命令从 JSON 或 YAML 文件创建 secret 对象:
$ oc create -f <filename>
20.1.3. secret 的类型
type
字段中的值指明 secret 的键名称和值的结构。此类型可用于强制使 secret 对象中存在用户名和密钥。如果您不想进行验证,请使用 opaque 类型,这也是默认类型。
指定以下一种类型来触发最小服务器端验证,确保 secret 数据中存在特定的键名称:
-
kubernetes.io/service-account-token
。使用服务帐户令牌。 -
kubernetes.io/dockercfg
。将 .dockercfg 文件用于所需的 Docker 凭证。 -
kubernetes.io/dockerconfigjson
。将 .docker/config.json 文件用于所需的 Docker 凭证。 -
kubernetes.io/basic-auth
。与基本身份验证一起使用。 -
kubernetes.io/ssh-auth
。与 SSH 密钥身份验证 一起使用 . -
kubernetes.io/tls
。使用 TLS 证书颁发机构
如果不想进行验证,设置 type= Opaque
。这意味着,secret 不声明符合键名称或值的任何约定。opaque secret 允许使用无结构 key:value
对,可以包含任意值。
您可以指定其他任意类型,如 example.com/my-secret-type
。这些类型不是在服务器端强制执行,而是表明 secret 的创建者意在符合该类型的键/值要求。
有关不同 secret 类型的示例,请参阅使用 Secrets 中的代码示例。
20.1.4. 更新 secret
修改 secret 值时,值(由已在运行的 pod 使用)不会动态更改。若要更改 secret,需要删除原始 Pod 并创建一个新 Pod(可能具有相同的 PodSpec)。当您将 secret 挂载为卷时,您的 secret 会自动更新。
更新 secret 遵循与部署新容器镜像相同的工作流。您可以使用 kubectl rolling-update
命令。
secret 中的 resourceVersion
值不在引用时指定。因此,如果在 pod 启动的同时更新 secret,则将不能定义用于 pod 的 secret 版本。
目前,无法检查 pod 创建时使用的 secret 对象的资源版本。按照计划 pod 将报告此信息,以便控制器可以重启使用旧 resourceVersion
的 pod。在此期间,请勿更新现有 secret 的数据,而应创建具有不同名称的新数据。