1.存儲卷概述html
由於pod是有生命週期的,pod一重啓,裏面的數據就沒了,因此咱們須要數據持久化存儲,在k8s中,存儲卷不屬於容器,而是屬於pod,也就是說同一個pod中的容器能夠共享一個存儲卷,存儲卷能夠是宿主機上的目錄,也能夠是掛載在宿主機上的外部設備.node
存儲卷類型:nginx
emptyDIR存儲卷:pod一重啓,存儲卷也刪除,這叫emptyDir存儲卷,通常用於當作臨時空間或緩存關係;vim
hostPath存儲卷:宿主機上目錄做爲存儲卷,這種也不是真正意義實現了數據持久性;api
SAN(iscsi)或NAS(nfs、cifs):網絡存儲設備;緩存
分佈式存儲:ceph,glusterfs,cephfs,rbdbash
雲存儲:亞馬遜的EBS,Azure Disk,阿里雲,關鍵數據必定要有異地備份網絡
a.emptyDIR存儲卷app
vim podtest/pod-vol-demo.yaml apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default labels: app: myapp tier: frontend spec: containers: - name: myapp image: ikubernetes/myapp:v2 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html - name: busybox image: busybox:latest imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /data/ command: ["/bin/sh"] args: ["-c","while true;do echo $(date) >> /data/index.html; sleep 10;done"] volumes: - name: html emptyDir: {} volumeMounts:把哪一個存儲卷掛到pod中的哪一個目錄下 emptyDir:不設置意味着對這個參數下的兩個選項不作限制
b.hostPath:使用宿主機上目錄做爲存儲卷frontend
kubectl explain pods.spec.volumes.hostPath.type DirectoryOrCreate:要掛載的路徑是一個目錄,不存在就建立目錄; Directory:宿主機上必須實現存在目錄,若是不存在就報錯; FileOrCreate:表示掛載的是文件,若是不存在就建立; File:表示要掛載的文件必須事先存在,不然就報錯. cat pod-hostpath-vol.yaml apiVersion: v1 kind: Pod metadata: name: pod-vol-hostpath namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v2 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ volumes: - name: html hostPath: path: /data/pod/volume1 type: DirectoryOrCreate hostPath:宿主機上的目錄. volumes的名字能夠隨便取,這是存儲卷的名字,可是上面的volumeMounts指定時, name必須和存儲卷的名字一致,這樣二者才創建了聯繫.
c.nfs作共享存儲
這裏爲了方便,把master節點當作nfs存儲,三個節點均執行 yum -y install nfs-utils # 而後在master上啓動nfs mkdir /data/volumes cat /etc/exports /data/volumes 10.0.0.0/16(rw,no_root_squash) systemctl start nfs 在node1和node2上試掛載 mount -t nfs k8s-master:/data/volumes /mnt cat pod-vol-nfs.yaml apiVersion: v1 kind: Pod metadata: name: pod-vol-nfs namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v2 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ volumes: - name: html nfs: path: /data/volumes server: k8s-master kubectl apply -f pod-vol-nfs.yaml 此時無論pod被創建在哪一個節點上,對應節點上是不存放數據的,數據都在nfs主機上
d.pvc和pv
用戶只須要掛載pvc到容器中而不須要關注存儲卷採用何種技術實現.pvc和pv的關係與pod和node關係相似,前者消耗後者的資源,pvc能夠向pv申請指定大小的存儲資源並設置訪問模式.
在定義pod時,咱們只須要說明咱們要一個多大的存儲卷就好了,pvc存儲卷必須與當前namespace的pvc創建直接綁定關係,pvc必須與pv創建綁定關係,而pv是真正的某個存儲設備上的空間.
一個pvc和pv是一一對應關係,一旦一個pv被一個pvc綁定了,那麼這個pv就不能被其餘pvc綁定了,一個pvc是能夠被多個pod所訪問的,pvc在名稱空間中,pv是集羣級別的.
將master做爲存儲節點,建立掛載目錄
cd /data/volumes && mkdir v{1,2,3,4,5} cat /etc/exports /data/volumes/v1 10.0.0.0/16(rw,no_root_squash) /data/volumes/v2 10.0.0.0/16(rw,no_root_squash) /data/volumes/v3 10.0.0.0/16(rw,no_root_squash) exportfs -arv showmount -e kubectl explain pv.spec.nfs accessModes模式有: ReadWriteOnce:單路讀寫,能夠簡寫爲RWO; ReadOnlyMany:多路只讀,能夠簡寫爲ROX; ReadWriteMany:多路讀寫,能夠簡寫爲RWX # 先將存儲設備定義爲pv cat pv-demo.yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv001 # 定義pv時不用加名稱空間,由於pv是集羣級別 labels: name: pv001 spec: nfs: path: /data/volumes/v1 server: k8s-master accessModes: ["ReadWriteMany","ReadWriteOnce"] capacity: # 分配磁盤空間大小 storage: 3Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv002 labels: name: pv002 spec: nfs: path: /data/volumes/v2 server: k8s-master accessModes: ["ReadWriteOnce"] capacity: storage: 5Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv003 labels: name: pv003 spec: nfs: path: /data/volumes/v3 server: k8s-master accessModes: ["ReadWriteMany","ReadWriteOnce"] capacity: storage: 8Gi kubectl apply -f pv-demo.yaml kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS pv001 3Gi RWO,RWX Retain Available pv002 5Gi RWO Retain Available pv003 8Gi RWO,RWX Retain Available
回收策略:
若是某個pvc在pv裏面存數據了,後來pvc刪了,那麼pv裏面的數據怎麼處理
reclaim_policy:即pvc刪了,但pv裏面的數據不刪除,還保留着;
recycle:即pvc刪了,那麼就把pv裏面的數據也刪了;
delete:即pvc刪了,那麼就把pv也刪了.
# 建立pvc的清單文件 kubectl explain pods.spec.volumes.persistentVolumeClaim cat pod-vol-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim # 簡稱pvc metadata: name: mypvc namespace: default # pvc和pod在同一個名稱空間 spec: accessModes: ["ReadWriteMany"] # 必定是pv策略的子集 resources: requests: storage: 7Gi # 申請一個大小至少爲7G的pv --- apiVersion: v1 kind: Pod metadata: name: pod-vol-pvc namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v1 volumeMounts: - name: html # 使用的存儲卷的名字 mountPath: /usr/share/nginx/html/ #掛載路徑 volumes: - name: html persistentVolumeClaim: claimName: mypvc # 表示要使用哪一個pvc
因此pod的存儲卷類型若是是pvc,則:pod指定的pvc須要先匹配一個pv,才能被pod所掛載,在k8s 1.10以後,不能手工從底層刪除pv.
參考博客:http://blog.itpub.net/28916011/viewspace-2214804/