K8s進階之數據卷與數據持久卷
目錄:node
一 從外部訪問應用最佳方式 二 配置管理 三 數據卷與數據持久卷 四 再談有狀態應用部署 五 K8S 安全機制
3、數據卷與數據持久卷
數據卷產生的背景
爲何有數據卷,這裏的數據卷和docker的數據卷還不太同樣,實現的機制不是一套,數據卷說白了就是能幫助你持久化你pod重要的數據,若是你不持久化的話,pod刪除裏面臨時產生的數據也會被刪除,這無論是k8s中仍是docker中,這都是同樣的,因此k8s和docker都提供了這種volume的這種相關功能,就是爲了持久化你容器中的數據,能讓它重建或者刪除,數據依然存在。nginx
• Kubernetes中的Volume提供了在容器中掛載外部存儲的能力 ,也就是部署k8s自身的存儲了,就比如本身搭建一個分佈式存儲,比如公有云的雲盤存儲,這樣是能夠掛在集羣以外的存儲能夠掛在k8s中去使用。
pod要想使用這種存儲必須定義兩點:
• Pod須要設置捲來源(spec.volume)和掛載點(spec.containers.volumeMounts)兩個信息後纔可使用相應的Volumeweb
來看一下卷的類型最好的解釋就是官方:
來看一下官方怎麼說的:
https://kubernetes.io/docs/concepts/storage/volumes/
第一種就是本地卷
像hostPath類型與docker裏面的bind mount類型,就是直接掛載到宿主機文件的類型
像emptyDir是這樣本地卷,也就是相似於volume類型
這兩點都是綁定node節點的redis
第二種就是網絡數據卷
好比Nfs、ClusterFs、Ceph,這些都是外部的存儲均可以掛載到k8s上docker
第三種就是雲盤
好比AWS、微軟(azuredisk)vim
第四種就是k8s自身的資源
好比secret、configmap、downwardAPIcentos
先來看一下本地卷
像emptyDir相似與docker的volume,而docker刪除容器,數據卷還會存在,而emptyDir刪除容器,數據卷也會丟失,通常這個只作臨時數據捲來使用api
建立一個空卷,掛載到Pod中的容器。Pod刪除該卷也會被刪除。
應用場景:Pod中容器之間數據共享
emptyDir類型安全
[root@k8s-master demo]# vim emptydir.yaml apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: write image: centos command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"] volumeMounts: - name: data mountPath: /data - name: read image: centos command: ["bash","-c","tail -f /data/hello"] volumeMounts: - name: data mountPath: /data volumes: - name: data emptyDir: {} [root@k8s-master demo]# kubectl create -f emptydir.yaml [root@k8s-master demo]# kubectl get pod NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 13 67m mypod 1/1 Running 0 3h30m mypod2 1/1 Running 0 3h24m mypod3 0/1 Completed 0 3h5m mypod4 0/1 Completed 0 3h nginx-5ddcc6cb74-lplxl 1/1 Running 0 4h8m [root@k8s-master demo]# kubectl logs my-pod read
Hostpath類型bash
掛載Node文件系統上文件或者目錄到Pod中的容器。
應用場景:Pod中容器須要訪問宿主機文件
[root@k8s-master demo]# vim hostpath.yaml apiVersion: v1 kind: Pod metadata: name: my-pod2 spec: containers: - name: busybox image: busybox args: - /bin/sh - -c - sleep 36000 volumeMounts: - name: data mountPath: /data volumes: - name: data hostPath: path: /tmp type: Directory
[root@k8s-master demo]# kubectl create -f hostpath.yaml [root@k8s-master demo]# kubectl get pod NAME READY STATUS RESTARTS AGE my-pod2 1/1 Running 0 12s mypod 1/1 Running 0 4h43m mypod2 1/1 Running 0 4h37m mypod3 0/1 Completed 0 4h17m mypod4 0/1 Completed 0 4h12m nginx-5ddcc6cb74-lplxl 1/1 Running 0 5h20m web-67fcf9bf8-mrlhd 1/1 Running 0 20m [root@k8s-master demo]# kubectl exec -it my-pod2 sh cd /data/ ls
這裏建立的數據和咱們被分配的node節點的數據都是同樣的,建立的數據都會更新上去,刪除容器,不會刪除數據卷的數據。