K8s Pod 多種數(shù)據(jù)存儲(chǔ)方式
由于容器的生命周期可能很短,會(huì)被頻繁地創(chuàng)建和銷毀。那么容器在銷毀時(shí),保存在容器中的數(shù)據(jù)也會(huì)被清除。這種結(jié)果對(duì)用戶來(lái)說(shuō),在某些情況下是不樂(lè)意看到的。為了持久化保存容器的數(shù)據(jù),kubernetes引入了Volume的概念。
Volume是Pod中能夠被多個(gè)容器訪問(wèn)的共享目錄,它被定義在Pod上,然后被一個(gè)Pod里的多個(gè)容器掛載到具體的文件目錄下,kubernetes通過(guò)Volume實(shí)現(xiàn)同一個(gè)Pod中不同容器之間的數(shù)據(jù)共享以及數(shù)據(jù)的持久化存儲(chǔ)。Volume的生命容器不與Pod中單個(gè)容器的生命周期相關(guān),當(dāng)容器終止或者重啟時(shí),Volume中的數(shù)據(jù)也不會(huì)丟失。
kubernetes的Volume支持多種類型,比較常見的有下面幾個(gè):
-
簡(jiǎn)單存儲(chǔ):EmptyDir、HostPath、NFS
-
高級(jí)存儲(chǔ):PV、PVC
-
配置存儲(chǔ):ConfigMap、Secret
基本存儲(chǔ)
EmptyDir
EmptyDir是最基礎(chǔ)的Volume類型,一個(gè)EmptyDir就是Host上的一個(gè)空目錄。
EmptyDir是在Pod被分配到Node時(shí)創(chuàng)建的,它的初始內(nèi)容為空,并且無(wú)須指定宿主機(jī)上對(duì)應(yīng)的目錄文件,因?yàn)閗ubernetes會(huì)自動(dòng)分配一個(gè)目錄,當(dāng)Pod銷毀時(shí), EmptyDir中的數(shù)據(jù)也會(huì)被永久刪除。 EmptyDir用途如下:
-
臨時(shí)空間,例如用于某些應(yīng)用程序運(yùn)行時(shí)所需的臨時(shí)目錄,且無(wú)須永久保留
-
一個(gè)容器需要從另一個(gè)容器中獲取數(shù)據(jù)的目錄(多容器共享目錄)
接下來(lái),通過(guò)一個(gè)容器之間文件共享的案例來(lái)使用一下EmptyDir。
在一個(gè)Pod中準(zhǔn)備兩個(gè)容器nginx和busybox,然后聲明一個(gè)Volume分別掛在到兩個(gè)容器的目錄中,然后nginx容器負(fù)責(zé)向Volume中寫日志,busybox中通過(guò)命令將日志內(nèi)容讀到控制臺(tái)。

創(chuàng)建一個(gè)volume-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-emptydir
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.18.0
ports:
- containerPort: 80
volumeMounts: # 將logs-volume掛在到nginx容器中,對(duì)應(yīng)的目錄為 /var/log/nginx
- name: logs-volume
mountPath: /var/log/nginx
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","tail -f /logs/access.log"] # 初始命令,動(dòng)態(tài)讀取指定文件中內(nèi)容
volumeMounts: # 將logs-volume 掛在到busybox容器中,對(duì)應(yīng)的目錄為 /logs
- name: logs-volume
mountPath: /logs
volumes: # 聲明volume, name為logs-volume,類型為emptyDir
- name: logs-volume
emptyDir: {}
# 創(chuàng)建Pod
[root@k8s-master01 ~]# kubectl create -f volume-emptydir.yaml
pod/volume-emptydir created
# 查看pod
[root@k8s-master01 ~]# kubectl get pods volume-emptydir -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE ......
volume-emptydir 2/2 Running 0 97s 10.42.2.9 node1 ......
# 通過(guò)podIp訪問(wèn)nginx
[root@k8s-master01 ~]# curl 10.42.2.9
......
# 通過(guò)kubectl logs命令查看指定容器的標(biāo)準(zhǔn)輸出
[root@k8s-master01 ~]# kubectl logs -f volume-emptydir -n dev -c busybox
10.42.1.0 - - [27/Jun/2024:15:08:54 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
HostPath
因?yàn)镋mptyDir中數(shù)據(jù)不會(huì)被持久化,它會(huì)隨著Pod的結(jié)束而銷毀,如果想簡(jiǎn)單的將數(shù)據(jù)持久化到主機(jī)中,可以選擇HostPath。
HostPath就是將Node主機(jī)中一個(gè)實(shí)際目錄掛在到Pod中,以供容器使用,這樣的設(shè)計(jì)就可以保證Pod銷毀了,但是數(shù)據(jù)依據(jù)可以存在于Node主機(jī)上。

