1. 程式人生 > 其它 >k8s儲存卷

k8s儲存卷

儲存卷

容器磁碟上的檔案的生命週期是短暫的,這就使得在容器中執行重要應用時會出現一些問題。首先, 當容器崩潰時,kubelet會重啟它,但是容器中的檔案將丟失容器以乾淨的狀態 (映象最初的狀態)重新啟動。其次,在Pod中同時執行多個容器時,這些容器之間通常需要共享檔案。Kubernetes 中的Volume抽象就很好的解決了這些問題。Pod中的容器通過Pause容器共享Volume。

emptyDir儲存卷

當Pod被分配給節點時,首先建立emptyDir卷,並且只要該Pod在該節點上執行,該卷就會存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以讀取和寫入emptyDir卷中的相同檔案,儘管該卷可以掛載到每個容器中的相同或不同路徑上。當出於任何原因從節點中刪除 Pod 時,emptyDir中的資料將被永久刪除。

mkdir shiyan
cd /shiyan
vim pod4.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx1
    image: nginx
    ports:
    - name: http
      containerPort: 80
    volumeMounts:                                                     #定義容器掛載內容
    - name: html                                    #使用儲存卷名稱,如果跟下面volume欄位name值相同,則表示使用volume的這個儲存卷
      mountPath: /usr/share/nginx/html/                              #掛載至容器中哪個目錄
  - name: nginx2
    image: nginx
    volumeMounts:
    - name: html
      mountPath: /data/
    command: ['/bin/bash','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']
  volumes:
  - name: html
    emptyDir: {}

kubectl exec -it nginx -c nginx2 sh                                 #-c指定pod裡面的容器名進入

hostPath儲存卷

hostPath卷將 node 節點的檔案系統中的檔案或目錄掛載到叢集中。
hostPath可以實現持久儲存,但是在node節點故障時,也會導致資料的丟失。

在 node01 節點上建立掛載目錄
mkdir -p /data/pod/
echo 'node1.com' > /data/pod/index.html

在 node02 節點上建立掛載目錄
mkdir -p /data/pod/
echo 'node2.com' > /data/pod/index.html

建立 Pod 資源
vim pod5.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:                                           #定義容器掛載內容
    - name: html                                               #使用儲存卷名稱於volume定義 的name相同
      mountPath: /usr/share/nginx/html/      #定義容器內的掛載目錄
      readOnly: false                                         #讀寫掛載方式,預設為讀寫模式false             
  volumes: 
    - name: html                                               #定義儲存卷名稱
      hostPath:                                                   #路徑,宿主機儲存路徑
        path: /data/pod/                                    #在宿主機上目錄的路徑
        type: DirectoryOrCreate                        #定義型別,如果宿主機沒有此目錄會自動建立
kubectl get pods -o wide

curl 10.244.2.6                                               #刪除pod重建檔案內容依然存在,直接修改主機內的目錄也可以

nfs共享儲存卷

在新節點(node3)安裝nfs並配置服務
mkdir /data/pod -p
chmod 777 /data/pod/
echo 'node3' > /data/pod/index.html

vim /etc/exports
/data/pod 192.168.150.0/24(rw,no_root_squash)
                                         
systemctl start rpcbind
systemctl start nfs

showmount -e
Export list for localhost.localdomain:
/data/pod 192.168.150.0/24

master節點操作,k8s叢集需要新增主機名對映
vim pod6.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
    - name: html
      nfs:                                                            #指定掛載型別為nfs
        path: /data/pod/                                         
        server: stor03                                     #指定nfs伺服器名,只能是主機名不能為IP地址