溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Kubernetes數(shù)據(jù)持久化之Secret與ConfigM

發(fā)布時(shí)間:2020-08-09 13:37:05 來(lái)源:網(wǎng)絡(luò) 閱讀:138 作者:筱振 欄目:云計(jì)算

ConfigMap和Secret是Kubernetes中兩種特殊類(lèi)型的存儲(chǔ)卷,ConfigMap這種資源對(duì)象主要用于提供配置數(shù)據(jù)以定制程序行為,不過(guò)一些敏感的配置信息,比如像用戶(hù)名、密碼、密鑰等通常都是由Secret這種資源對(duì)象來(lái)進(jìn)行配置的,他們將相應(yīng)的配置信息保存于對(duì)象中,而后在Pod資源上以存儲(chǔ)卷的形式將其掛載并獲取相應(yīng)配置,以實(shí)現(xiàn)配置與鏡像文件的解耦。

一、Secret資源對(duì)象

1) Secret概述

Secret資源對(duì)象存儲(chǔ)數(shù)據(jù)的方式是以鍵值對(duì)的方式進(jìn)行存儲(chǔ)的,在Pod資源進(jìn)行Secret的方式是通過(guò)環(huán)境變量或存儲(chǔ)卷的方式進(jìn)行訪(fǎng)問(wèn)數(shù)據(jù),解決了密碼、token、密鑰等敏感數(shù)據(jù)的配置問(wèn)題,而不需要將這些敏感數(shù)據(jù)暴露到鏡像或者Pod的spec字段中。另外,Secret對(duì)象的數(shù)據(jù)存儲(chǔ)和打印格式為Base64編碼的字符串,因此用戶(hù)在創(chuàng)建Secret對(duì)象時(shí),也需要提供該類(lèi)型的編碼格式的數(shù)據(jù)。在容器中以環(huán)境變量或存儲(chǔ)卷的方式訪(fǎng)問(wèn)時(shí),會(huì)自動(dòng)解碼為明文格式。需要注意的是,如果是在Master節(jié)點(diǎn)上,Secret對(duì)象以非加密的格式存儲(chǔ)在etcd中,所以需要對(duì)etcd的管理和權(quán)限進(jìn)行嚴(yán)格控制。

2)Secret資源的類(lèi)型

Secret有四種類(lèi)型:
1)Service Account :用來(lái)訪(fǎng)問(wèn)Kubernetes API,由Kubernetes自動(dòng)創(chuàng)建,并且會(huì)自動(dòng)掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中;
2)Opaque :base64編碼格式的Secret,用來(lái)存儲(chǔ)密碼、密鑰、信息、證書(shū)等,類(lèi)型標(biāo)識(shí)符為generic;
3)kubernetes.io/dockerconfigjson :用來(lái)存儲(chǔ)私有docker registry的認(rèn)證信息,類(lèi)型標(biāo)識(shí)為docker-registry;
4)kubernetes.io/tls:用于為SSL通信模式存儲(chǔ)證書(shū)和私鑰文件,命令式創(chuàng)建類(lèi)型標(biāo)識(shí)為tls;

3)創(chuàng)建Secret的方式

假設(shè)存儲(chǔ)的數(shù)據(jù)是:
username:root
password:123.com
以下的存儲(chǔ)方式都是存儲(chǔ)該信息!

1)使用--from-literal(文字)的方式
[root@master ~]# kubectl create secret generic mysecret01 --from-literal=username=root --from-literal=password=123.com
#創(chuàng)建一個(gè)secret資源對(duì)象,名稱(chēng)為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                     #只能查看鍵的名稱(chēng),無(wú)法查看到鍵對(duì)應(yīng)的值
username:  4 bytes
[root@master ~]# kubectl get secrets mysecret01 -o yaml            
#將該資源以yaml文件的方式進(jìn)行顯示
apiVersion: v1
data:
  password: MTIzLmNvbQ==                       #鍵對(duì)應(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
2)使用--from-file(文件)的方式

這種方式更第一種方式差不多,可能稍微顯得麻煩一些!

[root@master ~]# echo root > username
[root@master ~]# echo 123.com > password
#需要先將要存儲(chǔ)的鍵值對(duì)寫(xiě)入到文件中,并且每個(gè)文件只能寫(xiě)入一個(gè)值
[root@master ~]# kubectl create secret generic mysecret02 --from-file=username --from-file=password
[root@master ~]# rm -rf username password              
#即使文件刪除之后,該資源鍵對(duì)應(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
3)通過(guò) --from-env-file(環(huán)境變量)的方式

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

[root@master ~]# tee  env.txt <<EOF            #將多個(gè)需要存儲(chǔ)的鍵值寫(xiě)入同一個(gè)文件中
 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
4)通過(guò)yaml文件的方式
 [root@master ~]# echo root | base64                  #需要將鍵對(duì)應(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=                            #將加密后的值寫(xiě)到配置文件中
  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