創(chuàng)建一個(gè)volume-hostpath.yaml:
apiVersion: v1
kind: Pod
metadata:
name: volume-hostpath
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.18.0
ports:
- containerPort: 80
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","tail -f /logs/access.log"]
volumeMounts:
- name: logs-volume
mountPath: /logs
volumes:
- name: logs-volume
hostPath:
path: /root/logs
type: DirectoryOrCreate # 目錄存在就使用,不存在就先創(chuàng)建后使用
關(guān)于type的值的一點(diǎn)說(shuō)明:
DirectoryOrCreate 目錄存在就使用,不存在就先創(chuàng)建后使用
Directory 目錄必須存在
FileOrCreate 文件存在就使用,不存在就先創(chuàng)建后使用
File 文件必須存在
Socket unix套接字必須存在
CharDevice 字符設(shè)備必須存在
BlockDevice 塊設(shè)備必須存在
# 創(chuàng)建Pod
[root@k8s-master01 ~]# kubectl create -f volume-hostpath.yaml
pod/volume-hostpath created
# 查看Pod
[root@k8s-master01 ~]# kubectl get pods volume-hostpath -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE ......
pod-volume-hostpath 2/2 Running 0 16s 10.42.2.10 node1 ......
#訪問(wèn)nginx
[root@k8s-master01 ~]# curl 10.42.2.10
# 接下來(lái)就可以去host的/root/logs目錄下查看存儲(chǔ)的文件了
### 注意: 下面的操作需要到Pod所在的節(jié)點(diǎn)運(yùn)行(案例中是node1)
[root@node1 ~]# ls /root/logs/
access.log error.log
# 同樣的道理,如果在此目錄下創(chuàng)建一個(gè)文件,到容器中也是可以看到的
NFS
HostPath可以解決數(shù)據(jù)持久化的問(wèn)題,但是一旦Node節(jié)點(diǎn)故障了,Pod如果轉(zhuǎn)移到了別的節(jié)點(diǎn),又會(huì)出現(xiàn)問(wèn)題了,此時(shí)需要準(zhǔn)備單獨(dú)的網(wǎng)絡(luò)存儲(chǔ)系統(tǒng),比較常用的用NFS、CIFS。
NFS是一個(gè)網(wǎng)絡(luò)文件存儲(chǔ)系統(tǒng),可以搭建一臺(tái)NFS服務(wù)器,然后將Pod中的存儲(chǔ)直接連接到NFS系統(tǒng)上,這樣的話,無(wú)論P(yáng)od在節(jié)點(diǎn)上怎么轉(zhuǎn)移,只要Node跟NFS的對(duì)接沒(méi)問(wèn)題,數(shù)據(jù)就可以成功訪問(wèn)。

