一、为什么要有Secret?
我们知道ConfigMap用于存在镜像的配置数据,但ConfigMap存放的数据通常都是不敏感且明文的数据,而有些敏感的、需要加密存储的数据放在什么地方呢?Secret闪亮登场,Secret也是存在镜像的配置数据,作用基本与ConfigMap类似,只是Secret存在的大多是敏感数据,kubernetes默认会对这些数据进行Base64编码。
二、创建Secret
1. 通过–from-file 从文件导入数据创建
通过命令:kubectl create secret generic 名称 --from-file=文件名 来创建,如果有多个文件,则通过指定多个–from-file。
[root@k8s-master1 secrets]# echo -n '1f2d1e2e67df' > ./password.txt
[root@k8s-master1 secrets]# echo -n 'admin' > ./username.txt
[root@k8s-master1 secrets]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
查询Secret列表:kubectl get secrets
查询配置文件:kubectl get secret db-user-pass -o yaml
对密文进行解密:echo “密文” | base64 --decode
[root@k8s-master1 secrets]# kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 7s
default-token-cb5j8 kubernetes.io/service-account-token 3 11d
[root@k8s-master1 secrets]# kubectl get secret db-user-pass -o yaml
apiVersion: v1
data:
password.txt: MWYyZDFlMmU2N2Rm
username.txt: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-12-25T02:12:44Z"
name: db-user-pass
namespace: default
resourceVersion: "419263"
uid: c50190ab-6a94-4bc1-a992-0c19e7431006
type: Opaque
You have new mail in /var/spool/mail/root
[root@k8s-master1 secrets]# echo "MWYyZDFlMmU2N2Rm" | base64 --decode
1f2d1e2e67df
2. 使用–from-literal 从字面量数据创建
通过命令:kubectl create secret generic 名称 --from-literal=key=value 来创建,如果有多个键值对,则通过指定多个–from-literal。
[root@k8s-master1 secrets]# kubectl create secret generic db-user-pass2 --from-literal=username=admin --from-literal=password='$123456*' --from-literal=remark=\$remark
secret/db-user-pass2 created
[root@k8s-master1 secrets]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 6m29s
db-user-pass2 Opaque 3 7s
default-token-cb5j8 kubernetes.io/service-account-token 3 11d
[root@k8s-master1 secrets]# kubectl get secret db-user-pass2 -o yaml
apiVersion: v1
data:
password: JDEyMzQ1Nio=
remark: JHJlbWFyaw==
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-12-25T02:19:06Z"
name: db-user-pass2
namespace: default
resourceVersion: "419923"
uid: a567bcb5-4329-4fa8-9e70-8921b96438a1
type: Opaque
[root@k8s-master1 secrets]# echo "JDEyMzQ1Nio=" | base64 --decode
$123456*[root@k8s-master1 secrets]# echo "JHJlbWFyaw==" | base64 --decode
$remark[root@k8s-master1 secrets]#
需要注意的是,如果创建的键值对包含特殊字符(、*、\、!)则需要通过单引号包起来,或者使用 \ 进行转码,例如 转码为 $ .
3. 通过yaml文件创建
(1)定义一个Secret,具体配置如下:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: JDEyMzQ1Nio=
stringData:
username: admin2
password2: 1f2d1e2e67df
从上面的配置文件中,我们发现了data和stringData两个配置块,data中的配置需要我们对value值先进行Base64编码,而stringData则不需要,只需要保持明文配置即可,kubernetes会帮我们进行Base64编码,如果data和stringData存在相同的配置项,则stringData会覆盖data的配置项。
[root@k8s-master1 secrets]# vim 01-create-secret.yml
[root@k8s-master1 secrets]#
[root@k8s-master1 secrets]#
[root@k8s-master1 secrets]#
[root@k8s-master1 secrets]# kubectl apply -f 01-create-secret.yml
secret/mysecret created
[root@k8s-master1 secrets]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 11m
db-user-pass2 Opaque 3 5m36s
default-token-cb5j8 kubernetes.io/service-account-token 3 11d
mysecret Opaque 3 12s
[root@k8s-master1 secrets]# kubectl get secret mysecret
NAME TYPE DATA AGE
mysecret Opaque 3 29s
[root@k8s-master1 secrets]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: JDEyMzQ1Nio=
password2: MWYyZDFlMmU2N2Rm
username: YWRtaW4y
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"password":"JDEyMzQ1Nio=","username":"YWRtaW4="},"kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"password2":"1f2d1e2e67df","username":"admin2"},"type":"Opaque"}
creationTimestamp: "2022-12-25T02:24:30Z"
name: mysecret
namespace: default
resourceVersion: "420410"
uid: a6a79a6c-07d9-49db-82ef-a0e2e8ee485a
type: Opaque
[root@k8s-master1 secrets]# echo "YWRtaW4y" | base64 --decode
admin2[root@k8s-master1 secrets]#
打赏