通常我們?cè)跇?gòu)建應(yīng)用(Pod)時(shí),總會(huì)傳遞一些敏感信息到Pod 的容器內(nèi)晴氨。比如建立數(shù)據(jù)庫(kù)的用戶名、密碼等碉输。這些信息保存在Docker的鏡像里總不太靈活籽前。這時(shí)候我們就可以使用Kubernetes 的Secret 。
Secret的特點(diǎn)是以密文方式存儲(chǔ)數(shù)據(jù)敷钾,避免直接在配置文件中保存敏感信息枝哄,Secret會(huì)以Volume的形式被mount到Pod,容器可以通過(guò)文件又或者是環(huán)境變量的方式使用Secret中的敏感數(shù)據(jù)阻荒。
使用Secret
- 通過(guò)--form-literal
#創(chuàng)建一個(gè)叫form-secret 的secret 挠锥,并且添加兩個(gè)鍵(account、password)侨赡,值為(admin蓖租、123456)
ubuntu@server:~$ sudo kubectl create secret generic form-secret --from-literal=account=admin --from-literal=password=123456
secret/form-secret created
#驗(yàn)證form-secret是否創(chuàng)建成功
ubuntu@server:~$ sudo kubectl get secret
NAME TYPE DATA AGE
default-token-2tjxh kubernetes.io/service-account-token 3 38d
form-secret Opaque 2 18m
- 通過(guò) --from-file
#先創(chuàng)建account.dat 和password.dat 文件
ubuntu@server:~$ echo 'file-account' >> account.dat
ubuntu@server:~$ echo 'abcdefg' >> password.dat
#創(chuàng)建一個(gè)叫file-secret 的secret ,把a(bǔ)ccount.dat 和password.dat 文件導(dǎo)進(jìn)去羊壹。
ubuntu@server:~$ sudo kubectl create secret generic file-secret --from-file=account.dat --from-file=password.dat
secret/file-secret created
- 通過(guò)--from-env
#創(chuàng)建文件 vim secret-env.dat
#secret-env.dat. 內(nèi)容
account=env-account
password=654321
#把secret-env.dat 導(dǎo)進(jìn)去
ubuntu@server:~$ sudo kubectl create secret generic secret-env --from-env-file=secret-env.dat
secret/secret-env created
- 通過(guò)yaml 文件引入
#首先需要把值轉(zhuǎn)換成base64
echo -n yamlAdmin|base64
eWFtbEFkbWlu
echo -n 222222|base64
MjIyMjIy
#創(chuàng)建文件vim secret-file.yaml
#secret-file.yaml 內(nèi)容
apiVersion: v1
kind: Secret
metadata:
name: yaml-secret
data:
account: eWFtbEFkbWlu
password: MjIyMjIy
引入
ubuntu@server:~$ sudo kubectl apply -f secret-file.yaml
secret/yaml-secret created
查看Secret
#查看已經(jīng)創(chuàng)建的Secret 列表
ubuntu@server:~$ sudo kubectl get secrets
NAME TYPE DATA AGE
default-token-2tjxh kubernetes.io/service-account-token 3 39d
form-secret Opaque 2 3h56m
file-secret Opaque 2 3h34m
yaml-secret Opaque 2 42s
#查看某一個(gè)Secret
ubuntu@server:~$ sudo kubectl describe secret yaml-secret
Name: yaml-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 6 bytes
account: 9 bytes
在Pod中使用Secret
1蓖宦、通過(guò)Volume 獲得Secret
#vim secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: secret-pod
image: busybox
args:
- /bin/sh
- -c
- sleep 10;sleep 300000
volumeMounts:
- name: volume
mountPath: "/etc/volume" #將volume mount到容器路徑/etc/volume
volumes:
- name: volume
secret:
secretName: yaml-secret
引入并且查看結(jié)果
#引入并創(chuàng)建Pod
ubuntu@server:~$ sudo kubectl apply -f secret-pod.yaml
pod/secret-pod created
#進(jìn)入到容器內(nèi)部
ubuntu@server:~$ sudo kubectl exec -it secret-pod /bin/sh
/etc/volume # ls /etc/volume/
account password
#執(zhí)行如下命令并查看結(jié)果
cat /etc/volume/account
#結(jié)果
yamlAdmin
cat /etc/volume/password
#結(jié)果
222222
結(jié)果:Kubenetes會(huì)在指定的路徑/etc/volume 下為每條敏感數(shù)據(jù)創(chuàng)建一個(gè)文件,以明文存放在文件中油猫。
當(dāng)Secret 有需要更新時(shí)稠茂,可以通過(guò)如下命令進(jìn)行更新。 更新后將會(huì)自動(dòng)反饋到Pod容器內(nèi)情妖。
#獲得gg2022 的base64值
ubuntu@server:~$ echo -n gg2022|base64
Z2cyMDIy
#vi secret-file.yaml
apiVersion: v1
kind: Secret
metadata:
name: yaml-secret
data:
account: eWFtbEFkbWlu
password: Z2cyMDIy #這里把Z2cyMDIy 賦值到password里
#重新引入到Pod
ubuntu@server:~$ sudo kubectl apply -f secret-file.yaml
secret/yaml-secret configured
#大約數(shù)秒后睬关,我們?cè)龠M(jìn)入到容器去查看結(jié)果
ubuntu@server:/etc$ sudo kubectl exec -it secret-pod /bin/sh
cat /etc/volume/password
#輸出的結(jié)果已經(jīng)變?yōu)間g2022
gg2022
2诱担、通過(guò)環(huán)境變量讀取Secret
#vim env-pod.yaml
#env-pod 的內(nèi)容
apiVersion: v1
kind: Pod
metadata:
name: env-pod
spec:
containers:
- name: env-pod
image: busybox
args:
- /bin/sh
- -c
- sleep 10; sleep 300000
env:
- name: SECRET_ACCOUNT
valueFrom:
secretKeyRef:
name: yaml-secret
key: account
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: yaml-secret
key: password
對(duì)env-pod.yaml 文件進(jìn)行引入并創(chuàng)建Pod
ubuntu@server:~$ sudo kubectl apply -f env-pod.yaml
pod/env-pod created
進(jìn)入到Pod容器內(nèi),讀取自動(dòng)加載好的環(huán)境變量
ubuntu@server:~$ sudo kubectl exec -it env-pod /bin/sh
#讀取環(huán)境變量的值
echo $SECRET_ACCOUNT
yamlAdmin
echo $SECRET_PASSWORD
gg2022
在實(shí)際場(chǎng)景中电爹,我會(huì)偏向通過(guò)yaml方式創(chuàng)建Secret蔫仙。
除了Secret,Kubenetes 還提供了ConfigMap的方式來(lái)創(chuàng)建容器數(shù)據(jù)藐不。ConfigMap 與Secret 的用法非常相似匀哄,區(qū)別點(diǎn)在于ConfigMap可以通過(guò)明文方式存儲(chǔ)數(shù)據(jù),適合存放非敏感數(shù)據(jù)雏蛮,例如配置信息涎嚼。
基于兩者用法是一致,只是命令的關(guān)鍵字不同挑秉,此文就不再詳述ConfigMap的用法法梯。