使用 kubectl 管理 Secret

使用 kubectl 命令行创建 Secret 对象。

本页向你展示如何使用 kubectl 命令行工具来创建、编辑、管理和删除。 Kubernetes Secrets

准备开始

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

创建 Secret

Secret 对象用来存储敏感数据,如 Pod 用于访问服务的凭据。例如,为访问数据库,你可能需要一个 Secret 来存储所需的用户名及密码。

你可以通过在命令中传递原始数据,或将凭据存储文件中,然后再在命令行中创建 Secret。以下命令 将创建一个存储用户名 admin 和密码 S!B\*d$zDsb= 的 Secret。

使用原始数据

执行以下命令:

  1. kubectl create secret generic db-user-pass \
  2. --from-literal=username=admin \
  3. --from-literal=password='S!B\*d$zDsb='

你必须使用单引号 '' 转义字符串中的特殊字符,如 $\*=! 。否则,你的 shell 将会解析这些字符。

使用源文件

  1. 对凭证的取值作 base64 编码后保存到文件中:

    1. echo -n 'admin' | base64 > ./username.txt
    2. echo -n 'S!B\*d$zDsb=' | base64 > ./password.txt
    1. `-n` 标志用来确保生成文件的文末没有多余的换行符。这很重要,因为当 `kubectl`

    读取文件并将内容编码为 base64 字符串时,额外的换行符也会被编码。 你不需要对文件中包含的字符串中的特殊字符进行转义。

  2. kubectl 命令中传递文件路径:

    1. kubectl create secret generic db-user-pass \
    2. --from-file=./username.txt \
    3. --from-file=./password.txt
    1. 默认键名为文件名。你也可以通过 `--from-file=[key=]source` 设置键名,例如:
    1. kubectl create secret generic db-user-pass \
    2. --from-file=username=./username.txt \
    3. --from-file=password=./password.txt

无论使用哪种方法,输出都类似于:

  1. secret/db-user-pass created

验证 Secret

检查 Secret 是否已创建:

  1. kubectl get secrets

输出类似于:

  1. NAME TYPE DATA AGE
  2. db-user-pass Opaque 2 51s

查看 Secret 的细节:

  1. kubectl describe secret db-user-pass

输出类似于:

  1. Name: db-user-pass
  2. Namespace: default
  3. Labels: <none>
  4. Annotations: <none>
  5. Type: Opaque
  6. Data
  7. ====
  8. password: 12 bytes
  9. username: 5 bytes

kubectl getkubectl describe 命令默认不显示 Secret 的内容。 这是为了防止 Secret 被意外暴露或存储在终端日志中。

解码 Secret

  1. 查看你所创建的 Secret 内容

    1. kubectl get secret db-user-pass -o jsonpath='{.data}'

    输出类似于:

    1. {"password":"UyFCXCpkJHpEc2I9","username":"YWRtaW4="}
  2. 解码 password 数据:

    1. echo 'UyFCXCpkJHpEc2I9' | base64 --decode

    输出类似于:

    1. S!B\*d$zDsb=

    注意:

    这是一个出于文档编制目的的示例。实际上,该方法可能会导致包含编码数据的命令存储在 Shell 的历史记录中。任何可以访问你的计算机的人都可以找到该命令并对 Secret 进行解码。 更好的办法是将查看和解码命令一同使用。

    1. kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode

编辑 Secret

你可以编辑一个现存的 Secret 对象,除非它是不可改变的。 要想编辑一个 Secret,请执行以下命令:

  1. kubectl edit secrets <secret-name>

这将打开默认编辑器,并允许你更新 data 字段中的 base64 编码的 Secret 值,示例如下:

  1. #请编辑下面的对象。以“#”开头的行将被忽略,
  2. #空文件将中止编辑。如果在保存此文件时发生错误,
  3. #则将重新打开该文件并显示相关的失败。
  4. apiVersion: v1
  5. data:
  6. password: UyFCXCpkJHpEc2I9
  7. username: YWRtaW4=
  8. kind: Secret
  9. metadata:
  10. creationTimestamp: "2022-06-28T17:44:13Z"
  11. name: db-user-pass
  12. namespace: default
  13. resourceVersion: "12708504"
  14. uid: 91becd59-78fa-4c85-823f-6d44436242ac
  15. type: Opaque

清理

要想删除一个 Secret,请执行以下命令:

  1. kubectl delete secret db-user-pass

接下来