k8s儲存卷(empyDir;hostPath;nfs)
阿新 • • 發佈:2021-11-09
k8s的儲存卷
目錄一: emptyDir 儲存卷
1.1 為什麼使用儲存卷
容器磁碟上的檔案的生命週期是短暫的,這就使得在容器中執行重要應用時會出現一些問題。首先,當容器崩潰時, kubelet會重啟它,但是容器中的檔案將丟失一容器以乾淨的狀態(映象最初的狀態)重新啟動。
其次,在Pod中同時執行多個容器時,這些容器之間通常需要共享檔案。Kubernetes中的Volume抽象就很好的解決了這些問題。Pod中的容器通過Pause容器共享Volume。
1.2 emptyDir 儲存卷的作用
emptyDir儲存卷當Pod被分配給節點時,首先建立emptyDir卷,並且只要該Pod在該節點上執行,該卷就會存在。正如卷的名字所述,它最初是空的。Pod中的容器可以讀取和寫入emptyDir卷中的相同檔案,儘管該卷可以掛載到每個容器中的相同或不同路徑上。當出於任何原因從節點中刪除Pod時, emptyDir中的資料將被永久刪除。
1.3 示例
[root@master demo]# mkdir /opt/volumes [root@master demo]# cd /opt/volumes/ [root@master volumes]# vim pod-emptydir.yaml
apiVersion: v1 kind: Pod metadata: name: pod-emptydir namespace: default labels: app: myapp tier: frontend spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 #定義容器掛載的內容 volumeMounts: #使用的儲存卷名稱,如果跟下面的volume欄位name值相同,則表示使用volume的這個卷 - name: html #掛載到容器的哪個目錄 mountPath: /usr/share/nginx/html/ - name: busybox image: busybox:latest imagePullPolicy: IfNotPresent volumeMounts: - name: html #在容器內定義掛載儲存名稱和掛載路徑 mountPath: /data/ command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 5;done'] #定義儲存卷 volumes: #定義儲存卷的名稱 - name: html #定義儲存卷的型別 emptyDir: {}
[root@master volumes]# kubectl apply -f pod-emptydir.yaml
[root@master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-emptydir 2/2 Running 0 3s 10.244.1.146 node01 <none> <none>
#在上面定義了兩個容器,其中一個容器輸入日期到index.html中,然後驗證範圍nginx的htmnl是否可以獲取日期
#同時,在進入兩個容器裡,檢視掛載資料卷的目錄的資料,以驗證兩個容器之間掛載的emptyDir實現共享
[root@master volumes]# curl 10.244.1.146
Tue Nov 9 09:56:53 UTC 2021
Tue Nov 9 09:56:58 UTC 2021
Tue Nov 9 09:57:03 UTC 2021
Tue Nov 9 09:57:08 UTC 2021
Tue Nov 9 09:57:13 UTC 2021
Tue Nov 9 09:57:18 UTC 2021
[root@master volumes]# kubectl exec -it pod-emptydir -c busybox
error: you must specify at least one command for the container
[root@master volumes]# kubectl exec -it pod-emptydir -c busybox sh
/ # cat /data/index.html
Tue Nov 9 09:56:53 UTC 2021
Tue Nov 9 09:56:58 UTC 2021
Tue Nov 9 09:57:03 UTC 2021
Tue Nov 9 09:57:08 UTC 2021
Tue Nov 9 09:57:13 UTC 2021
Tue Nov 9 09:57:18 UTC 2021
[root@master volumes]# kubectl exec -it pod-emptydir -c myapp sh
/ # cat /usr/share/nginx/html/index.html
Tue Nov 9 09:56:53 UTC 2021
Tue Nov 9 09:56:58 UTC 2021
Tue Nov 9 09:57:03 UTC 2021
Tue Nov 9 09:57:08 UTC 2021
Tue Nov 9 09:57:13 UTC 2021
Tue Nov 9 09:57:18 UTC 2021
Tue Nov 9 09:57:23 UTC 2021
Tue Nov 9 09:57:28 UTC 2021
Tue Nov 9 09:57:33 UTC 2021
Tue Nov 9 09:57:38 UTC 2021
二: hostPath卷
2.1 作用
hostPath卷將node節點的檔案系統中的檔案或者目錄掛載到叢集中
hostPath可以實現持久儲存,但是在node節點故障時,也會導致資料的丟失
2.2 示例
#在node01節點上建立掛載目錄
[root@node01 ~]# mkdir -p /data/pod/volume1
[root@node01 ~]# echo 'node01.myweb.com' > /data/pod/volume1/index.html
#在node02 節點上建立掛載目錄
[root@node02 ~]# mkdir -p /data/pod/volume1
[root@node02 ~]# echo 'node02.myweb.com' > /data/pod/volume1/index.html
[root@master volumes]# vim pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
#定義容器你掛載內容
volumeMounts:
#使用的儲存卷名稱,如果跟下面volume欄位name值相同,則表示使用volume的這個儲存卷
- name: html
#掛載值容器中哪個目錄
mountPath: /usr/share/nginx/html
readOnly: false
#volumes欄位定義了paues容器關聯的宿主機或分散式檔案系統儲存卷
volumes:
#儲存卷名稱
- name: html
#路徑,為宿主機儲存路徑
hostPath:
#在宿主機上目錄的路徑
path: /data/pod/volume1
#定義型別,這表示如果宿主機沒有此目錄則會自動建立
type: DirectoryOrCreate
[root@master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hostpath 1/1 Running 0 14m 10.244.2.112 node02 <none> <none>
#訪問測試
[root@master volumes]# curl 10.244.2.112
node02.myweb.com
#刪除pod後,再重建,驗證是否依舊可以訪問原來的內容
[root@master volumes]# kubectl delete -f pod-hostpath.yaml
pod "pod-hostpath" deleted
[root@master volumes]# kubectl apply -f pod-hostpath.yaml
pod/pod-hostpath created
[root@master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hostpath 1/1 Running 0 6s 10.244.1.147 node01 <none> <none>
[root@master volumes]# curl 10.244.1.147
node01.myweb.com
三: nfs共享儲存
3.1 安裝配置nfs服務
#在stor01(192.168.23.10)節點上安裝nfs,並配置nfs服務
mkdir /data/volumes -p
echo 'this is OTZ' >> /data/volumes/index.html
chmod 777 /data/volumes/
yum -y install nfs-utils rpcbind
vim /etc/exports
/data/volumes 192.168.23.0/24(rw,no_root_squash,sync)
systemctl start rpcbind nfs
Export list for host10:
/data/volumes 192.168.23.0/24
#所有節點配置hosts對映,或者配置DNS解析
echo '192.168.23.10 stor01' >> /etc/hosts
3.2 master 節點操作
apiVersion: v1
kind: Pod
metadata:
name: pod-vo1-nfs
namespace: default
spec:
#指定pod到 node01節點
nodeName: node01
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
path: /data/volumes
server: stor01
[root@master volumes]# kubectl apply -f pod-nfs-vo1.yaml
pod/pod-vo1-nfs created
[root@master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-vo1-nfs 1/1 Running 0 8s 10.244.1.148 node01 <none> <none>
#訪問cluster ip
[root@master volumes]# curl 10.244.1.148
this is OTZ
[root@master volumes]# kubectl delete pod pod-vo1-nfs
pod "pod-vo1-nfs" deleted
[root@master volumes]# vim pod-nfs-vo1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vo1-nfs
namespace: default
spec:
#指定pod在node02節點
nodeName: node02
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
path: /data/volumes
server: stor01
[root@master volumes]# kubectl apply -f pod-nfs-vo1.yaml
pod/pod-vo1-nfs created
[root@master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-vo1-nfs 1/1 Running 0 3s 10.244.2.114 node02 <none> <none>
#訪問測試
[root@master volumes]# curl 10.244.2.114
this is OTZ