共計(jì) 8131 個(gè)字符,預(yù)計(jì)需要花費(fèi) 21 分鐘才能閱讀完成。
本篇文章為大家展示了 k8s 如何使用 emptyDir,hostPath,nfs,pv,pvc 做存儲(chǔ),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
存儲(chǔ)卷三種方式:emptyDir,gitRepo,hostPath
emptyDir:一個(gè) pod 創(chuàng)建兩個(gè)容器, 一個(gè) pod 提供請(qǐng)求服務(wù), 另一個(gè) pod 提供文件存儲(chǔ),pod 刪除, 存儲(chǔ)卷就刪除。
gitRepo:使用 docker 鏡像提供存儲(chǔ)
hostPath:宿主機(jī)路徑,pod 刪除, 存儲(chǔ)卷還在 (在多個(gè) node 節(jié)點(diǎn)要?jiǎng)?chuàng)建路徑)
nfs:使用共享存儲(chǔ) (多個(gè) pod 要在共享存儲(chǔ)中創(chuàng)建多個(gè)目錄)
幫助:
[root@k8s1 ~]# kubectl explain pods.spec.volumes.persistentVolumeClaim –pvc 幫助
[root@k8s1 ~]# kubectl explain pods.spec.volumes – 查看幫助
[root@k8s1 ~]# kubectl explain pv –pv 幫助
1. 使用 emptyDir 做存儲(chǔ) (兩個(gè) pod, 一個(gè)做存儲(chǔ), 一個(gè)提供服務(wù))
[root@k8s1 ~]# vim 11.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo – 定義一個(gè) pod
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
– name: myapp – 定義一個(gè)容器
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
– name: http
containerPort: 80
volumeMounts:
– name: html
mountPath: /usr/share/nginx/html –myapp 容器 html 卷掛載到 /usr/share/nginx/html(是 nginx 默認(rèn)路徑)
– name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
– name: html –busybox 容器將 html 卷掛載到 /data
mountPath: /data/
command: [/bin/sh , -c , while true;do echo $(date) /data/index.html;sleep 2;done ]
volumes: – 定義一個(gè) html 卷
– name: html
emptyDir: {}
[root@k8s1 ~]# kubectl apply -f 11.yaml
pod/pod-demo created
[root@k8s1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 0 103s 10.244.1.13 k8s2 none none
[root@k8s1 ~]# kubectl exec -it pod-demo -c busybox — /bin/sh
/ # cat /data/index.html
Fri Feb 22 09:39:53 UTC 2019
Fri Feb 22 09:39:55 UTC 2019
Fri Feb 22 09:39:57 UTC 2019
Fri Feb 22 09:39:59 UTC 2019
[root@k8s1 ~]# curl http://10.244.1.13
Fri Feb 22 09:39:53 UTC 2019
Fri Feb 22 09:39:55 UTC 2019
Fri Feb 22 09:39:57 UTC 2019
Fri Feb 22 09:39:59 UTC 2019
Fri Feb 22 09:40:01 UTC 2019
Fri Feb 22 09:40:03 UTC 2019
Fri Feb 22 09:40:05 UTC 2019
[root@k8s1 ~]#
2. 使用 hostPath 做存儲(chǔ) (如果 node 節(jié)點(diǎn)宕機(jī),pod 訪問(wèn)宕機(jī) node 的數(shù)據(jù)就不存在了)
node1 節(jié)點(diǎn):
[root@k8s2 ~]# mkdir -p /data/pod
[root@k8s2 ~]# cat /data/pod/index.html – 為了區(qū)分 node 節(jié)點(diǎn), 將文件內(nèi)容寫(xiě)不一樣
node1
[root@k8s2 ~]#
node2 節(jié)點(diǎn):
[root@k8s3 ~]# mkdir -p /data/pod
[root@k8s3 ~]# cat /data/pod/index.html
node2
[root@k8s3 ~]#
master 節(jié)點(diǎn):
[root@k8s1 ~]# vim 12.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-hostpath
namespace: default
spec:
containers:
– name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
– name: html – 使用 html 卷存儲(chǔ)
mountPath: /usr/share/nginx/html –nginx 網(wǎng)頁(yè)根目錄
volumes:
– name: html
hostPath:
path: /data/pod/ –html 卷的路徑 (對(duì)應(yīng)的 node 節(jié)點(diǎn)新建目錄,pod 在哪個(gè) node 上就要新建)
type: DirectoryOrCreate
[root@k8s1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 0 64m 10.244.1.13 k8s2 none none
pod-vol-hostpath 1/1 Running 0 4s 10.244.2.22 k8s3 none none
[root@k8s1 ~]# curl http://10.244.2.22 –pod 在 node2 節(jié)點(diǎn)上, 所以訪問(wèn)的是 node2 的網(wǎng)頁(yè), 如果在 node1 就是 node1 的內(nèi)容
node2
[root@k8s1 ~]#
3. 使用 nfs 共享存儲(chǔ)
nfs 存儲(chǔ):
[root@liutie1 ~]# mkdir /data/v6
[root@liutie1 ~]# vim /etc/exports
/data/v6 172.16.8.0/24(rw,no_root_squash)
[root@liutie1 ~]# systemctl restart nfs
[root@liutie1 ~]# exportfs -arv
exporting 172.16.8.0/24:/data/v6
[root@liutie1 ~]# showmount -e
Export list for liutie1:
/data/v6 172.16.8.0/24
[root@liutie1 ~]#
k8s 節(jié)點(diǎn):
[root@k8s1 ~]# mkdir /data/v6 – 創(chuàng)建共享目錄
[root@k8s1 ~]# mount.nfs 172.16.8.108:/data/v6 /data/v6 – 測(cè)試手動(dòng)掛載
[root@k8s1 ~]# umount /data/v6
[root@k8s1 ~]# vim nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-nfs
namespace: default
spec:
containers:
– name: pod-nfs
image: ikubernetes/myapp:v1
volumeMounts:
– name: html1
mountPath: /usr/share/nginx/html
volumes:
– name: html1
nfs:
path: /data/v6
server: 172.16.8.108
[root@k8s1 ~]# kubectl apply -f nfs.yaml
pod/pod-vol-nfs created
[root@k8s1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-vol-nfs 1/1 Running 0 2m21s 10.244.1.78 k8s2 none none
[root@k8s1 ~]#
在 nfs 存儲(chǔ)創(chuàng)建文件
[root@liutie1 ~]# cd /data/v6/
[root@liutie1 v6]# cat index.html
nfs store
[root@liutie1 v6]#
在 k8s 節(jié)點(diǎn)打開(kāi)網(wǎng)頁(yè)
[root@k8s1 ~]# curl 10.244.1.78 –pod 的 ip 地址
nfs store
[root@k8s1 ~]#
4. 使用 nfs 共享存儲(chǔ) (固定大小)
nfs 服務(wù)器:
[root@liutie1 ~]# mkdir /data/v{1,2,3,4,5} – 在存儲(chǔ)上新建目錄
[root@liutie1 ~]# yum install nfs* -y – 安裝 nfs
[root@liutie1 ~]# vim /etc/exports – 共享目錄
/data/v1 172.16.8.0/24(rw,no_root_squash)
/data/v2 172.16.8.0/24(rw,no_root_squash)
/data/v3 172.16.8.0/24(rw,no_root_squash)
/data/v4 172.16.8.0/24(rw,no_root_squash)
/data/v5 172.16.8.0/24(rw,no_root_squash)
[root@liutie1 ~]# exportfs -arv
exporting 172.16.8.0/24:/data/v5
exporting 172.16.8.0/24:/data/v4
exporting 172.16.8.0/24:/data/v3
exporting 172.16.8.0/24:/data/v2
exporting 172.16.8.0/24:/data/v1
[root@liutie1 ~]# showmount -e
Export list for liutie1:
/data/v5 172.16.8.0/24
/data/v4 172.16.8.0/24
/data/v3 172.16.8.0/24
/data/v2 172.16.8.0/24
/data/v1 172.16.8.0/24
[root@liutie1 ~]#
node 各節(jié)點(diǎn):
[root@k8s2 ~]# yum install nfs-common nfs-utils -y – 所有 node 節(jié)點(diǎn)必須安裝 nfs-utils 軟件包, 否則會(huì)出錯(cuò)
master 節(jié)點(diǎn):
[root@k8s1 ~]# yum install -y nfs-utils
[root@k8s1 ~]# kubectl explain PersistentVolume – 幫助信息
[root@k8s1 ~]# vim pv.yaml – 將遠(yuǎn)程的 nfs 目錄轉(zhuǎn)換成 pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /data/v1
server: 172.16.8.108
accessModes: [ReadWriteMany , ReadWriteOnce]
capacity:
storage: 5Gi
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /data/v2
server: 172.16.8.108
accessModes: [ReadWriteMany , ReadWriteOnce]
capacity:
storage: 15Gi
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /data/v3
server: 172.16.8.108
accessModes: [ReadWriteMany , ReadWriteOnce]
capacity:
storage: 1Gi
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /data/v4
server: 172.16.8.108
accessModes: [ReadWriteMany , ReadWriteOnce]
capacity:
storage: 20Gi
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
spec:
nfs:
path: /data/v5
server: 172.16.8.108
accessModes: [ReadWriteMany , ReadWriteOnce]
capacity:
storage: 13Gi
[root@k8s1 ~]# kubectl apply -f pv.yaml – 生成 pv
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created
[root@k8s1 ~]# kubectl get pv – 查看 pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 5Gi RWO,RWX Retain Available 2m40s
pv002 15Gi RWO,RWX Retain Available 2m40s
pv003 1Gi RWO,RWX Retain Available 2m40s
pv004 20Gi RWO,RWX Retain Available 2m40s
pv005 13Gi RWO,RWX Retain Available 2m40s
[root@k8s1 ~]# vim pvc.yaml – 創(chuàng)建 pvc,pvc 的大小為 6G
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: default – 定義一個(gè) mypvc 名字的 pvc
spec:
accessModes: [ReadWriteMany]
resources:
requests:
storage: 6Gi
—
apiVersion: v1
kind: Pod – 定義一個(gè) pod,pod 使用 pvc
metadata:
name: pod-vol-pvc
namespace: default
spec:
containers:
– name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
– name: html – 使用 mypvc 存儲(chǔ)
mountPath: /usr/share/nginx/html
volumes:
– name: html
persistentVolumeClaim:
claimName: mypvc – 引用上面的 mypvc
[root@k8s1 ~]# kubectl apply -f pvc.yaml
persistentvolumeclaim/mypvc created
pod/pod-vol-pvc created
[root@k8s1 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 5Gi RWO,RWX Retain Available 8m31s
pv002 15Gi RWO,RWX Retain Available 8m31s
pv003 1Gi RWO,RWX Retain Available 8m31s
pv004 20Gi RWO,RWX Retain Available 8m31s
pv005 13Gi RWO,RWX Retain Bound default/mypvc 8m31s –Bound 表示使用
[root@k8s1 ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound pv005 13Gi RWO,RWX 2m31s – 使用了 pv005 的 mypvc 存儲(chǔ)卷
[root@k8s1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 0 141m
pod-vol-hostpath 1/1 Running 0 77m
pod-vol-pvc 1/1 Running 0 4s
[root@k8s1 ~]# kubectl describe pods pod-vol-pvc – 查看詳細(xì)信息
上述內(nèi)容就是 k8s 如何使用 emptyDir,hostPath,nfs,pv,pvc 做存儲(chǔ),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道。