目錄
一、Secret概述
二、Secret 三種類(lèi)型
2.1、Opaque
2..2、kubernetes.io/dockerconfigjson
2.3、kubernetes.io/service-account-token
三、Secret創(chuàng)建
3.1、命令行方式創(chuàng)建 Secret
3.2、yaml方式創(chuàng)建 Secret
四、Secret解碼
五、Secret使用
5.1、將 Secret 掛載到 Volume 中
5.2、將 Secret 設(shè)置為環(huán)境變量
5.3、通過(guò)volume掛載和設(shè)置為環(huán)境變量的區(qū)別
六、Secret刪除
一、Secret概述
Secret 解決了密碼、令牌、密鑰等敏感數(shù)據(jù)的配置問(wèn)題,而不需要把這些敏感數(shù)據(jù)暴露到鏡像或者Pod Spec 中,它把 Pod 想要訪問(wèn)的加密數(shù)據(jù)存放到 Etcd 中,然后用戶就可以通過(guò)在 Pod 的容器里掛載 Volume 的方式或者環(huán)境變量的方式訪問(wèn)到這些 Secret 里保存的信息。
二、Secret 三種類(lèi)型
2.1、Opaque
使用 base64 編碼存儲(chǔ)信息,手動(dòng)加密,用來(lái)存儲(chǔ)密碼、密鑰等,可以通過(guò) base64 --decode 解碼獲得原始數(shù)據(jù),因此安全性弱。
# base64編碼
$ echo "root" | base64
cm9vdAo=
# base64解碼
$ echo "cm9vdAo=" | base64 --decode
root
2..2、kubernetes.io/dockerconfigjson
用于存儲(chǔ)私有docker registry認(rèn)證的Secret。
下面是一個(gè)示例:
# 使用kubectl create secret命令創(chuàng)建Secret,指定docker私有倉(cāng)庫(kù)地址,用戶名、密碼等
kubectl create secret docker-registry habor-registry-secret --docker-server=xxx --docker-username=xxx --docker-password=xxx
如果我們需要拉取私有倉(cāng)庫(kù)中的docker鏡像的話,在Pod的資源清單中就需要引用前面定義好的habor-registry-secret這個(gè)Secret,例如:
apiVersion: v1
kind: Pod
metadata:
name: order-service
spec:
containers:
- name: order-service
image: 192.168.1.33:5000/order-service:v1.2
imagePullSecrets:
- name: habor-registry-secret
2.3、kubernetes.io/service-account-token
用于被 serviceaccount 引用,serviceaccout 創(chuàng)建時(shí) Kubernetes 會(huì)默認(rèn)創(chuàng)建對(duì)應(yīng)的 Secret。Pod 如果使用了 serviceaccount,對(duì)應(yīng)的 Secret 會(huì)自動(dòng)掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中。
下面是一個(gè)示例:
$ kubectl run nginx --image nginx
pod/nginx created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 12s
# 進(jìn)入nginx容器
$ kubectl exec -it nginx bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx:/# ls -l /run/secrets/kubernetes.io/serviceaccount
ca.crt namespace token
三、Secret創(chuàng)建
Secret的創(chuàng)建一般有兩種方式,一種是通過(guò)命令行方式【 kubectl create secret命令】,另外一種是使用yaml資源清單方式創(chuàng)建。
3.1、命令行方式創(chuàng)建 Secret
首先需要準(zhǔn)備Secret數(shù)據(jù)的來(lái)源,然后使用 kubectl create secret 命令將這些文件打包成一個(gè) Secret 并在 API 服務(wù)器上創(chuàng)建Secret對(duì)象,生成Secret后會(huì)自動(dòng)加密,而非明文存儲(chǔ)。
假如某個(gè)Pod要訪問(wèn)數(shù)據(jù)庫(kù),需要用戶名密碼,分別存放在2個(gè)文件中:username.txt,password.txt。
# -n參數(shù)確保生成的txt文件在文本末尾不包含額外的換行符,因?yàn)楫?dāng) kubectl 讀取文件并將內(nèi)容編碼為 base64 字符串時(shí),多余的換行符也會(huì)被編碼。
$ echo -n "admin" > ./username.txt
$ echo -n "123456" > ./password.txt
# 使用 kubectl create secret 命令將這些文件打包成一個(gè) Secret 并在 API 服務(wù)器上創(chuàng)建Secret對(duì)象
$ kubectl create secret generic db-account-secret --from-file=./username.txt --from-file=./password.txt
secret/db-account-secret created
# 查看secret,為了防止Secret被意外暴露,默認(rèn)不顯示Secret的內(nèi)容
$ kubectl get secret
NAME TYPE DATA AGE
db-account-secret Opaque 2 8s
# 通過(guò)yaml查看secret詳細(xì)信息
$ kubectl get secret db-account-secret -o yaml
apiVersion: v1
data: # secret中的key默認(rèn)就是txt文件名稱,可以看到這里是password.txt、password.txt
password.txt: MTIzNDU2 #secret保存的是base64加密后的數(shù)據(jù): 123456
password.txt: YWRtaW4= #secret保存的是base64加密后的數(shù)據(jù): admin
kind: Secret
metadata:
creationTimestamp: "2023-01-05T02:21:18Z"
name: db-account-secret
namespace: default
resourceVersion: "3212"
uid: a11caa2c-e7d7-4234-a20a-453cc05d565b
type: Opaque
# base64加密之后的數(shù)據(jù)
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '123456' | base64
MTIzNDU2
注意,Secret中的key默認(rèn)就是文件名稱,可以看到這里是password.txt、password.txt??梢允褂?--from-file=[key=]source 來(lái)設(shè)置密鑰名稱,例如:kubectl create secret generic db-account-secret --from-file=username=./username.txt --from-file=password=./password.txt。
我們還可以使用 --from-literal=<key>=<value> 標(biāo)簽提供 Secret 數(shù)據(jù)。 可以多次使用 --from-literal標(biāo)簽,提供多個(gè)鍵值對(duì)。 請(qǐng)注意,特殊字符(例如:$,\,*,= 和 !)由shell 解釋執(zhí)行,而且需要轉(zhuǎn)義,最簡(jiǎn)便的方法是用單引號(hào)括起來(lái)。 比如,如果你的密碼是$#123456=,可以像下面一樣執(zhí)行命令:
$ kubectl create secret generic db-secret-test --from-literal=username=admin --from-literal=password='$#123456='
secret/db-secret-test created
3.2、yaml方式創(chuàng)建 Secret
因?yàn)镾ecret保存的是base64加密后的數(shù)據(jù),所以使用yaml方式創(chuàng)建Secret的時(shí)候,我們需要準(zhǔn)備好base64加密之后的數(shù)據(jù),然后放到Secret的資源清單中。
# base64加密之后的數(shù)據(jù)
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '123456' | base64
MTIzNDU2
創(chuàng)建Secret資源清單文件: vim custom-db-account-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: custom-db-account-secret
type: Opaque
data:
username: YWRtaW4=
password: MTIzNDU2
創(chuàng)建Secret:
$ kubectl apply -f custom-db-account-secret.yaml
secret/custom-db-account-secret created
$ kubectl get secret/custom-db-account-secret
NAME TYPE DATA AGE
custom-db-account-secret Opaque 2 22s
# 查看Secret描述信息,為了防止Secret被意外暴露,默認(rèn)不顯示Secret的內(nèi)容
$ kubectl describe secret/custom-db-account-secret
Name: custom-db-account-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 6 bytes
username: 5 bytes
四、Secret解碼
為了防止Secret被意外暴露,默認(rèn)不顯示Secret的內(nèi)容,要查看我們創(chuàng)建的 Secret 的內(nèi)容,可以通過(guò)下面的方式。
$ kubectl get secret custom-db-account-secret -o jsonpath=‘{.data}’
‘{"password":"MTIzNDU2","username":"YWRtaW4="}’
$ echo "YWRtaW4=" | base64 -d
admin
$ echo "MTIzNDU2" | base64 -d
123456
五、Secret使用
Secret使用有兩種方式,一種是將Secret掛載到存儲(chǔ)卷volume中,另外一種是將Secret中的值,設(shè)置為Pod中的環(huán)境變量。
5.1、將 Secret 掛載到 Volume 中
創(chuàng)建Pod資源清單文件: vim secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/foo" # 將secret的數(shù)據(jù)掛載到pod容器中/etc/foo目錄下
readOnly: true
volumes:
- name: secret-volume
secret: # volume存儲(chǔ)卷的類(lèi)型為secret
secretName: custom-db-account-secret # 引用前面定義好的secret的名稱:custom-db-account-secret
創(chuàng)建Pod,然后進(jìn)入Pod中查看custom-db-account-secret中的數(shù)據(jù)是否掛載進(jìn)去。
$ kubectl apply -f secret-pod.yaml
pod/nginx created
$ kubectl get pod/nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 27s 192.168.1.3 node01 <none> <none>
$ kubectl exec -it nginx sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cd /etc/foo/
# ls
password username
# cat username
admin
# cat password
123456
可以看到,custom-db-account-secret中我們定義的username、password已經(jīng)成功掛載到pod容器中/etc/foo目錄下,并且數(shù)據(jù)也是解密之后的數(shù)據(jù)。
5.2、將 Secret 設(shè)置為環(huán)境變量
創(chuàng)建Pod資源清單文件: vim secret-env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
env:
- name: DB_USERNAME # 聲明環(huán)境變量DB_USERNAME
valueFrom:
secretKeyRef: # 指定數(shù)據(jù)來(lái)源是custom-db-account-secret這個(gè)secret的username字段
name: custom-db-account-secret
key: username
- name: DB_PASSWORD # 聲明環(huán)境變量DB_PASSWORD
valueFrom:
secretKeyRef: # 指定數(shù)據(jù)來(lái)源是custom-db-account-secret這個(gè)secret的password字段
name: custom-db-account-secret
key: password
restartPolicy: Never
創(chuàng)建Pod,并進(jìn)入Pod查看環(huán)境變量的值。
$ kubectl apply -f secret-env-pod.yaml
pod/nginx created
$ kubectl get pod/nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 14s 192.168.1.4 node01 <none> <none>
$ kubectl exec nginx -it sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# env | grep -E "USERNAME|PASSWORD"
DB_USERNAME=admin
DB_PASSWORD=123456
# echo $DB_USERNAME
admin
# echo $DB_PASSWORD
123456
如上可以看到,進(jìn)入Pod之后,已經(jīng)成功將custom-db-account-secret這個(gè)secret的username、password,對(duì)應(yīng)生成了$DB_USERNAME、$DB_PASSWORD兩個(gè)環(huán)境了,這樣在Pod中就可以使用這兩個(gè)環(huán)境變量了。
5.3、通過(guò)volume掛載和設(shè)置為環(huán)境變量的區(qū)別
通過(guò)Volume掛載到容器內(nèi)部時(shí),當(dāng)該Secret的值發(fā)生變化時(shí),容器內(nèi)部具備自動(dòng)更新的能力,但是通過(guò)環(huán)境變量設(shè)置到容器內(nèi)部該值不具備自動(dòng)更新的能力。所以一般推薦使用Volume掛載的方式使用Secret。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-626560.html
六、Secret刪除
使用【kubectl delete secret xxx】命令即可,xxx指定Secret的名稱。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-626560.html
$ kubectl get secret
NAME TYPE DATA AGE
custom-db-account-secret Opaque 2 44m
db-account-secret Opaque 2 54m
db-secret-test Opaque 2 12m
$ kubectl delete secret db-secret-test
secret "db-secret-test" deleted
$ kubectl get secret
NAME TYPE DATA AGE
custom-db-account-secret Opaque 2 44m
db-account-secret Opaque 2 55m
到了這里,關(guān)于7、Kubernetes核心技術(shù) - Secret的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!