您好,登錄后才能下訂單哦!
在K8s中有Secret和configMap這兩種資源對象,這也是實現數據持久化的一種方式,與之前寫過的PV或掛載目錄等這些數據持久化的方式有些許不一樣。
Secret資源對象:可以保存輕量的敏感信息,比如數據庫的用戶名和密碼或者認證秘鑰等。它保存的數據是以秘文的方式存放的
configMap資源對象:和Secret一樣,擁有大多數共同的特性,但是區別是,configMap保存的是一些不太重要的信息,它保存的數據是以明文的方式存放的。
當我們創建上述兩種資源對象時,其實就是將這兩種資源對象存儲的信息寫入了k8s群集中的etcd數據中心。
都是用來保存輕量級信息的,可以供其他資源對象(Deployment、RC、RS和POd)進行掛載使用。
這兩種資源對象的創建方法(4種)及引用方法(2種)都是一樣的,都是以鍵值對的方式進行存儲的。
Secret是用來保存敏感信息的,而configMap是用來保存一些不太重要的數據的,具體表現在當我們執行“kubectl describe ....”命令時,Secret這種類型的資源對象時查看不到其具體的信息的,而configMap是可以查看到其保存的具體內容的。
假設要存儲的數據是:
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 #查看創建的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的命令自行查看即可
這種方式可以在同一個文件中寫入多個鍵值對,推薦使用。
[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
至此,驗證完成。
———————— 本文至此結束,感謝閱讀 ————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。