和创建其他类型的 API 对象(Pod、Deployment、StatefulSet、ConfigMap 等)一样,您也可以先在 yaml 文件中定义好 Secret,然后通过 kubectl apply -f
命令创建。此时,您可以通过如下两种方式在 yaml 文件中定义 Secret:
- data:使用 data 字段时,取值的内容必须是 base64 编码的
- stringData:使用 stringData 时,更为方便,您可以直接将取值以明文的方式写在 yaml 文件中
在 yaml 中定义 data
-
假设您要保存假设您要保存
username=admin
和password=1f2d1e2e67df
到 Secret 中,请先将数据的值转化为 base64 编码,执行如下命令:shecho -n 'admin' | base64 YWRtaW4= echo -n '1f2d1e2e67df' | base64 MWYyZDFlMmU2N2Rm
-
创建 secret.yaml 文件,内容如下所示:
yamlapiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
-
执行命令
shkubectl apply -f ./secret.yaml
输出结果如下所示:
textsecret/mysecret created
此时 Secret 创建成功
在 yaml 中定义 stringData
有时,您并不想先将用户名和密码转换为 base64 编码之后再创建 Secret,则,您可以通过定义 stringData 来达成,此时 stringData 中的取值部分将被 apiserver 自动进行 base64 编码之后再保存。
- 创建文件 secret1.yaml,内容如下所示:
yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
username: admin
password: 1f2d1e2e67df
执行命令 kubectl apply -f ./secret1.yaml
输出结果如下所示:
secret/mysecret configured
此时 Secret 创建成功
执行命令 kubectl get -f ./secret1.yaml -o yaml
输出结果如下所示:
yaml
apiVersion: v1
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"password":"1f2d1e2e67df","username":"admin"},"type":"Opaque"}
creationTimestamp: "2023-10-24T15:20:19Z"
name: mysecret
namespace: default
resourceVersion: "53720198"
uid: 14321f8d-630a-4dbb-a920-b5791db67d1f
type: Opaque
- 此时 annotation 中可以看到 password 的明文,这也许并不是您所期望的
- 输出的 Secret 对象中,stringData 字段不再出现
同时定义了 data 和 stringData
如果您同时定义了 data 和 stringData,对于两个对象中 key 重复的字段,最终将采纳 stringData 中的 value
-
创建文件 secret2.yaml,该文件同时定义了 data 和 stringData,内容如下所示:
yamlapiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= stringData: username: administrator
-
执行命令
kubectl apply -f ./secret2.yaml
输出结果如下所示:textsecret/mysecret configured
此时 Secret 创建成功
-
执行命令
kubectl get -f ./secret2.yaml -o yaml
输出结果如下所示:yamlapiVersion: v1 data: password: MWYyZDFlMmU2N2Rm username: YWRtaW5pc3RyYXRvcg== kind: Secret metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data":{"username":"YWRtaW4="},"kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"username":"administrator"},"type":"Opaque"} creationTimestamp: "2023-10-24T15:20:19Z" name: mysecret namespace: default resourceVersion: "53720952" uid: 14321f8d-630a-4dbb-a920-b5791db67d1f type: Opaque
此处
YWRtaW5pc3RyYXRvcg==
解码后的值是administrator
将配置文件存入 Secret
假设您的某个应用程序需要从一个配置文件中读取敏感信息,此时,您可以将该文件的内容存入 Secret,再通过数据卷的形式挂载到容器。[挂载方式未完待续]
例如,您的应用程序需要读取如下配置文件内容:
yaml
apiUrl: "https://www.api.com/api/v1"
username: user
password: password
您可以使用下面的 secret3.yaml 创建 Secret
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
config.yaml: |-
apiUrl: "https://www.api.com/api/v1"
username: user
password: password
执行命令 kubectl apply -f ./secret3.yaml
输出结果如下所示:
secret/mysecret configured
此时 Secret 创建成功
- 执行命令
kubectl get -f ./secret3.yaml -o yaml
输出结果如下所示:
yaml
apiVersion: v1
data:
config.yaml: YXBpVXJsOiAiaHR0cHM6Ly93d3cuYXBpLmNvbS9hcGkvdjEiCnVzZXJuYW1lOiB1c2VyCnBhc3N3b3JkOiBwYXNzd29yZA==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"config.yaml":"apiUrl: \"https://www.api.com/api/v1\"\nusername: user\npassword: password"},"type":"Opaque"}
creationTimestamp: "2023-10-24T15:20:19Z"
name: mysecret
namespace: default
resourceVersion: "53721752"
uid: 14321f8d-630a-4dbb-a920-b5791db67d1f
type: Opaque