1. 程式人生 > 其它 >k8s儲存卷(empyDir;hostPath;nfs)

k8s儲存卷(empyDir;hostPath;nfs)

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