4)Secret資源的使用方式

1)以volume掛載的方式使用
[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)建一個(gè)容器
    volumeMounts:
    - name: secret-test
      mountPath: "/etc/secret-test"                  #指定容器中的目錄
      readOnly: true                                         #以只讀的方式掛載
  volumes:
  - name: secret-test
    secret:
      secretName: mysecret04          #指定的是已有的secret資源的名稱(chēng)
[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     #查看對(duì)應(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)在,我們可以驗(yàn)證一下,如果此時(shí)更改secret04的內(nèi)容,那么容器內(nèi)對(duì)應(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存儲(chǔ)的值,容器內(nèi)的值會(huì)隨著secert存儲(chǔ)的值發(fā)生改變而變化!

2)用環(huán)境變量的方式運(yùn)行
[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               #指容器中的變量名稱(chēng)
        valueFrom:
          secretKeyRef:
            name: mysecret02                 #調(diào)用的是mysecret02 
            key: username                       #對(duì)應(yīng)的是mysecret02中username對(duì)應(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)入容器之后,查看變量對(duì)應(yīng)的值

注意:如果采用變量的方式調(diào)用secert存儲(chǔ)的值,容器內(nèi)的變量值并不會(huì)隨著secert存儲(chǔ)的值發(fā)生改變,除非重新生成pod。

二、ConfigMap資源對(duì)象

1)ConfigMap概述

我們知道,在幾乎所有的應(yīng)用開(kāi)發(fā)中,都會(huì)涉及到配置文件的變更,比如說(shuō)在web的程序中,需要連接數(shù)據(jù)庫(kù),緩存甚至是隊(duì)列等等。而我們的一個(gè)應(yīng)用程序從寫(xiě)第一行代碼開(kāi)始,要經(jīng)歷開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、預(yù)發(fā)布環(huán)境只到最終的線(xiàn)上環(huán)境。而每一個(gè)環(huán)境都要定義其獨(dú)立的各種配置。如果我們不能很好的管理這些配置文件,你的運(yùn)維工作將頓時(shí)變的無(wú)比的繁瑣。為此業(yè)內(nèi)的一些大公司專(zhuān)門(mén)開(kāi)發(fā)了自己的一套配置管理中心,如360的Qcon,百度的disconf等。kubernetes也提供了自己的一套方案,即ConfigMap。kubernetes通過(guò)ConfigMap來(lái)實(shí)現(xiàn)對(duì)容器中應(yīng)用的配置管理。

2)ConfigMap的創(chuàng)建方式

其實(shí)configMap和secert資源對(duì)象的創(chuàng)建方式完全一樣!

1)通過(guò)--from-literal的方式
[root@master ~]# kubectl create configmap configmap01 --from-literal=username=root --from-literal=password=123.com
#創(chuàng)建一個(gè)configmap資源,名稱(chēng)為configmap01
[root@master ~]# kubectl describe configmaps configmap01 
Name:         configmap01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data      #可以很明確的看出存儲(chǔ)的鍵對(duì)應(yīng)的值,所以一般用于存儲(chǔ)配置文件信息
====
password:
----
123.com
username:
----
root
Events:  <none>
2)通過(guò)--from-file的方式
[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>
3)通過(guò)--from-env-file的方式
[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>
4)通過(guò)yaml文件的方式
[root@master ~]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap04
data: 
  username: root                       #configmap使用yaml文件進(jìn)行創(chuàng)建時(shí),鍵對(duì)應(yīng)的值無(wú)需事先加密
  password: 123.com                     #對(duì)應(yīng)的值如果是數(shù)字,則需要單引號(hào)引起
[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>

3)ConfigMap的使用方式

1)以volume掛載的方式使用
[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掛載的方式幾乎是一樣的,會(huì)隨著源數(shù)據(jù)的變化而變化!

2)用環(huán)境變量的方式運(yùn)行
[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資源采用變量變量的方式幾乎是一樣的,不會(huì)隨著源數(shù)據(jù)的變化!

三、Secret與ConfigMap的異同點(diǎn)

1)相同點(diǎn)

都是用來(lái)保存輕量級(jí)信息的,可以供其他資源對(duì)象(Deployment、RC、RS和POd)進(jìn)行掛載使用。
這兩種資源對(duì)象的創(chuàng)建方法(4種)及引用方法(2種)都是一樣的,都是以鍵值對(duì)的方式進(jìn)行存儲(chǔ)的。

2)不同點(diǎn)

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

3)注意事項(xiàng)

1)Secret、ConfigMap必須在Pod之前創(chuàng)建;
2)只有與當(dāng)前Secret、ConfigMap在同一個(gè)namespace內(nèi)的pod才能使用這個(gè)Secret、ConfigMap,換句話(huà)說(shuō),Secret、ConfigMap不能跨命名空間調(diào)用。

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI