Secret
对象用来存储敏感数据,如 Pod 用于访问服务的凭据。例如,为访问数据库,你可能需要一个 Secret 来存储所需的用户名及密码。
kubectl create secret generic db-user-pass \
--from-literal=username=admin \
--from-literal=password='admin12345'
出现如下提示:
secret/db-user-pass created
将凭据保存到文件:
root@k8s-master:~# echo -n 'admin' > ./username.txt
root@k8s-master:~# echo -n 'admin12345' > ./password.txt
-n
标志用来确保生成文件的文末没有多余的换行符。
在 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
root@k8s-master:~# kubectl get secrets | grep db-user-pass
db-user-pass Opaque 2 14m
查看Secret细节:
root@k8s-master:~# kubectl describe secrets db-user-pass
Name: db-user-pass
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
password: 10 bytes
username: 5 bytes
查看你所创建的 Secret 内容
root@k8s-master:~# kubectl get secrets db-user-pass -o jsonpath='{.data}'
{"password":"YWRtaW4xMjM0NQ==","username":"YWRtaW4="}
解码数据
root@k8s-master:~# echo YWRtaW4xMjM0NQ== | base64 --decode
admin12345
root@k8s-master:~# kubectl get secrets db-user-pass -o jsonpath='{.data.password}' | base64 --decode
admin12345
root@k8s-master:~# kubectl edit secrets db-user-pass
你可以编辑一个现存的 Secret
对象, 要想编辑一个 Secret,请使用上方命令,会出现下方内容,允许更新data
字段中base64编码
# 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 will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
password: YWRtaW4xMjM0NQ==
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2023-10-24T05:51:45Z"
name: db-user-pass
namespace: default
resourceVersion: "35866"
uid: 7fe861f4-2062-49a5-8e76-44a67e0dd014
type: Opaque
~
root@k8s-master:~# kubectl delete secrets db-user-pass
secret "db-user-pass" deleted
你可以先用 JSON 或 YAML 格式在一个清单文件中定义
Secret
对象,然后创建该对象。 Secret 资源包含 2 个键值对:data
和stringData
。data
字段用来存储 base64 编码的任意数据。 提供stringData
字段是为了方便,它允许 Secret 使用未编码的字符串。data
和stringData
的键必须由字母、数字、-
、_
或.
组成。以下示例使用
data
字段在 Secret 中存储两个字符串:
将字符串变为base64:
root@k8s-master:~# echo -n 'admin' | base64
YWRtaW4=
root@k8s-master:~# echo -n 'kubernetes' | base64
a3ViZXJuZXRlcw==
创建清单:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: a3ViZXJuZXRlcw==
创建
root@k8s-master:~# vim secret.yml
root@k8s-master:~# kubectl apply -f secret.yml
secret/mysecret created
对于某些场景,你可能希望使用
stringData
字段。 这个字段可以将一个非 base64 编码的字符串直接放入 Secret 中, 当创建或更新该 Secret 时,此字段将被编码。
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
config.yaml: |
url: "www.baidu.com"
username: admin
password: kubernetes
查看刚刚创建的secret:
root@k8s-master:~# kubectl get secrets mysecret -o yaml
apiVersion: v1
data:
config.yaml: dXJsOiAid3d3LmJhaWR1LmNvbSIKdXNlcm5hbWU6IGFkbWluCnBhc3N3b3JkOiBrdWJlcm5ldGVzCg==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"string Data":{"config.yaml":"url: \"www.baidu.com\"\nusername: admin\npassword: kubernetes\n"},"type":"Opaque"}
creationTimestamp: "2023-10-24T06:43:02Z"
name: mysecret
namespace: default
resourceVersion: "42840"
uid: 70127ec6-354f-4814-8f38-455fbdc31f18
type: Opaque
data
和 stringData
如果你在 data
和 stringData
中设置了同一个字段,则使用来自 stringData
中的值。
例如,如果你定义以下 Secret:
root@k8s-master:~# kubectl get secrets mysecret -o yaml
apiVersion: v1
data:
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-24T07:05:00Z"
name: mysecret
namespace: default
resourceVersion: "44348"
uid: 764d2424-40e2-4a30-a14d-bbee4831e791
type: Opaque
解码为:
root@k8s-master:~# echo YWRtaW5pc3RyYXRvcg== | base64 --decode
administrator
kubectl
支持使用 Kustomize 对象管理工具来管理 Secret 和 ConfigMap。你可以使用 Kustomize 创建资源生成器(Resource Generator), 该生成器会生成一个 Secret,让你能够通过kubectl
应用到 API 服务器
secretGenerator:
- name: database-creds
literals:
- username=admin
- password=1f2d1e2e67df
在所有情况下,你都不需要对取值作 base64 编码。 YAML 文件的名称必须是 kustomization.yaml
或 kustomization.yml
root@k8s-master:~# vim kustomization.yaml
root@k8s-master:~# kubectl apply -k ./
secret/database-creds-bkbd782d2c created
查看:
root@k8s-master:~# kubectl get -k ./ -o jsonpath='{.data}'
{"password":"MWYyZDFlMmU2N2Rm","username":"YWRtaW4="}