k8s數(shù)據(jù)持久化之Secret和configMap

前言

在K8s中有Secret和configMap這兩種資源對象,這也是實(shí)現(xiàn)數(shù)據(jù)持久化的一種方式,與之前寫過的PV或掛載目錄等這些數(shù)據(jù)持久化的方式有些許不一樣。

創(chuàng)新互聯(lián)一直在為企業(yè)提供服務(wù),多年的磨煉,使我們在創(chuàng)意設(shè)計(jì),全網(wǎng)整合營銷推廣到技術(shù)研發(fā)擁有了開發(fā)經(jīng)驗(yàn)。我們擅長傾聽企業(yè)需求,挖掘用戶對產(chǎn)品需求服務(wù)價(jià)值,為企業(yè)制作有用的創(chuàng)意設(shè)計(jì)體驗(yàn)。核心團(tuán)隊(duì)擁有超過十年以上行業(yè)經(jīng)驗(yàn),涵蓋創(chuàng)意,策化,開發(fā)等專業(yè)領(lǐng)域,公司涉及領(lǐng)域有基礎(chǔ)互聯(lián)網(wǎng)服務(wù)眉山服務(wù)器托管app軟件開發(fā)公司、手機(jī)移動建站、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)整合營銷。

Secret資源對象:可以保存輕量的敏感信息,比如數(shù)據(jù)庫的用戶名和密碼或者認(rèn)證秘鑰等。它保存的數(shù)據(jù)是以秘文的方式存放的

configMap資源對象:和Secret一樣,擁有大多數(shù)共同的特性,但是區(qū)別是,configMap保存的是一些不太重要的信息,它保存的數(shù)據(jù)是以明文的方式存放的。

當(dāng)我們創(chuàng)建上述兩種資源對象時(shí),其實(shí)就是將這兩種資源對象存儲的信息寫入了k8s群集中的etcd數(shù)據(jù)中心。

一、secret和configMap的異同點(diǎn)

相同點(diǎn):

都是用來保存輕量級信息的,可以供其他資源對象(Deployment、RC、RS和POd)進(jìn)行掛載使用。

這兩種資源對象的創(chuàng)建方法(4種)及引用方法(2種)都是一樣的,都是以鍵值對的方式進(jìn)行存儲的。

不同點(diǎn):

Secret是用來保存敏感信息的,而configMap是用來保存一些不太重要的數(shù)據(jù)的,具體表現(xiàn)在當(dāng)我們執(zhí)行“kubectl describe ....”命令時(shí),Secret這種類型的資源對象時(shí)查看不到其具體的信息的,而configMap是可以查看到其保存的具體內(nèi)容的。

二、Secret資源對象的四種創(chuàng)建方式

創(chuàng)建方法1(通過--from-literal的方式)

假設(shè)要存儲的數(shù)據(jù)是:
name:zhangsan
tel:15888888888

[root@master ~]# kubectl create secret generic secret
1 --from-literal=name=zhangsan --from-literal=tel=1588888888
[root@master ~]# kubectl get secrets secret1  #查看創(chuàng)建的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       #可以看到只能查看到其鍵的內(nèi)容,而無法看到鍵對應(yīng)的值
tel:   10 bytes

創(chuàng)建方法2(通過--from-file的方式)

這種方式比方法1還要麻煩一些,不建議使用。

