ConfigMap和Secret是Kubernetes中兩種特殊類型的存儲卷,ConfigMap這種資源對象主要用于提供配置數(shù)據(jù)以定制程序行為,不過一些敏感的配置信息,比如像用戶名、密碼、密鑰等通常都是由Secret這種資源對象來進(jìn)行配置的,他們將相應(yīng)的配置信息保存于對象中,而后在Pod資源上以存儲卷的形式將其掛載并獲取相應(yīng)配置,以實現(xiàn)配置與鏡像文件的解耦。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比石獅網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式石獅網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋石獅地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。
Secret資源對象存儲數(shù)據(jù)的方式是以鍵值對的方式進(jìn)行存儲的,在Pod資源進(jìn)行Secret的方式是通過環(huán)境變量或存儲卷的方式進(jìn)行訪問數(shù)據(jù),解決了密碼、token、密鑰等敏感數(shù)據(jù)的配置問題,而不需要將這些敏感數(shù)據(jù)暴露到鏡像或者Pod的spec字段中。另外,Secret對象的數(shù)據(jù)存儲和打印格式為Base64編碼的字符串,因此用戶在創(chuàng)建Secret對象時,也需要提供該類型的編碼格式的數(shù)據(jù)。在容器中以環(huán)境變量或存儲卷的方式訪問時,會自動解碼為明文格式。需要注意的是,如果是在Master節(jié)點上,Secret對象以非加密的格式存儲在etcd中,所以需要對etcd的管理和權(quán)限進(jìn)行嚴(yán)格控制。
Secret有四種類型:
1)Service Account :用來訪問Kubernetes API,由Kubernetes自動創(chuàng)建,并且會自動掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中;
2)Opaque :base64編碼格式的Secret,用來存儲密碼、密鑰、信息、證書等,類型標(biāo)識符為generic;
3)kubernetes.io/dockerconfigjson :用來存儲私有docker registry的認(rèn)證信息,類型標(biāo)識為docker-registry;
4)kubernetes.io/tls:用于為SSL通信模式存儲證書和私鑰文件,命令式創(chuàng)建類型標(biāo)識為tls;
假設(shè)存儲的數(shù)據(jù)是:
username:root
password:123.com
以下的存儲方式都是存儲該信息!
[root@master ~]# kubectl create secret generic mysecret01 --from-literal=username=root --from-literal=password=123.com
#創(chuàng)建一個secret資源對象,名稱為mysecret01,采用的加密方式是generic(通用的、一般的加密方式)
#注意:這種方式每一條只能保存一條信息
[root@master ~]# kubectl get secrets mysecret01
NAME TYPE DATA AGE
mysecret01 Opaque 2 25s
[root@master ~]# kubectl describe secrets mysecret01 #查看該資源的詳細(xì)信息
Name: mysecret01
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque #不透明的,看不到的
Data
====
password: 7 bytes #只能查看鍵的名稱,無法查看到鍵對應(yīng)的值
username: 4 bytes
[root@master ~]# kubectl get secrets mysecret01 -o yaml
#將該資源以yaml文件的方式進(jìn)行顯示
apiVersion: v1
data:
password: MTIzLmNvbQ== #鍵對應(yīng)的值都是亂碼,加密使用的是base64編碼格式
username: cm9vdA==
kind: Secret
metadata:
creationTimestamp: "2020-02-14T10:08:21Z"
name: mysecret01
namespace: default
resourceVersion: "2474"
selfLink: /api/v1/namespaces/default/secrets/mysecret01
uid: 1aee0635-7bfb-4e8a-a21e-be993e534156
type: Opaque
[root@master ~]# echo -n cm9vdAo= | base64 --d #將亂碼解碼后的結(jié)果
root
[root@master ~]# echo -n MTIzLmNvbQ== | base64 --d
123.com
這種方式更第一種方式差不多,可能稍微顯得麻煩一些!
[root@master ~]# echo root > username
[root@master ~]# echo 123.com > password
#需要先將要存儲的鍵值對寫入到文件中,并且每個文件只能寫入一個值
[root@master ~]# kubectl create secret generic mysecret02 --from-file=username --from-file=password
[root@master ~]# rm -rf username password
#即使文件刪除之后,該資源鍵對應(yīng)的值依然也是存在的
[root@master ~]# kubectl get secrets mysecret02
NAME TYPE DATA AGE
mysecret02 Opaque 2 58s
[root@master ~]# kubectl describe secrets mysecret02
Name: mysecret02
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 8 bytes
username: 5 bytes
這種方式可以在同一個文件中寫入多個鍵值對,推薦使用!
[root@master ~]# tee env.txt <<EOF #將多個需要存儲的鍵值寫入同一個文件中
username=root
password=123.com
EOF
[root@master ~]# kubectl create secret generic mysecret03 --from-env-file=env.txt
secret/mysecret03 created
[root@master ~]# kubectl get secrets mysecret03
NAME TYPE DATA AGE
mysecret03 Opaque 2 19s
[root@master ~]# kubectl describe secrets mysecret03
Name: mysecret03
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
username: 4 bytes
password: 7 bytes
[root@master ~]# echo root | base64 #需要將鍵對應(yīng)的值進(jìn)行加密
cm9vdAo=
[root@master ~]# echo 123.com | base64
MTIzLmNvbQo=
[root@master ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret04
data:
username: cm9vdAo= #將加密后的值寫到配置文件中
password: MTIzLmNvbQo=
[root@master ~]# kubectl apply -f secret.yaml
[root@master ~]# kubectl get secrets mysecret04
NAME TYPE DATA AGE
mysecret04 Opaque 2 118s
[root@master ~]# kubectl describe secrets mysecret04
Name: mysecret04
Namespace: default
Labels: <none>
Annotations:
Type: Opaque
Data
====
password: 8 bytes
username: 5 bytes
[root@master ~]# vim secret-pod01.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args:
- /bin/sh
- -c
- sleep 3000000 #以上字段僅僅是創(chuàng)建一個容器
volumeMounts:
- name: secret-test
mountPath: "/etc/secret-test" #指定容器中的目錄
readOnly: true #以只讀的方式掛載
volumes:
- name: secret-test
secret:
secretName: mysecret04 #指定的是已有的secret資源的名稱
[root@master ~]# kubectl apply -f secret-pod01.yaml
[root@master ~]# kubectl exec -it mypod /bin/sh #進(jìn)入容器
/ # cat -n /etc/secret-test/username /etc/secret-test/password #查看對應(yīng)的目錄是否存在數(shù)據(jù)
1 root
2 123.com
#而且是已經(jīng)解密后的數(shù)據(jù)
/ # echo 12324235532 > /etc/secret-test/username
/bin/sh: can't create /etc/secret-test/username: Read-only file system
現(xiàn)在,我們可以驗證一下,如果此時更改secret04的內(nèi)容,那么容器內(nèi)對應(yīng)的掛載目錄下的內(nèi)容是否更改?
[root@master ~]# echo zhangsan | base64
emhhbmdzYW4K
[root@master ~]# echo 123456 | base64
MTIzNDU2Cg==
[root@master ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret04
data:
username: emhhbmdzYW4K
password: MTIzNDU2Cg==
[root@master ~]# kubectl apply -f secret.yaml
[root@master ~]# kubectl exec -it mypod /bin/sh
/ # cat -n /etc/secret-test/username /etc/secret-test/password
1 zhangsan
2 123456
#再次查看容器中數(shù)據(jù),發(fā)現(xiàn)已經(jīng)發(fā)生了變化!
注意:如果采用volume掛載的方式調(diào)用secert存儲的值,容器內(nèi)的值會隨著secert存儲的值發(fā)生改變而變化!
[root@master ~]# vim secret-pod02.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: mypod
image: busybox
args:
- /bin/sh
- -c
- sleep 3000000
env: #設(shè)置環(huán)境變量
- name: SECRET_USERNAME #指容器中的變量名稱
valueFrom:
secretKeyRef:
name: mysecret02 #調(diào)用的是mysecret02
key: username #對應(yīng)的是mysecret02中username對應(yīng)的值
- name: SECRET_PASSWORD #同上
valueFrom:
secretKeyRef:
name: mysecret02
key: password
[root@master ~]# kubectl apply -f secret-pod02.yaml
[root@master ~]# kubectl exec -it mypod2 /bin/sh
/ # echo ${SECRET_USERNAME}
root
/ # echo ${SECRET_PASSWORD}
123.com
#進(jìn)入容器之后,查看變量對應(yīng)的值
注意:如果采用變量的方式調(diào)用secert存儲的值,容器內(nèi)的變量值并不會隨著secert存儲的值發(fā)生改變,除非重新生成pod。
我們知道,在幾乎所有的應(yīng)用開發(fā)中,都會涉及到配置文件的變更,比如說在web的程序中,需要連接數(shù)據(jù)庫,緩存甚至是隊列等等。而我們的一個應(yīng)用程序從寫第一行代碼開始,要經(jīng)歷開發(fā)環(huán)境、測試環(huán)境、預(yù)發(fā)布環(huán)境只到最終的線上環(huán)境。而每一個環(huán)境都要定義其獨立的各種配置。如果我們不能很好的管理這些配置文件,你的運維工作將頓時變的無比的繁瑣。為此業(yè)內(nèi)的一些大公司專門開發(fā)了自己的一套配置管理中心,如360的Qcon,百度的disconf等。kubernetes也提供了自己的一套方案,即ConfigMap。kubernetes通過ConfigMap來實現(xiàn)對容器中應(yīng)用的配置管理。
其實configMap和secert資源對象的創(chuàng)建方式完全一樣!
[root@master ~]# kubectl create configmap configmap01 --from-literal=username=root --from-literal=password=123.com
#創(chuàng)建一個configmap資源,名稱為configmap01
[root@master ~]# kubectl describe configmaps configmap01
Name: configmap01
Namespace: default
Labels: <none>
Annotations: <none>
Data #可以很明確的看出存儲的鍵對應(yīng)的值,所以一般用于存儲配置文件信息
====
password:
----
123.com
username:
----
root
Events: <none>
[root@master ~]# echo root > username
[root@master ~]# echo 123.com > password
[root@master ~]# kubectl create configmap configmap02 --from-file=username --from-file=password
configmap/configmap02 created
[root@master ~]# kubectl describe configmaps configmap02
Name: configmap02
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
password:
----
123.com
username:
----
root
Events: <none>
[root@master ~]# tee 123.txt <<EOF
> username=root
> password=123.com
> EOF
[root@master ~]# kubectl create configmap configmap03 --from-env-file=123.txt
configmap/configmap03 created
[root@master ~]# kubectl describe configmaps configmap03
Name: configmap03
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
username:
----
root
password:
----
123.com
Events: <none>
[root@master ~]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap04
data:
username: root #configmap使用yaml文件進(jìn)行創(chuàng)建時,鍵對應(yīng)的值無需事先加密
password: 123.com #對應(yīng)的值如果是數(shù)字,則需要單引號引起
[root@master ~]# kubectl apply -f configmap.yaml
[root@master ~]# kubectl describe configmaps configmap04
Name: configmap04
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","data":{"password":"123.com","username":"root"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"configmap04","n...
Data
====
password:
----
123.com
username:
----
root
Events: <none>
[root@master ~]# vim configmap-pod01.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod01
spec:
containers:
- name: configmap-pod01
image: busybox
args:
- /bin/sh
- -c
- sleep 3000000
volumeMounts:
- name: configmap-test
mountPath: "/etc/configmap-test"
readOnly: true
volumes:
- name: configmap-test
configMap:
name: configmap01
[root@master ~]# kubectl apply -f configmap-pod01.yaml
[root@master ~]# kubectl exec -it configmap-pod01 /bin/sh
/ # cat -n /etc/configmap-test/username /etc/configmap-test/password
1 root
2 123.com
ConfigMap資源采用volume掛載的方式,與Secret資源采用volume掛載的方式幾乎是一樣的,會隨著源數(shù)據(jù)的變化而變化!
[root@master ~]# vim configmap-pod02.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod02
spec:
containers:
- name: configmap-pod02
image: busybox
args:
- /bin/sh
- -c
- sleep 3000000
env:
- name: CONFIGMAP_USERNAME
valueFrom:
configMapKeyRef:
name: configmap04
key: username #調(diào)用的是configmap04中username的值
- name: CONFIGMAP_PASSWORD
valueFrom:
configMapKeyRef:
name: configmap04
key: password
[root@master ~]# kubectl apply -f configmap-pod02.yaml
[root@master ~]# kubectl exec -it configmap-pod02 /bin/sh
/ # echo ${CONFIGMAP_USERNAME}
root
/ # echo ${CONFIGMAP_PASSWORD}
123.com
ConfigMap資源采用環(huán)境變量的方式,與Secret資源采用變量變量的方式幾乎是一樣的,不會隨著源數(shù)據(jù)的變化!
都是用來保存輕量級信息的,可以供其他資源對象(Deployment、RC、RS和POd)進(jìn)行掛載使用。
這兩種資源對象的創(chuàng)建方法(4種)及引用方法(2種)都是一樣的,都是以鍵值對的方式進(jìn)行存儲的。
Secret是用來保存敏感信息的,而configMap是用來保存一些不太重要的數(shù)據(jù)的,具體表現(xiàn)在當(dāng)我們執(zhí)行“kubectl describe ....”命令時,Secret這種類型的資源對象時查看不到其具體的信息的,而configMap是可以查看到其保存的具體內(nèi)容的。
1)Secret、ConfigMap必須在Pod之前創(chuàng)建;
2)只有與當(dāng)前Secret、ConfigMap在同一個namespace內(nèi)的pod才能使用這個Secret、ConfigMap,換句話說,Secret、ConfigMap不能跨命名空間調(diào)用。
——————————本文到此結(jié)束,感謝閱讀————————————
當(dāng)前文章:Kubernetes數(shù)據(jù)持久化之Secret與ConfigM
本文路徑:http://muchs.cn/article34/jpdepe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、企業(yè)建站、網(wǎng)站制作、網(wǎng)站排名、、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)