使用 kubectl 管理 Secret

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

本页面展示如何使用 kubectl 命令行工具创建、编辑、管理和删除 Kubernetes Secret

开始之前

你需要有一个 Kubernetes 集群,并且 kubectl 命令行工具配置正确,能够与你的集群通信。建议在至少有两个非控制平面主机节点的集群上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者使用以下 Kubernetes 演练场:

创建 Secret

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

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

使用原始数据

运行以下命令

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

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

使用源文件

  1. 将凭证存储在文件中

    echo -n 'admin' > ./username.txt
    echo -n 'S!B\*d$zDsb=' > ./password.txt
    

    -n 标志确保生成的文件末尾没有额外的换行符。这很重要,因为当 kubectl 读取文件并将内容编码为 base64 字符串时,额外的换行符也会被编码。在包含在文件中的字符串中,你无需转义特殊字符。

  2. 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 getkubectl describe 命令会避免显示 Secret 的内容。这是为了保护 Secret 不被意外暴露或存储在终端日志中。

解码 Secret

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

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

    输出类似于

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

    echo 'UyFCXCpkJHpEc2I9' | base64 --decode
    

    输出类似于

    S!B\*d$zDsb=
    
    kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
    

编辑 Secret

你可以编辑现有的 Secret 对象,除非它是不可变的。要编辑 Secret,运行以下命令:

kubectl edit secrets <secret-name>

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

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file, it will be
# reopened with the relevant failures.
#
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

接下来

最后修改于太平洋标准时间 2023 年 10 月 24 日下午 2:54:关于 stringData 和 server-side apply 问题的文档 (920a68b536)