#需要先將要存儲的鍵值對寫入到文件中,并且每個(gè)文件只能寫入一個(gè)值
[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 
#執(zhí)行上述命令進(jìn)行創(chuàng)建,然后使用方法1的命令自行查看即可

創(chuàng)建方法3(通過--from-env-file的方式)

這種方式可以在同一個(gè)文件中寫入多個(gè)鍵值對,推薦使用。

[root@master ~]# cat > env.txt <<EOF  #將要存儲的鍵值對寫入文件中
> name=zhangsan
> tel=15888888888
> EOF
[root@master ~]# kubectl create secret generic secert3 --from-env-file=env.txt 
#執(zhí)行上述命令即可以env.txt中的鍵值對存入k8s的數(shù)據(jù)中心
#自行查看是否創(chuàng)建即可

創(chuàng)建方法4(通過yaml配置文件的方式)

#可以將要存儲的值加密
[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     #執(zhí)行yaml文件
#可以使用下面的命令對加密字符進(jìn)行解密
[root@master ~]# echo -n MTU4ODg4ODg4OAo= | base64 --decode 
1588888888

三、Secret的兩種使用方式

既然secret的這種存儲方式是無法通過命令行查看的,再一個(gè)就是,這種存儲方式的意義是什么?通過下面的使用方式,應(yīng)該就可以明白其使用場景了。

使用方法1(以volume掛載的方式使用secret)

[root@master ~]# vim secret-pod.yaml  #編寫yaml文件,運(yùn)行一個(gè)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無關(guān)
    volumeMounts:
    - name: test
      mountPath: /etc/test        #指定掛載到容器內(nèi)的目錄
      readOnly: true     #這里決定了,是以只讀的方式掛載的
  volumes:
  - name: test
    secret:
      secretName: secret4         #這里指定secret的名字,也就是我們使用第四種方法創(chuàng)建的secret

[root@master ~]# kubectl apply -f secret-pod.yaml     #執(zhí)行yaml文件
[root@master ~]# kubectl exec -it secret-pod /bin/sh   #進(jìn)入創(chuàng)建的容器
/ # cat /etc/test/name /etc/test/tel     #查看掛載的目錄下
zhangsan
1588888888
#可以發(fā)現(xiàn)自動給我們解密了

現(xiàn)在,我們可以驗(yàn)證一下,如果此時(shí)更改secret4的內(nèi)容,那么容器內(nèi)對應(yīng)的掛載目錄下的內(nèi)容是否更改?

[root@master ~]# echo lisi | base64
bGlzaQo=
[root@master ~]# echo 1599999999 | base64
MTU5OTk5OTk5OQo=
[root@master ~]# vim secret.yaml      #修改其內(nèi)容
apiVersion: v1
kind: Secret
metadata:
  name: secret4
data:
  name: bGlzaQo=
  tel: MTU5OTk5OTk5OQo=
[root@master ~]# kubectl apply -f secret.yaml     #重新執(zhí)行yaml文件
[root@master ~]# kubectl exec -it secret-pod /bin/sh   #再次進(jìn)入容器
/ # cat /etc/test/name /etc/test/tel     #可以看到容器內(nèi)的數(shù)據(jù)也隨之改變了
lisi
1599999999

使用方法2(以環(huán)境變量的方式使用secret)

[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:          #設(shè)置環(huán)境變量,這里調(diào)用secert3存儲的值
      - name: SECRET_NAME   #容器內(nèi)的變量名
        valueFrom:
          secretKeyRef:
            name: secert3         #指定調(diào)用的是secert3
            key: name                   #調(diào)用的是secert3的name對應(yīng)的值
      - 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
#進(jìn)入容器,輸出對應(yīng)的變量
[root@master ~]# kubectl exec -it secret-pod /bin/sh
/ # echo $SECRET_NAME
zhangsan
/ # echo $SECRET_TEL
15888888888

至此,以變量的形式引用secert存儲的鍵值對就調(diào)用完成了,同樣也可以去測試修改secert存儲的值,看看pod容器中的變量是否會隨之改變,答案是否定的,如果采用變量的方式調(diào)用secert存儲的值,容器內(nèi)的變量值并不會隨著secert存儲的值發(fā)生改變,除非重新生成pod。

四、configMap資源對象的四種創(chuàng)建方式

其實(shí)configMap和secert資源對象的創(chuàng)建方式完全一樣,這里就寫下“--from-literal”、“--from-env-file”和“yaml文件”這三種創(chuàng)建方式,至于“--from-file”的創(chuàng)建方式,參考secert的創(chuàng)建方式即可。

創(chuàng)建方法1(通過--from-literal的方式)

[root@master ~]# kubectl create configmap config1 --from-literal=name=lisi --from-literal=age=18
#存儲名稱為config1的鍵值對
[root@master ~]# kubectl describe configmaps config1   #查看創(chuàng)建的config1
Name:         config1
Namespace:    default
Labels:       <none>
Annotations:  <none>
#可以很明確的看到其中保存的數(shù)據(jù),所以它用來存儲一些不太重要的數(shù)據(jù)
Data
====
age:
----
18
name:
----
lisi
Events:  <none>

創(chuàng)建方法2(通過--from-env-file的方式)

[root@master ~]# cat > config.txt <<EOF   #將鍵值對寫入文件中
> name=lisi
> age=18
> EOF
[root@master ~]# kubectl create configmap configmap2 --from-env-file=config.txt 
#執(zhí)行命令

創(chuàng)建方法3(通過yaml配置文件的方式)

[root@master ~]# vim configmap3.yaml #編寫yaml文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap3
data:
  name: lisi
  age: '18'       #如果值為數(shù)字,則必須要用單引號引起來
[root@master ~]# kubectl apply -f configmap3.yaml     #執(zhí)行yaml文件

五、configMap數(shù)據(jù)的兩種引用方式

應(yīng)用方式和secert資源對象的方式類似,都是volume掛載或者以變量的方式引用,只是一些yaml文件中的一些關(guān)鍵字不一樣。

引用方法1(通過volume掛載)

[root@master ~]# kubectl delete -f secret-pod.yaml    #刪除之前創(chuàng)建的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:             #這里的關(guān)鍵字不一樣
      name: configmap3         #掛載的是configmap3
[root@master ~]# kubectl apply -f secret-pod.yaml      #執(zhí)行yaml文件
[root@master ~]# kubectl exec -it secret-pod /bin/sh  #進(jìn)入容器
/ # cat /mnt/name /mnt/age    #查看掛載的內(nèi)容
lisi18/ # 
(由于使用的容器有些特殊,所以輸出格式上有些不太直觀,但是數(shù)據(jù)是沒錯的)

同樣,這種volume掛載的方式,pod容器內(nèi)的數(shù)據(jù)會隨著configmap3的數(shù)據(jù)改變而改變,它們共享的是同一個(gè)文件。

引用方法2(通過配置env環(huán)境變量)

[root@master ~]# kubectl delete -f secret-pod.yaml    #刪除之前創(chuàng)建的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:           #定義環(huán)境變量,這里使用的是創(chuàng)建的configmap
        2的鍵值對內(nèi)容
      - name: USER_NAME
        valueFrom:
          configMapKeyRef:
            name: configmap2
            key: name      #調(diào)用configmap2中的name的值
      - name: USER_AGE
        valueFrom:
          configMapKeyRef:
            name: configmap2
            key: age      #調(diào)用configmap2中的age的值
[root@master ~]# kubectl apply -f secret-pod.yaml 
[root@master ~]# kubectl exec -it secret-pod /bin/sh    #進(jìn)入容器輸出環(huán)境變量
/ # echo $USER_NAME
lisi
/ # echo $USER_AGE
18

這里測試一下,如果修改configmap2的鍵值對,容器內(nèi)的環(huán)境變量是否會發(fā)生改變?

[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       #再創(chuàng)建
[root@master ~]# kubectl exec -it secret-pod /bin/sh #進(jìn)入容器輸出變量,可以看到變量沒有改變
/ # echo $USER_AGE
18
/ # echo $USER_NAME
lisi

那么,現(xiàn)在重新生成下pod,查看其環(huán)境變量是否會改變(肯定會改變的)?

[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   #進(jìn)入容器查看環(huán)境變量,發(fā)現(xiàn)已經(jīng)改變了
/ # echo $USER_NAME
wangwu
/ # echo $USER_AGE
28

至此,驗(yàn)證完成。

———————— 本文至此結(jié)束,感謝閱讀 ————————

分享名稱:k8s數(shù)據(jù)持久化之Secret和configMap
當(dāng)前鏈接:http://bm7419.com/article24/iippce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司、軟件開發(fā)App開發(fā)、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名