本文收录在容器技术学习系列文章总目录html
默认状况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏以后,kubelet 会重启这个容器,可是文件会丢失-这个容器会是一个全新的状态;第二,当不少容器在同一Pod中运行的时候,不少时候须要数据文件的共享。Kubernete Volume解决了这个问题。node
Docker有一个Volumes的概念,虽然这个Volume有点宽松和管理性比较小。在Docker中,一个 Volume 是一个简单的所在主机的一个目录或者其它容器中的。生命周期是没有办法管理,直到最近才有 local-disk-backed 磁盘。Docker如今提供了磁盘驱动,可是功能很是有限(例如Docker1.7只能挂在一个磁盘每一个容器,而且没法传递参数)nginx
从另一个方面讲,Kubernetes volume,拥有明确的生命周期,与所在的Pod的生命周期相同。所以,Kubernetes volume独立与任何容器,与Pod相关,因此数据在重启的过程当中还会保留,固然,若是这个Pod被删除了,那么这些数据也会被删除。更重要的是,Kubernetes volume 支持多种类型,任何容器均可以使用多个Kubernetes volume。git
它的核心,一个 volume 就是一个目录,可能包含一些数据,这些数据对pod中的全部容器都是可用的,这个目录怎么使用,什么类型,由什么组成都是由特殊的volume 类型决定的。github
要使用Volume,pod须要指定Volume的类型和内容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)。vim
容器中的进程能够当作由Docker镜像和卷组成的文件系统视图。Docker镜像位于文件系统层次结构的根目录下,任何卷都安装在图像中的指定路径上。卷没法装入其余卷或具备到其余卷的硬连接。Pod中的每一个容器必须独立指定每一个卷的安装位置。api
$ kubectl explain pod.spec.volumes 查询k8s支持的全部类型存储卷
使用emptyDir,当Pod分配到Node上时,将会建立emptyDir,而且只要Node上的Pod一直运行,Volume就会一直存。当Pod(无论任何缘由)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。缓存
经常使用于做为临时目录、或缓存使用。bash
(1)编写yaml文件,并建立服务器
先建立一个名为html的存储卷;再由2个pod都挂载此存储卷;
pod1基于此存储卷做为nginx的主目录;pod2向此存储卷目录写入东西;
[root@master volumes]# vim vol-emptyDir-demo.yaml apiVersion: v1 kind: Pod metadata: name: pod-vol-demo namespace: default labels: app: myapp tier: frontend annotations: along.com/created-by: "cluster admin" spec: volumes: - name: html emptyDir: {} containers: - name: myapp image: ikubernetes/myapp:v1 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" - "-c" - "while true; do echo $(date) >> /data/index.html; sleep 2; done" [root@master volumes]# kubectl apply -f vol-emptyDir-demo.yaml pod/pod-vol-demo created
(2)验证
---pod建立成功 [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE pod-vol-demo 2/2 Running 0 13s 10.244.1.106 node1 ---访问业务,输出是pod2的输入 [root@master ~]# curl 10.244.1.106 Tue Jan 29 07:19:13 UTC 2019 Tue Jan 29 07:19:15 UTC 2019 Tue Jan 29 07:19:17 UTC 2019 Tue Jan 29 07:19:19 UTC 2019 Tue Jan 29 07:19:21 UTC 2019 Tue Jan 29 07:19:23 UTC 2019 Tue Jan 29 07:19:25 UTC 2019 Tue Jan 29 07:19:27 UTC 2019 Tue Jan 29 07:19:29 UTC 2019
hostPath容许挂载Node(宿主机)上的文件系统到Pod里面去。若是Pod须要使用Node上的文件,可使用hostPath。
值 | 行为 |
---|---|
空 | 空字符串(默认)用于向后兼容,这意味着在安装hostPath卷以前不会执行任何检查。 |
DirectoryOrCreate |
若是给定路径中不存在任何内容,则将根据须要建立一个空目录,权限设置为0755,与Kubelet具备相同的组和全部权。 |
Directory |
目录必须存在于给定路径中 |
FileOrCreate |
若是给定路径中不存在任何内容,则会根据须要建立一个空文件,权限设置为0644,与Kubelet具备相同的组和全部权。 |
File |
文件必须存在于给定路径中 |
Socket |
UNIX套接字必须存在于给定路径中 |
CharDevice |
字符设备必须存在于给定路径中 |
BlockDevice |
块设备必须存在于给定路径中 |
(1)编写yaml文件,并建立
建立存储卷,使用DirectoryOrCreate类型,node节点不存在会自动建立
[root@master volumes]# vim vol-hostpath-demo.yaml apiVersion: v1 kind: Pod metadata: name: vol-hostpath namespace: default spec: volumes: - name: html hostPath: path: /data/pod/volume1/ type: DirectoryOrCreate containers: - name: myapp image: ikubernetes/myapp:v1 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ [root@master volumes]# kubectl apply -f vol-hostpath-demo.yaml pod/vol-hostpath created
(2)查询验证
[root@master volumes]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE vol-hostpath 1/1 Running 0 3s 10.244.1.111 node1 ---在node1上查询是否生产目录 [root@node1 ~]# ll -d /data/pod/volume1/index.html -rw-r--r-- 1 root root 17 Sep 21 14:44 /data/pod/volume1/index.html
(3)验证存储卷功能
---在node1上生成文件 [root@node1 ~]# echo "node01.along.com" > /data/pod/volume1/index.html ---访问pod内服务,显示成功 [root@master volumes]# curl 10.244.1.111 node01.along.com
(4)就算pod被删除再重建,只要node还在,存储卷就还在
[root@master volumes]# kubectl delete -f vol-hostpath-demo.yaml pod "vol-hostpath" deleted [root@master volumes]# kubectl apply -f vol-hostpath-demo.yaml pod/vol-hostpath created [root@master volumes]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE vol-hostpath 1/1 Running 0 3s 10.244.1.112 node1 [root@master volumes]# curl 10.244.1.112 node01.along.com
NFS 是Network File System的缩写,即网络文件系统。Kubernetes中经过简单地配置就能够挂载NFS到Pod中,而NFS中的数据是能够永久保存的,同时NFS支持同时写操做。Pod被删除时,Volume被卸载,内容被保留。这就意味着NFS可以容许咱们提早对数据进行处理,并且这些数据能够在Pod之间相互传递。
(1)事前准备
① 修改k8s集群服务的hosts文件,使之能解析nfs服务器
[root@master volumes]# vim /etc/hosts 192.168.130.103 master 192.168.130.104 node1 192.168.130.105 node2 192.168.130.106 nfs
② 在k8s集群服务器,安装nfs-utils 工具
$ yum -y install nfs-utils
(2)在106服务器上提供nfs服务
[root@nfs ~]# yum -y install nfs-utils [root@nfs ~]# mkdir /data/volumes -p [root@nfs ~]# vim /data/volumes/index.html <h1>NFS stor</h1> [root@nfs ~]# vim /etc/exports /data/volumes 192.168.130.0/24(rw,no_root_squash) [root@nfs ~]# systemctl start nfs
(1)编写yaml文件,并建立
[root@master volumes]# vim vol-nfs-demo.yaml apiVersion: v1 kind: Pod metadata: name: vol-nfs namespace: default spec: volumes: - name: html nfs: path: /data/volumes server: nfs containers: - name: myapp image: ikubernetes/myapp:v1 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ [root@master volumes]# kubectl apply -f vol-nfs-demo.yaml pod/vol-nfs created
(2)验证,访问服务成功
[root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE vol-nfs 1/1 Running 0 9s 10.244.1.115 node1 [root@master ~]# curl 10.244.1.115 <h1>NFS stor</h1>
删除pod,再建立,也还存在数据。
(1)介绍
gitRepo volume将git代码下拉到指定的容器路径中
(2)示例
apiVersion: v1 kind: Pod metadata: name: server spec: volumes: - name: git-volume gitRepo: repository: "git@github.com:alonghub/my-git-repository.git" revision: "22f1d8406d464b0c0874075539c1f2e96c253775" containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 volumeMounts: - name: git-volume mountPath: /usr/share/nginx/html/
glusterfs,容许将Glusterfs(一个开源网络文件系统)Volume安装到pod中。不一样于emptyDir,Pod被删除时,Volume只是被卸载,内容被保留。味着glusterfs可以容许咱们提早对数据进行处理,并且这些数据能够在Pod之间“切换”。
注意::必须先运行本身的GlusterFS安装,而后才能使用它。
有关更多详细信息,请参阅GlusterFS示例。
RBD容许Rados Block Device格式的磁盘挂载到Pod中,一样的,当pod被删除的时候,rbd也仅仅是被卸载,内容保留,rbd可以容许咱们提早对数据进行处理,并且这些数据能够在Pod之间“切换”。
有关更多详细信息,请参阅RBD示例。
cephfs Volume能够将已经存在的CephFS Volume挂载到pod中,与emptyDir特色不一样,pod被删除的时,cephfs仅被被卸载,内容保留。cephfs可以容许咱们提早对数据进行处理,并且这些数据能够在Pod之间“切换”。
提示:可使用本身的Ceph服务器运行导出,而后在使用cephfs。
有关更多详细信息,请参阅CephFS示例。