在K8s中有Secret和configMap這兩種資源對象,這也是實現數據持久化的一種方式,與以前寫過的PV或掛載目錄等這些數據持久化的方式有些許不同。數據庫
Secret資源對象:能夠保存輕量的敏感信息,好比數據庫的用戶名和密碼或者認證祕鑰等。它保存的數據是以祕文的方式存放的vim
configMap資源對象:和Secret同樣,擁有大多數共同的特性,可是區別是,configMap保存的是一些不過重要的信息,它保存的數據是以明文的方式存放的。api
當咱們建立上述兩種資源對象時,其實就是將這兩種資源對象存儲的信息寫入了k8s羣集中的etcd數據中心。app
都是用來保存輕量級信息的,能夠供其餘資源對象(Deployment、RC、RS和POd)進行掛載使用。ide
這兩種資源對象的建立方法(4種)及引用方法(2種)都是同樣的,都是以鍵值對的方式進行存儲的。測試
Secret是用來保存敏感信息的,而configMap是用來保存一些不過重要的數據的,具體表如今當咱們執行「kubectl describe ....」命令時,Secret這種類型的資源對象時查看不到其具體的信息的,而configMap是能夠查看到其保存的具體內容的。加密
假設要存儲的數據是:
name:zhangsan
tel:15888888888spa
[root@master ~]# kubectl create secret generic secret 1 --from-literal=name=zhangsan --from-literal=tel=1588888888 [root@master ~]# kubectl get secrets secret1 #查看建立的secret1 NAME TYPE DATA AGE secret1 Opaque 2 89s [root@master ~]# kubectl describe secrets secret1 Name: secret1 Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== name: 8 bytes #能夠看到只能查看到其鍵的內容,而沒法看到鍵對應的值 tel: 10 bytes
這種方式比方法1還要麻煩一些,不建議使用。命令行
#須要先將要存儲的鍵值對寫入到文件中,而且每一個文件只能寫入一個值 [root@master ~]# echo zhangsan > name [root@master ~]# echo 15888888888 > tel [root@master ~]# cat name tel zhangsan 15888888888 [root@master ~]# kubectl create secret generic secret2 --from-file=name --from-file=tel #執行上述命令進行建立,而後使用方法1的命令自行查看便可
這種方式能夠在同一個文件中寫入多個鍵值對,推薦使用。code
[root@master ~]# cat > env.txt <<EOF #將要存儲的鍵值對寫入文件中 > name=zhangsan > tel=15888888888 > EOF [root@master ~]# kubectl create secret generic secert3 --from-env-file=env.txt #執行上述命令便可以env.txt中的鍵值對存入k8s的數據中心 #自行查看是否建立便可
#能夠將要存儲的值加密 [root@master ~]# echo zhangsan | base64 emhhbmdzYW4K [root@master ~]# echo 1588888888 | base64 MTU4ODg4ODg4OAo= [root@master ~]# vim secret.yaml #編寫yaml文件 apiVersion: v1 kind: Secret metadata: name: secret4 data: #下面的值是在命令行加密後的值 name: emhhbmdzYW4K tel: MTU4ODg4ODg4OAo= [root@master ~]# kubectl apply -f secret.yaml #執行yaml文件 #可使用下面的命令對加密字符進行解密 [root@master ~]# echo -n MTU4ODg4ODg4OAo= | base64 --decode 1588888888
既然secret的這種存儲方式是沒法經過命令行查看的,再一個就是,這種存儲方式的意義是什麼?經過下面的使用方式,應該就能夠明白其使用場景了。
[root@master ~]# vim secret-pod.yaml #編寫yaml文件,運行一個pod apiVersion: v1 kind: Pod metadata: name: secret-pod spec: containers: - name: secret-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 #以上字段和使用secret無關 volumeMounts: - name: test mountPath: /etc/test #指定掛載到容器內的目錄 readOnly: true #這裏決定了,是以只讀的方式掛載的 volumes: - name: test secret: secretName: secret4 #這裏指定secret的名字,也就是咱們使用第四種方法建立的secret [root@master ~]# kubectl apply -f secret-pod.yaml #執行yaml文件 [root@master ~]# kubectl exec -it secret-pod /bin/sh #進入建立的容器 / # cat /etc/test/name /etc/test/tel #查看掛載的目錄下 zhangsan 1588888888 #能夠發現自動給咱們解密了
如今,咱們能夠驗證一下,若是此時更改secret4的內容,那麼容器內對應的掛載目錄下的內容是否更改?
[root@master ~]# echo lisi | base64 bGlzaQo= [root@master ~]# echo 1599999999 | base64 MTU5OTk5OTk5OQo= [root@master ~]# vim secret.yaml #修改其內容 apiVersion: v1 kind: Secret metadata: name: secret4 data: name: bGlzaQo= tel: MTU5OTk5OTk5OQo= [root@master ~]# kubectl apply -f secret.yaml #從新執行yaml文件 [root@master ~]# kubectl exec -it secret-pod /bin/sh #再次進入容器 / # cat /etc/test/name /etc/test/tel #能夠看到容器內的數據也隨之改變了 lisi 1599999999
[root@master ~]# vim secret-pod.yaml #編寫yaml文件 apiVersion: v1 kind: Pod metadata: name: secret-pod spec: containers: - name: secret-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 env: #設置環境變量,這裏調用secert3存儲的值 - name: SECRET_NAME #容器內的變量名 valueFrom: secretKeyRef: name: secert3 #指定調用的是secert3 key: name #調用的是secert3的name對應的值 - name: SECRET_TEL #這裏的SECRET_TEL同上 valueFrom: secretKeyRef: name: secert3 key: tel [root@master ~]# kubectl delete -f secret-pod.yaml #刪除以前的pod [root@master ~]# kubectl apply -f secret-pod.yaml #從新生成pod #進入容器,輸出對應的變量 [root@master ~]# kubectl exec -it secret-pod /bin/sh / # echo $SECRET_NAME zhangsan / # echo $SECRET_TEL 15888888888
至此,以變量的形式引用secert存儲的鍵值對就調用完成了,一樣也能夠去測試修改secert存儲的值,看看pod容器中的變量是否會隨之改變,答案是否認的,若是採用變量的方式調用secert存儲的值,容器內的變量值並不會隨着secert存儲的值發生改變,除非從新生成pod。
其實configMap和secert資源對象的建立方式徹底同樣,這裏就寫下「--from-literal」、「--from-env-file」和「yaml文件」這三種建立方式,至於「--from-file」的建立方式,參考secert的建立方式便可。
[root@master ~]# kubectl create configmap config1 --from-literal=name=lisi --from-literal=age=18 #存儲名稱爲config1的鍵值對 [root@master ~]# kubectl describe configmaps config1 #查看建立的config1 Name: config1 Namespace: default Labels: <none> Annotations: <none> #能夠很明確的看到其中保存的數據,因此它用來存儲一些不過重要的數據 Data ==== age: ---- 18 name: ---- lisi Events: <none>
[root@master ~]# cat > config.txt <<EOF #將鍵值對寫入文件中 > name=lisi > age=18 > EOF [root@master ~]# kubectl create configmap configmap2 --from-env-file=config.txt #執行命令
[root@master ~]# vim configmap3.yaml #編寫yaml文件 apiVersion: v1 kind: ConfigMap metadata: name: configmap3 data: name: lisi age: '18' #若是值爲數字,則必需要用單引號引發來 [root@master ~]# kubectl apply -f configmap3.yaml #執行yaml文件
應用方式和secert資源對象的方式相似,都是volume掛載或者以變量的方式引用,只是一些yaml文件中的一些關鍵字不同。
[root@master ~]# kubectl delete -f secret-pod.yaml #刪除以前建立的pod [root@master ~]# vim secret-pod.yaml #修改yaml文件 apiVersion: v1 kind: Pod metadata: name: secret-pod spec: containers: - name: secret-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 #這上面沒有改變 volumeMounts: - name: test mountPath: /mnt #掛載到容器的mnt目錄 readOnly: true volumes: - name: test configMap: #這裏的關鍵字不同 name: configmap3 #掛載的是configmap3 [root@master ~]# kubectl apply -f secret-pod.yaml #執行yaml文件 [root@master ~]# kubectl exec -it secret-pod /bin/sh #進入容器 / # cat /mnt/name /mnt/age #查看掛載的內容 lisi18/ # (因爲使用的容器有些特殊,因此輸出格式上有些不太直觀,可是數據是沒錯的)
一樣,這種volume掛載的方式,pod容器內的數據會隨着configmap3的數據改變而改變,它們共享的是同一個文件。
[root@master ~]# kubectl delete -f secret-pod.yaml #刪除以前建立的pod [root@master ~]# vim secret-pod.yaml #修改yaml文件 apiVersion: v1 kind: Pod metadata: name: secret-pod spec: containers: - name: secret-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 env: #定義環境變量,這裏使用的是建立的configmap 2的鍵值對內容 - name: USER_NAME valueFrom: configMapKeyRef: name: configmap2 key: name #調用configmap2中的name的值 - name: USER_AGE valueFrom: configMapKeyRef: name: configmap2 key: age #調用configmap2中的age的值 [root@master ~]# kubectl apply -f secret-pod.yaml [root@master ~]# kubectl exec -it secret-pod /bin/sh #進入容器輸出環境變量 / # echo $USER_NAME lisi / # echo $USER_AGE 18
這裏測試一下,若是修改configmap2的鍵值對,容器內的環境變量是否會發生改變?
[root@master ~]# vim config.txt #修改configmap2的值 name=wangwu age=28 [root@master ~]# kubectl delete configmaps #須要先刪除 [root@master ~]# kubectl create configmap configmap2 --from-env-file=config.txt #再建立 [root@master ~]# kubectl exec -it secret-pod /bin/sh #進入容器輸出變量,能夠看到變量沒有改變 / # echo $USER_AGE 18 / # echo $USER_NAME lisi
那麼,如今從新生成下pod,查看其環境變量是否會改變(確定會改變的)?
[root@master ~]# kubectl delete -f secret-pod.yaml #刪除pod [root@master ~]# kubectl apply -f secret-pod.yaml #從新生成pod [root@master ~]# kubectl exec -it secret-pod /bin/sh #進入容器查看環境變量,發現已經改變了 / # echo $USER_NAME wangwu / # echo $USER_AGE 28
至此,驗證完成。
———————— 本文至此結束,感謝閱讀 ————————