k8s创建管理Secret
使用 kubectl 管理 Secret
创建 Secret
一个 Secret
可以包含 Pod 访问数据库所需的用户凭证。 例如,由用户名和密码组成的数据库连接字符串。 你可以在本地计算机上,将用户名存储在文件 ./username.txt
中,将密码存储在文件 ./password.txt
中。
1 | echo -n 'admin' > ./username.txt |
在这些命令中,-n
标志确保生成的文件在文本末尾不包含额外的换行符。 这一点很重要,因为当 kubectl
读取文件并将内容编码为 base64 字符串时,多余的换行符也会被编码。
kubectl create secret
命令将这些文件打包成一个 Secret 并在 API 服务器上创建对象。
1 | kubectl create secret generic db-user-pass \ |
输出类似于:
1 | secret/db-user-pass created |
验证 Secret
检查 secret 是否已创建:
1 | kubectl get secrets |
输出类似于:
1 | NAME TYPE DATA AGE |
你可以查看 Secret
的描述:
1 | kubectl describe secrets/db-user-pass |
输出类似于:
1 | Name: db-user-pass |
kubectl get
和 kubectl describe
命令默认不显示 Secret
的内容。 这是为了防止 Secret
被意外暴露或存储在终端日志中。
解码 Secret
要查看创建的 Secret 的内容,运行以下命令:
1 | kubectl get secret db-user-pass -o jsonpath='{.data}' |
输出类似于:
1 | {"password":"MWYyZDFlMmU2N2Rm","username":"YWRtaW4="} |
现在你可以解码 password
的数据:
1 | echo 'MWYyZDFlMmU2N2Rm' | base64 --decode |
输出类似于:
1 | 1f2d1e2e67df |
使用配置文件管理 Secret
你可以先用 JSON 或 YAML 格式在文件中创建 Secret,然后创建该对象。 Secret 资源包含2个键值对: data
和 stringData
。 data
字段用来存储 base64 编码的任意数据。 提供 stringData
字段是为了方便,它允许 Secret 使用未编码的字符串。 data
和 stringData
的键必须由字母、数字、-
,_
或 .
组成。
例如,要使用 Secret 的 data
字段存储两个字符串,请将字符串转换为 base64 ,如下所示:
1 | echo -n 'admin' | base64 |
输出类似于:
1 | YWRtaW4= |
输出类似于:
1 | MWYyZDFlMmU2N2Rm |
编写一个 Secret 配置文件,如下所示:
1 | apiVersion: v1 |
注意,Secret 对象的名称必须是有效的 DNS 子域名.
说明:
Secret 数据的 JSON 和 YAML 序列化结果是以 base64 编码的。 换行符在这些字符串中无效,必须省略。 在 Darwin/macOS 上使用
base64
工具时,用户不应该使用-b
选项分割长行。 相反地,Linux 用户 应该 在base64
地命令中添加-w 0
选项, 或者在-w
选项不可用的情况下,输入base64 | tr -d '\n'
。对于某些场景,你可能希望使用
stringData
字段。 这字段可以将一个非 base64 编码的字符串直接放入 Secret 中, 当创建或更新该 Secret 时,此字段将被编码。
对于某些场景,你可能希望使用 stringData
字段。 这字段可以将一个非 base64 编码的字符串直接放入 Secret 中, 当创建或更新该 Secret 时,此字段将被编码。
上述用例的实际场景可能是这样:当你部署应用时,使用 Secret 存储配置文件, 你希望在部署过程中,填入部分内容到该配置文件。
例如,如果你的应用程序使用以下配置文件:
对于某些场景,你可能希望使用 stringData
字段,这字段可以将一个非 base64 编码的字符串直接放入 Secret 中, 当创建或更新该 Secret 时,此字段将被编码。
比如当我们部署应用时,使用 Secret 存储配置文件, 你希望在部署过程中,填入部分内容到该配置文件。例如,如果你的应用程序使用以下配置文件:
1 | apiUrl: "https://my.api.com/api/v1" |
那么我们就可以使用以下定义将其存储在 Secret 中:
1 | apiVersion: v1 |
比如我们直接创建上面的对象后重新获取对象的话 config.yaml
的值会被编码:
1 | apiVersion: v1 |
创建好 Secret
对象后,有两种方式来使用它:
- 以环境变量的形式
- 以Volume的形式挂载
清理
删除创建的 Secret:
1 | kubectl delete secret db-user-pass |