云计算
k8s之数据持久化
kubernetes存储卷:
我们知道默认情况下容器的数据都是非持久化的,在容器销毁以后数据也跟着丢失,所以docker提供了volume机制以便将数据持久化存储。类似的,k8s提供了更强大的volume机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题。
volume:
我们经常会说:容器和 pod 是短暂的。
其含义是它们的生命周期可能很短,会被频繁地销毁和创建。容器销毁时,保存在容器内部文件系统中的数据都会被清除。为了持久化保存容器的数据,可以使用k8s volume。
volume 的生命周期独立于容器,pod 中的容器可能被销毁和重建,但 volume 会被保留。
k8s支持的volume类型有emptydir,hostpath,persistentvolumeclaim,gcepersistentdisk,awselasticblockstore,nfs,iscsi,gitrepo,secret等等,完整列表及详细文档可参考 http://docs.kubernetes.org.cn/429.html。
在本文中主要实践以下几种volume类型:
1,emptydir(临时存储):
emptydir 是最基础的 volume 类型。正如其名字所示,一个 emptydir volume 是 host 上的一个空目录。也就是宿主机上没有指定的目录或文件,直接由pod内部映射到宿主机上。(类似于docker中的docker manager volume 挂载方式)
我们通过下面的例子来实践emptydir:
[root@master yaml]# vim emptydir.yamlapiversion: v1kind: podmetadata: name: read-writespec: containers: - name: write image: busybox volumemounts: #定义数据持久化 - mountpath: /write #定义挂载目录,该目录是pod内部的目录 name: share-volume args: - /bin/sh - -c - echo hello volumes > /write/hello; sleep 3000; - name: read #在该pod内定义第二个容器 image: busybox volumemounts: - mountpath: /read name: share-volume args: - /bin/sh - -c - cat /read/hello; sleep 30000; volumes: - name: share-volume emptydir: {} #定义一个数据持久化的类型empytdir我们模拟一个pod里运行了两个容器,两个容器共享一个volume,一个负责写入数据,一个负责读取数据。
//运行该pod, 并进行查看:[root@master yaml]# kubectl apply -f emptydir.yaml pod/read-write created[root@master yaml]# kubectl get pod -o widename ready status restarts age ip node nominated node readiness gatesread-write 2/2 running 0 14s 10.244.2.2 node02 <none> <none>//我们分别查看两个容器中的挂载内容:[root@master yaml]# kubectl exec -it read-write -c read cat /read/hellohello volumes[root@master yaml]# kubectl exec -it read-write -c write cat /write/hellohello volumes参数解释:
-c :为指定某个容器,是–container= 的缩写,可以通过–help进行查看。
因为 emptydir 是 docker host 文件系统里的目录,其效果相当于执行了 docker run -v /write 和 docker run -v /read。我们在node02
上通过 docker inspect 分别查看容器的详细配置信息,我们发现两个容器都 mount 了同一个目录:
mounts: [ { type: bind, source: /var/lib/kubelet/pods/756b4f4a-917a-414d-a7ee-523eecf05465/volumes/kubernetes.io~empty-dir/share-volume, destination: /read, mode: , rw: true, propagation: rprivate }, { type: bind, source: /var/lib/kubelet/pods/756b4f4a-917a-414d-a7ee-523eecf05465/volumes/kubernetes.io~empty-dir/share-volume, destination: /write, mode: , rw: true, propagation: rprivate },这里的"/var/lib/kubelet/pods/756b4f4a-917a-414d-a7ee-523eecf05465/volumes/kubernetes.io~empty-dir/share-volume"就是emptydir 挂载到dockerhost上的真正路径。
所以我们可以进入到该路径下进行查看:
[root@node02 ~]# cd /var/lib/kubelet/pods/756b4f4a-917a-414d-a7ee-523eecf05465/volumes/kubernetes.io~empty-dir/share-volume/[root@node02 share-volume]# cat hello hello volumes总结emptydir:
同个pod里边的不同容器,共享同一个持久化目录。当pod节点删除时,volume的内容也会被删除,但如果仅是容器被销毁,pod还在,则volume不受影响。也就是说emptydir的数据持久化的生命周期和使用的pod一致。一般作为临时存储使用,以及长时间任务的中间过程checkpoint的临时保存目录,及多容器共享目录。
2,hostpath:
1)将宿主机上已经存在的目录或文件挂载到容器内部。
2)这种持久化方式,运用场景不多,因为我们使用虚拟化技术的核心就是为了于宿主机进行隔离,但这种方式它增加了pod于节点之间的耦合。
3)一般对于k8s集群本身的数据持久化,和docker本身的数据持久化会使用这种方式。
比如 kube-apiserver 和 kube-controller-manager 就是这样的应用。
我们通过"kubectl edit -n kube-system pod kube-apiserver-master"命令来查看 kube-apiserver pod 的配置,下面是 volume 的相关部分:
volumemounts:- mountpath: /etc/ssl/certs name: ca-certs readonly: true- mountpath: /etc/pki name: etc-pki readonly: true- mountpath: /etc/kubernetes/pki name: k8s-certs readonly: true volumes: - hostpath: path: /etc/ssl/certs type: directoryorcreate name: ca-certs - hostpath: path: /etc/pki type: directoryorcreate name: etc-pki - hostpath: path: /etc/kubernetes/pki type: directoryorcr
武汉云服务器购买价格实惠云服务器今日价格华为云服务器怎么开启安全组数字经济时代 新外贸形式有什么特征这个站打不开-虚拟主机/数据库问题关于备案问题-云服务器问题郑州网站建设选合适模板有哪些好处电脑中Edge浏览器窗口关不掉怎么办?无法关闭Edge浏览器的解决方法