1)首先要準(zhǔn)備nfs的服務(wù)器,這里為了簡(jiǎn)單,直接是master節(jié)點(diǎn)做nfs服務(wù)器
# 在nfs上安裝nfs服務(wù)
[root@nfs ~]# yum install nfs-utils -y
# 準(zhǔn)備一個(gè)共享目錄
[root@nfs ~]# mkdir /root/data/nfs -pv
# 將共享目錄以讀寫權(quán)限暴露給172.16.5.0/24網(wǎng)段中的所有主機(jī)
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# more /etc/exports
/root/data/nfs 172.16.5.0/24(rw,no_root_squash)
# 啟動(dòng)nfs服務(wù)
[root@nfs ~]# systemctl restart nfs
2)接下來(lái),要在的每個(gè)node節(jié)點(diǎn)上都安裝下nfs,這樣的目的是為了node節(jié)點(diǎn)可以驅(qū)動(dòng)nfs設(shè)備
# 在node上安裝nfs服務(wù),注意不需要啟動(dòng)
[root@k8s-master01 ~]# yum install nfs-utils -y
3)接下來(lái),就可以編寫pod的配置文件了,創(chuàng)建volume-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-nfs
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.18.0
ports:
- containerPort: 80
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","tail -f /logs/access.log"]
volumeMounts:
- name: logs-volume
mountPath: /logs
volumes:
- name: logs-volume
nfs:
server: 172.16.5.6 #nfs服務(wù)器地址
path: /root/data/nfs #共享文件路徑
4)最后,運(yùn)行下pod,觀察結(jié)果
# 創(chuàng)建pod
[root@k8s-master01 ~]# kubectl create -f volume-nfs.yaml
pod/volume-nfs created
# 查看pod
[root@k8s-master01 ~]# kubectl get pods volume-nfs -n dev
NAME READY STATUS RESTARTS AGE
volume-nfs 2/2 Running 0 2m9s
# 查看nfs服務(wù)器上的共享目錄,發(fā)現(xiàn)已經(jīng)有文件了
[root@k8s-master01 ~]# ls /root/data/
access.log error.log
高級(jí)存儲(chǔ)
前面已經(jīng)介紹了使用NFS提供存儲(chǔ),此時(shí)就要求用戶會(huì)搭建NFS系統(tǒng),并且會(huì)在yaml配置nfs。由于kubernetes支持的存儲(chǔ)系統(tǒng)有很多,要求客戶全都掌握,顯然不現(xiàn)實(shí)。為了能夠屏蔽底層存儲(chǔ)實(shí)現(xiàn)的細(xì)節(jié),方便用戶使用, kubernetes引入PV和PVC兩種資源對(duì)象。
PV(Persistent Volume)是持久化卷的意思,是對(duì)底層的共享存儲(chǔ)的一種抽象。一般情況下PV由kubernetes管理員進(jìn)行創(chuàng)建和配置,它與底層具體的共享存儲(chǔ)技術(shù)有關(guān),并通過(guò)插件完成與共享存儲(chǔ)的對(duì)接。
PVC(Persistent Volume Claim)是持久卷聲明的意思,是用戶對(duì)于存儲(chǔ)需求的一種聲明。換句話說(shuō),PVC其實(shí)就是用戶向kubernetes系統(tǒng)發(fā)出的一種資源需求申請(qǐng)。

