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节点的数据都是同样的,建立的数据都会更新上去,删除容器,不会删除数据卷的数据。