本章目錄
- 存儲分類
- emptydir
- hostpath
- pvc,pv,nfs
一 k8s存儲分類
我一直相信畫出圖來再去了解比較直觀,下面是我總結的k8s存儲的分類,供參考html
k8s的存儲經常使用的就是上面幾種模式,分爲臨時存儲,半持久化存儲,與持久化存儲這三類,本章咱們着重講解emptydir與hostpath與pvc跟pv等node
二 emptydir
1 emptydir是什麼nginx
當pod的存儲方案設定爲emptydir的時候,pod啓動時,就會在pod所在節點的磁盤空間開闢出一塊空卷,最開始裏面是什麼都沒有的,pod啓動後容器產生的數據會存放到那個空卷中。空卷變成了一個臨時卷web
供pod內的容器讀取和寫入數據,一旦pod容器消失,節點上開闢出的這個臨時卷就會隨着pod的銷燬而銷燬docker
2 emptydir的用途api
- 充當臨時存儲空間,當pod內容器產生的數據不須要作持久化存儲的時候用emptydir
- 設制檢查點以從崩潰事件中恢復未執行完畢的長計算
通常來講emptydir的用途都是用來充當臨時存儲空間,例如一些不須要數據持久化的微服務,咱們均可以用emptydir來當作微服務pod的存儲方案網絡
3 emptydir例子app
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: test-pd 5 spec: 6 containers: 7 - image: k8s.gcr.io/test-webserver 8 name: test-container 9 volumeMounts: 10 - mountPath: /cache #掛載到容器中的路徑 11 name: cache-volume 12 volumes: 13 - name: cache-volume 14 emptyDir: {} #指定存儲方式爲emptydir
三 hostpath
1 hospath 是什麼微服務
hostPath類型則是映射node文件系統中的文件或者目錄到pod裏。在使用hostPath類型的存儲卷時,也能夠設置type字段,支持的類型有文件、目錄、File、Socket、CharDevice和BlockDevice(我只映射過文件與目錄)。this
其實這個功能就至關於docker中的-v 目錄映射,只不過在k8s中的時候,pod會漂移,當pod漂移到其餘node節點的時候,pod不會跨節點的去讀取目錄。因此說hostpath只能算一種半持久化的存儲方式
2 hostpath用途
- 當運行的容器須要訪問Docker內部結構時,如使用hostPath映射/var/lib/docker到容器;
- 當在容器中運行cAdvisor時,可使用hostPath映射/dev/cgroups到容器中;
3 hostpath 例子
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: test-pd 5 spec: 6 containers: 7 - image: k8s.gcr.io/test-webserver 8 name: test-container 9 volumeMounts: 10 - mountPath: /test-pd 11 name: test-volume 12 volumes: 13 - name: test-volume 14 hostPath: 15 # directory location on host 16 path: /data #node節點上的路徑 17 # this field is optional 18 type: Directory #path的屬性,下面會介紹可選屬性的值
四 持久化存儲-pvc pv nfs
上面介紹了倆種臨時存儲於半持久化存儲的方案。在k8s實際生產環境中,通常會選用私有云持久化存儲方案還有公有云持久化存儲方案,私有云存儲方案包括nfs,ceph,glusterfs等方案。公有云存儲會用到AWS等方案
存儲方案各有各的優缺點,可參考https://www.cnblogs.com/yswenli/p/7234579.html這篇文章。今天咱們主要講解pvc,pv,nfs之間的關係。
簡單來講,要使用持久化存儲,就須要使用pvc去跟pv去申請,而後pv查看本身有沒有合適的存儲空間卷,有合適的就與pvc進行綁定。pv與pvc是一一對應綁定的。如今咱們用一幅圖來講明pvc,pv,nfs的關係
針對上面的圖作一下說明
1 pod的yaml中先指明存儲選擇pvc申請方式
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: pvnginx 5 labels: 6 app: pvnginx 7 spec: 8 containers: 9 - name: my-pvnginx 10 image: nginx 11 ports: 12 - name: http 13 containerPort: 80 14 - name: https 15 containerPort: 443 16 volumeMounts: 17 - name: html 18 mountPath: /data/html 19 volumes: 20 - name: html 21 persistentVolumeClaim: #指明使用pvc模式 22 claimname: mypvc #指明使用的pvc名稱,下面咱們須要建一個叫作mypvc的yaml資源
2 建立一個叫作mypvc的pvc yaml資源
1 apiVersion: v1 2 kind: persisitentVolumeClaim 3 metadata: 4 name: mypvc 5 namespace: default 6 spec: 7 accessmodes: ["ReadWriteMany"] #一共有三種模式,下面會一一說明 8 resources: #指定資源說明 9 requests: #指定請求 10 storage: 4Gi #指定請求存儲空間的大小
* ReadWriteOnce – PV以 read-write 掛載到一個節點
* ReadOnlyMany – PV以read-only方式掛載到多個節點
* ReadWriteMany – PV以read-write方式掛載到多個節點
3 設置符合條件的pv
1 apiVersion: v1 2 kind: PersistentVolume 3 metadata: 4 name: pv01 5 labels: 6 name: pv01 7 spec: 8 accessModes: ["ReadWriteMany"] 9 capacity: 10 storage: 5Gi 11 12 nfs: 13 server: 192.168.115.6 14 path: /home
4 nfs建立存儲卷
NFS 是Network File System的縮寫,即網絡文件系統。Kubernetes中經過簡單地配置就能夠掛載NFS到Pod中,而NFS中的數據是能夠永久保存的,同時NFS支持同時寫操做。
1 # yum -y install nfs-util* 2 # cat /etc/exports 3 /home 192.168.115.0/24(rw,sync,no_root_squash) 4 # systemctl start rpcbind 5 # systemctl start nfs 6 # showmount -e 127.0.0.1 7 Export list for 127.0.0.1: 8 /home 192.168.115.0/24
上面就是建立私有云存儲方案的一個例子。當咱們要使用持久化存儲的時候,大致步驟是這樣的
- 首先選擇是什麼存儲,是公有云存儲仍是私有云存儲
- 公有云存儲方案根據廠商的不通,配置方法也不一樣。這個要根據廠商文檔來操做。私有云存儲的時候,選擇好文件系統(ceph,glusterfs,nfs,moosefs)
- 搭建好文件系統以後,建立不通存儲大小的pv資源(若是業務量大,pod多,須要採用動態的pv,動態pv在k8s實戰中會講解)
- 文件系統與pv都搭建好以後,根據pod去分配存儲空間,而後建立對應的pvc就可使用存儲了