使用 kubectl 管理 Secret
本页向你展示如何使用 kubectl
命令行工具来创建、编辑、管理和删除。
Kubernetes Secrets
准备开始
你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:
创建 Secret
Secret
对象用来存储敏感数据,如 Pod 用于访问服务的凭据。例如,为访问数据库,你可能需要一个
Secret 来存储所需的用户名及密码。
你可以通过在命令中传递原始数据,或将凭据存储文件中,然后再在命令行中创建 Secret。以下命令
将创建一个存储用户名 admin
和密码 S!B\*d$zDsb=
的 Secret。
使用原始数据
执行以下命令:
kubectl create secret generic db-user-pass \
--from-literal=username=admin \
--from-literal=password='S!B\*d$zDsb='
你必须使用单引号 ''
转义字符串中的特殊字符,如 $
、\
、*
、=
和!
。否则,你的 shell
将会解析这些字符。
Secret 的 stringData
字段与服务端应用不兼容。
使用源文件
-
将凭据保存到文件:
echo -n 'admin' > ./username.txt echo -n 'S!B\*d$zDsb=' > ./password.txt
-n
标志用来确保生成文件的文末没有多余的换行符。这很重要,因为当kubectl
读取文件并将内容编码为 base64 字符串时,额外的换行符也会被编码。 你不需要对文件中包含的字符串中的特殊字符进行转义。
-
在
kubectl
命令中传递文件路径:kubectl create secret generic db-user-pass \ --from-file=./username.txt \ --from-file=./password.txt
默认键名为文件名。你也可以通过
--from-file=[key=]source
设置键名,例如:kubectl create secret generic db-user-pass \ --from-file=username=./username.txt \ --from-file=password=./password.txt
无论使用哪种方法,输出都类似于:
secret/db-user-pass created
验证 Secret
检查 Secret 是否已创建:
kubectl get secrets
输出类似于:
NAME TYPE DATA AGE
db-user-pass Opaque 2 51s
查看 Secret 的细节:
kubectl describe secret db-user-pass
输出类似于:
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
kubectl get
和 kubectl describe
命令默认不显示 Secret
的内容。
这是为了防止 Secret
被意外暴露或存储在终端日志中。
解码 Secret
-
查看你所创建的 Secret 内容
kubectl get secret db-user-pass -o jsonpath='{.data}'
输出类似于:
{ "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" }
-
解码
password
数据:echo 'UyFCXCpkJHpEc2I9' | base64 --decode
输出类似于:
S!B\*d$zDsb=
注意:这是一个出于文档编制目的的示例。实际上,该方法可能会导致包含编码数据的命令存储在 Shell 的历史记录中。任何可以访问你的计算机的人都可以找到该命令并对 Secret 进行解码。 更好的办法是将查看和解码命令一同使用。
kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
编辑 Secret
你可以编辑一个现存的 Secret
对象,除非它是不可改变的。
要想编辑一个 Secret,请执行以下命令:
kubectl edit secrets <secret-name>
这将打开默认编辑器,并允许你更新 data
字段中的 base64 编码的 Secret 值,示例如下:
#请编辑下面的对象。以“#”开头的行将被忽略,
#空文件将中止编辑。如果在保存此文件时发生错误,
#则将重新打开该文件并显示相关的失败。
apiVersion: v1
data:
password: UyFCXCpkJHpEc2I9
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-06-28T17:44:13Z"
name: db-user-pass
namespace: default
resourceVersion: "12708504"
uid: 91becd59-78fa-4c85-823f-6d44436242ac
type: Opaque
清理
要想删除一个 Secret,请执行以下命令:
kubectl delete secret db-user-pass
接下来
- 进一步阅读 Secret 概念
- 了解如何使用配置文件管理 Secret
- 了解如何使用 Kustomize 管理 Secret