使用了PV和PVC之后,工作可以得到進(jìn)一步的細(xì)分:
- 存儲(chǔ):存儲(chǔ)工程師維護(hù)
- PV: kubernetes管理員維護(hù)
- PVC:kubernetes用戶維護(hù)
PV
PV是存儲(chǔ)資源的抽象,下面是資源清單文件:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
nfs: # 存儲(chǔ)類型,與底層真正存儲(chǔ)對(duì)應(yīng)
capacity: # 存儲(chǔ)能力,目前只支持存儲(chǔ)空間的設(shè)置
storage: 2Gi
accessModes: # 訪問(wèn)模式
storageClassName: # 存儲(chǔ)類別
persistentVolumeReclaimPolicy: # 回收策略
PV 的關(guān)鍵配置參數(shù)說(shuō)明:
-
存儲(chǔ)類型
底層實(shí)際存儲(chǔ)的類型,kubernetes支持多種存儲(chǔ)類型,每種存儲(chǔ)類型的配置都有所差異
-
存儲(chǔ)能力(capacity)
目前只支持存儲(chǔ)空間的設(shè)置( storage=1Gi ),不過(guò)未來(lái)可能會(huì)加入IOPS、吞吐量等指標(biāo)的配置
-
訪問(wèn)模式(accessModes)
用于描述用戶應(yīng)用對(duì)存儲(chǔ)資源的訪問(wèn)權(quán)限,訪問(wèn)權(quán)限包括下面幾種方式:
-
ReadWriteOnce(RWO):讀寫權(quán)限,但是只能被單個(gè)節(jié)點(diǎn)掛載
-
ReadOnlyMany(ROX): 只讀權(quán)限,可以被多個(gè)節(jié)點(diǎn)掛載
-
ReadWriteMany(RWX):讀寫權(quán)限,可以被多個(gè)節(jié)點(diǎn)掛載
需要注意的是,底層不同的存儲(chǔ)類型可能支持的訪問(wèn)模式不同 -
-
回收策略(persistentVolumeReclaimPolicy)
當(dāng)PV不再被使用了之后,對(duì)其的處理方式。目前支持三種策略:
-
Retain (保留) 保留數(shù)據(jù),需要管理員手工清理數(shù)據(jù)
-
Recycle(回收) 清除 PV 中的數(shù)據(jù),效果相當(dāng)于執(zhí)行 rm -rf /thevolume/*
-
Delete (刪除) 與 PV 相連的后端存儲(chǔ)完成 volume 的刪除操作,當(dāng)然這常見于云服務(wù)商的存儲(chǔ)服務(wù)
需要注意的是,底層不同的存儲(chǔ)類型可能支持的回收策略不同 -
-
存儲(chǔ)類別
PV可以通過(guò)storageClassName參數(shù)指定一個(gè)存儲(chǔ)類別
-
具有特定類別的PV只能與請(qǐng)求了該類別的PVC進(jìn)行綁定
-
未設(shè)定類別的PV則只能與不請(qǐng)求任何類別的PVC進(jìn)行綁定
-
-
狀態(tài)(status)
一個(gè) PV 的生命周期中,可能會(huì)處于4中不同的階段:
-
Available(可用): 表示可用狀態(tài),還未被任何 PVC 綁定
-
Bound(已綁定): 表示 PV 已經(jīng)被 PVC 綁定
-
Released(已釋放): 表示 PVC 被刪除,但是資源還未被集群重新聲明
-
Failed(失敗): 表示該 PV 的自動(dòng)回收失敗
-
實(shí)驗(yàn)
使用NFS作為存儲(chǔ),來(lái)演示PV的使用,創(chuàng)建3個(gè)PV,對(duì)應(yīng)NFS中的3個(gè)暴露的路徑。
- 準(zhǔn)備NFS環(huán)境
# 創(chuàng)建目錄
[root@nfs ~]# mkdir /root/data/{pv1,pv2,pv3} -pv
# 暴露服務(wù)
[root@nfs ~]# more /etc/exports
/root/data/pv1 172.16.5.0/24(rw,no_root_squash)
/root/data/pv2 172.16.5.0/24(rw,no_root_squash)
/root/data/pv3 172.16.5.0/24(rw,no_root_squash)
# 重啟服務(wù)
[root@nfs ~]# systemctl restart nfs
- 創(chuàng)建pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv1
server: 172.16.5.6
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv2
server: 172.16.5.6
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv3
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv3
server: 172.16.5.6
# 創(chuàng)建 pv
[root@k8s-master01 ~]# kubectl create -f pv.yaml
persistentvolume/pv1 created
persistentvolume/pv2 created
persistentvolume/pv3 created
# 查看pv
[root@k8s-master01 ~]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS AGE VOLUMEMODE
pv1 1Gi RWX Retain Available 10s Filesystem
pv2 2Gi RWX Retain Available 10s Filesystem
pv3 3Gi RWX Retain Available 9s Filesystem
PVC
PVC是資源的申請(qǐng),用來(lái)聲明對(duì)存儲(chǔ)空間、訪問(wèn)模式、存儲(chǔ)類別需求信息。下面是資源清單文件:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
namespace: dev
spec:
accessModes: # 訪問(wèn)模式
selector: # 采用標(biāo)簽對(duì)PV選擇
storageClassName: # 存儲(chǔ)類別
resources: # 請(qǐng)求空間
requests:
storage: 5Gi
PVC 的關(guān)鍵配置參數(shù)說(shuō)明:
- 訪問(wèn)模式(accessModes)
用于描述用戶應(yīng)用對(duì)存儲(chǔ)資源的訪問(wèn)權(quán)限
-
選擇條件(selector)
通過(guò)Label Selector的設(shè)置,可使PVC對(duì)于系統(tǒng)中己存在的PV進(jìn)行篩選
-
存儲(chǔ)類別(storageClassName)
PVC在定義時(shí)可以設(shè)定需要的后端存儲(chǔ)的類別,只有設(shè)置了該class的pv才能被系統(tǒng)選出
-
資源請(qǐng)求(Resources )
描述對(duì)存儲(chǔ)資源的請(qǐng)求
實(shí)驗(yàn)
- 創(chuàng)建pvc.yaml,申請(qǐng)pv
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc3
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
# 創(chuàng)建pvc
[root@k8s-master01 ~]# kubectl create -f pvc.yaml
persistentvolumeclaim/pvc1 created
persistentvolumeclaim/pvc2 created
persistentvolumeclaim/pvc3 created
# 查看pvc
[root@k8s-master01 ~]# kubectl get pvc -n dev -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
pvc1 Bound pv1 1Gi RWX 15s Filesystem
pvc2 Bound pv2 2Gi RWX 15s Filesystem
pvc3 Bound pv3 3Gi RWX 15s Filesystem
# 查看pv
[root@k8s-master01 ~]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM AGE VOLUMEMODE
pv1 1Gi RWx Retain Bound dev/pvc1 3h37m Filesystem
pv2 2Gi RWX Retain Bound dev/pvc2 3h37m Filesystem
pv3 3Gi RWX Retain Bound dev/pvc3 3h37m Filesystem
- 創(chuàng)建pods.yaml, 使用pv
apiVersion: v1
kind: Pod
metadata:
name: pod1
namespace: dev
spec:
containers:
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","while true;do echo pod1 >> /root/out.txt; sleep 10; done;"]
volumeMounts:
- name: volume
mountPath: /root/
volumes:
- name: volume
persistentVolumeClaim:
claimName: pvc1
readOnly: false
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
namespace: dev
spec:
containers:
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","while true;do echo pod2 >> /root/out.txt; sleep 10; done;"]
volumeMounts:
- name: volume
mountPath: /root/
volumes:
- name: volume
persistentVolumeClaim:
claimName: pvc2
readOnly: false
# 創(chuàng)建pod
[root@k8s-master01 ~]# kubectl create -f pods.yaml
pod/pod1 created
pod/pod2 created
# 查看pod
[root@k8s-master01 ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1/1 Running 0 14s 10.244.1.69 node1
pod2 1/1 Running 0 14s 10.244.1.70 node1
# 查看pvc
[root@k8s-master01 ~]# kubectl get pvc -n dev -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES AGE VOLUMEMODE
pvc1 Bound pv1 1Gi RWX 94m Filesystem
pvc2 Bound pv2 2Gi RWX 94m Filesystem
pvc3 Bound pv3 3Gi RWX 94m Filesystem
# 查看pv
[root@k8s-master01 ~]# kubectl get pv -n dev -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM AGE VOLUMEMODE
pv1 1Gi RWX Retain Bound dev/pvc1 5h11m Filesystem
pv2 2Gi RWX Retain Bound dev/pvc2 5h11m Filesystem
pv3 3Gi RWX Retain Bound dev/pvc3 5h11m Filesystem
# 查看nfs中的文件存儲(chǔ)
[root@nfs ~]# more /root/data/pv1/out.txt
node1
node1
[root@nfs ~]# more /root/data/pv2/out.txt
node2
node2
生命周期
PVC和PV是一一對(duì)應(yīng)的,PV和PVC之間的相互作用遵循以下生命周期:
-
資源供應(yīng):管理員手動(dòng)創(chuàng)建底層存儲(chǔ)和PV
-
資源綁定:用戶創(chuàng)建PVC,kubernetes負(fù)責(zé)根據(jù)PVC的聲明去尋找PV,并綁定
在用戶定義好PVC之后,系統(tǒng)將根據(jù)PVC對(duì)存儲(chǔ)資源的請(qǐng)求在已存在的PV中選擇一個(gè)滿足條件的
-
一旦找到,就將該P(yáng)V與用戶定義的PVC進(jìn)行綁定,用戶的應(yīng)用就可以使用這個(gè)PVC了
-
如果找不到,PVC則會(huì)無(wú)限期處于Pending狀態(tài),直到等到系統(tǒng)管理員創(chuàng)建了一個(gè)符合其要求的PV
PV一旦綁定到某個(gè)PVC上,就會(huì)被這個(gè)PVC獨(dú)占,不能再與其他PVC進(jìn)行綁定了
-
-
資源使用:用戶可在pod中像volume一樣使用pvc
Pod使用Volume的定義,將PVC掛載到容器內(nèi)的某個(gè)路徑進(jìn)行使用。
-
資源釋放:用戶刪除pvc來(lái)釋放pv
當(dāng)存儲(chǔ)資源使用完畢后,用戶可以刪除PVC,與該P(yáng)VC綁定的PV將會(huì)被標(biāo)記為“已釋放”,但還不能立刻與其他PVC進(jìn)行綁定。通過(guò)之前PVC寫入的數(shù)據(jù)可能還被留在存儲(chǔ)設(shè)備上,只有在清除之后該P(yáng)V才能再次使用。
-
資源回收:kubernetes根據(jù)pv設(shè)置的回收策略進(jìn)行資源的回收
對(duì)于PV,管理員可以設(shè)定回收策略,用于設(shè)置與之綁定的PVC釋放資源之后如何處理遺留數(shù)據(jù)的問(wèn)題。只有PV的存儲(chǔ)空間完成回收,才能供新的PVC綁定和使用

配置存儲(chǔ)
ConfigMap
ConfigMap是一種比較特殊的存儲(chǔ)卷,它的主要作用是用來(lái)存儲(chǔ)配置信息的。
創(chuàng)建configmap.yaml,內(nèi)容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap
namespace: dev
data:
info: |
username:admin
password:123456
接下來(lái),使用此配置文件創(chuàng)建configmap
# 創(chuàng)建configmap
[root@k8s-master01 ~]# kubectl create -f configmap.yaml
configmap/configmap created
# 查看configmap詳情
[root@k8s-master01 ~]# kubectl describe cm configmap -n dev
Name: configmap
Namespace: dev
Labels: <none>
Annotations: <none>
Data
====
info:
----
username:admin
password:123456
Events: <none>
接下來(lái)創(chuàng)建一個(gè)pod-configmap.yaml,將上面創(chuàng)建的configmap掛載進(jìn)去
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.18.0
volumeMounts: # 將configmap掛載到目錄
- name: config
mountPath: /configmap/config
volumes: # 引用configmap
- name: config
configMap:
name: configmap
# 創(chuàng)建pod
[root@k8s-master01 ~]# kubectl create -f pod-configmap.yaml
pod/pod-configmap created
# 查看pod
[root@k8s-master01 ~]# kubectl get pod pod-configmap -n dev
NAME READY STATUS RESTARTS AGE
pod-configmap 1/1 Running 0 6s
#進(jìn)入容器
[root@k8s-master01 ~]# kubectl exec -it pod-configmap -n dev /bin/sh
# cd /configmap/config/
# ls
info
# more info
username:admin
password:123456
# 可以看到映射已經(jīng)成功,每個(gè)configmap都映射成了一個(gè)目錄
# key--->文件 value---->文件中的內(nèi)容
# 此時(shí)如果更新configmap的內(nèi)容, 容器中的值也會(huì)動(dòng)態(tài)更新
Secret
在kubernetes中,還存在一種和ConfigMap非常類似的對(duì)象,稱為Secret對(duì)象。它主要用于存儲(chǔ)敏感信息,例如密碼、秘鑰、證書等等。
- 首先使用base64對(duì)數(shù)據(jù)進(jìn)行編碼
[root@k8s-master01 ~]# echo -n 'admin' | base64 #準(zhǔn)備username
YWRtaW4=
[root@k8s-master01 ~]# echo -n '123456' | base64 #準(zhǔn)備password
MTIzNDU2
- 接下來(lái)編寫secret.yaml,并創(chuàng)建Secret
apiVersion: v1
kind: Secret
metadata:
name: secret
namespace: dev
type: Opaque
data:
username: YWRtaW4=
password: MTIzNDU2
# 創(chuàng)建secret
[root@k8s-master01 ~]# kubectl create -f secret.yaml
secret/secret created
# 查看secret詳情
[root@k8s-master01 ~]# kubectl describe secret secret -n dev
Name: secret
Namespace: dev
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 6 bytes
username: 5 bytes
- 創(chuàng)建pod-secret.yaml,將上面創(chuàng)建的secret掛載進(jìn)去:
apiVersion: v1
kind: Pod
metadata:
name: pod-secret
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.18.0
volumeMounts: # 將secret掛載到目錄
- name: config
mountPath: /secret/config
volumes:
- name: config
secret:
secretName: secret
# 創(chuàng)建pod
[root@k8s-master01 ~]# kubectl create -f pod-secret.yaml
pod/pod-secret created
# 查看pod
[root@k8s-master01 ~]# kubectl get pod pod-secret -n dev
NAME READY STATUS RESTARTS AGE
pod-secret 1/1 Running 0 2m28s
# 進(jìn)入容器,查看secret信息,發(fā)現(xiàn)已經(jīng)自動(dòng)解碼了
[root@k8s-master01 ~]# kubectl exec -it pod-secret /bin/sh -n dev
/ # ls /secret/config/
password username
/ # more /secret/config/username
admin
/ # more /secret/config/password
123456
至此,已經(jīng)實(shí)現(xiàn)了利用secret實(shí)現(xiàn)了信息的編碼。
出處:http://www.rzrgm.cn/zhangwencheng
版權(quán):本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出 原文鏈接
浙公網(wǎng)安備 33010602011771號(hào)