必威体育Betway必威体育官网
当前位置:首页 > IT技术

Volume

时间:2019-10-12 18:45:36来源:IT技术作者:seo实验室小编阅读:54次「手机版」
 

volume

概述


什么是Valume

默认情况下容器的数据都是非持久化的,在容器消亡以后数据也跟着丢失,所以 Docker 提供了 Volume 机制以便将数据持久化存储。类似的,Kubernetes 提供了更强大的 Volume 机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题。

与 Docker 不同,Kubernetes Volume 的生命周期与 Pod 绑定。容器挂掉后 Kubelet 再次重启容器时,Volume 的数据依然还在,而 Pod 删除时,Volume 才会清理。数据是否丢失取决于具体的 Volume 类型,比如 emptyDir 的数据会丢失,而 PV 的数据则不会丢

Volume类型

目前,Kubernetes 支持以下 Volume 类型:

emptyDir、hostPath、hostPath、gcepersistentDisk、awsElasticBlockStore、nfs、iscsi、flocker、glusterfs、rbd、cephfs、gitRepo、secret、persistentVolumeClaim、downwardAPI、azureFileVolume、azureDisk、vsphereVolume、Quobyte、PortworxVolume、scaleIO、FlexVolume、StorageOS、local

用的比较多的是:emptyDir、hostPath、nfs、glusterfs

本地数据卷


emptyDir

emptyDir表示空目录,会在宿主机上创建数据卷目录并挂在到容器中。

创建emptyDir类型的数据卷

下面通过yaml文件创建一个emptyDir类型的数据卷:

apiVersion: v1
kind: Pod
metadata:
  name: redis-pod
spec:
  containers:
  - image: redis
    name: redis
    volumemounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

这里会创建一个叫redis-pod的pod,使用redis镜像,然后创建了一个emptyDir类型的volume,并挂载到容器的/cache。注意在yaml文件中volumes的定义和containers的定义在同一级。

创建这个pod:

kubectl create -f empty.yaml

这里写图片描述

查看数据卷

进入到这个pod中,可以看到我们挂载的cache目录:

这里写图片描述

hostPath

可以将宿主机中的目录挂载到容器中。

创建hostPath类型的volume

通过yaml文件创建:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /tmp-test
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /tmp
      type: Directory

这里指定了源宿主机路径为/tmp,并指定它的类型为目录,将它挂在到容器的/tmp-test上

创建:

kubectl create -f hostpath.yaml 

这里写图片描述

查看volume

进入这个pod:

这里写图片描述

可以看到容器将宿主机中的tmp目录挂载到了容器中的tmp-test上,其中的文件就是宿主机的文件。

因为我实在master上查看的,所以下意识看了一下master上的tmp文件,发现文件名不对啊,后来想到应该是看node节点的tmp目录

查看下pod分配到了哪个node,并查看该node下的tmp目录:

这里写图片描述

应用场景

比如说做宿主机性能分析的应用,将proc等目录挂载到容器中可以用到,因为这些目录在任何宿主机上都有。

网络数据卷


NFS

安装nfs

首先另起一台虚拟机安装nfs:

yum install -y rpcbind
yum install -y nfs-utils

配置exports:

echo "/opt/nfs/data *(rw,no_root_squash)" >> /etc/exports

创建nfs挂载文件的相关目录:

mkdir -p /opt/nfs/data
touch /opt/nfs/data/index.html
echo "This is nfs volume test for k8s" >  /opt/nfs/data/index.html

启动nfs:

/etc/init.d/rpcbind start
/etc/init.d/nfs start  

创建nfs类型的volume

通过yaml文件配置:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-nfs
spec:
  replicas: 3
  template:
    metadata:
      labels:
        APP: nginx-nfs
    spec:
      containers:
      - name: nginx-nfs
        image: nginx
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
      volumes:
      - name: wwwroot
        nfs:
        server: 10.10.109.19
        path: /opt/nfs/data

这里指定了创建3副本的nginx,并指定nfs数据卷服务器为10.10.109.19,挂载/opt/wwwroot到容器的/usr/share/nginx/html

创建:

kubectl create -f nfs.yaml

这里写图片描述

访问测试

首先将pod作为服务发布:

apiVersion: v1
kind: Service
metadata:
  name: nginx-nfs-svc 
  labels:
    app: nginx-nfs
spec:
  ports:
  - port: 90
    targetPort: 80
  selector:
    app: nginx-nfs

发布:

kubectl create -f nginx-service.yaml

这里写图片描述

在node节点通过clusterIP进行访问.

GlusterFS

这是一个主流的分布式的存储,可以保证数据的可靠性和提高性能。

Presustent Volumes 持久卷


相关概念

Presustent Volumes:又称为 PV,持久卷,是对存储抽象实现,是的存储作为集群中的资源

Presustent VolumesClaim:又称 PVC,持久卷申请,PVC消费PV资源

pv 和 pvc是一种对底层存储抽象化管理的机制。pod 申请 PVC作为卷来使用,集群通过PVC查找绑定的PV,并挂在给pod

PV类型

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • AzureFile
  • AzureDisk
  • FC (Fibre Channel)
  • FlexVolume
  • Flocker
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • CephFS
  • Cinder (OpenStack block storage)
  • Glusterfs
  • VsphereVolume
  • Quobyte Volumes
  • HostPath
  • VMware Photon
  • Portworx Volumes
  • ScaleIO Volumes
  • StorageOS

PV设定时的重要参数

访问模式(accessModes)

accessModes 主要有如下的几个:

  • ReadWriteOnce:读写挂载在一个节点上(谁用谁挂载)
  • ReadOnlyMany:只读挂载在多个节点上
  • ReadWriteMany:读写挂载在多个节点上

回收策略(Recycling Policy)

主要的Recycling Policy有如下三个:

  • retain:不做任何操作,不使用的时候需要手动删除(默认)
  • Recycle:没有PVC使用的时候清空数据让其他PVC使用
  • Delete:

PV状态(Phase)

常见的Phase有如下几种:

- Available:可用(可以被新的pvc挂载)

- Bound:已经被pvc挂载了

- Released:pvc已不再使用需要回收

- failed:创建失败

创建一个PV

通过nfs创建

这也是我这里采用的方法

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /opt/nfs/data
    server: 10.10.109.19

kubectl create -f nfs-pv.yaml

通过glusterfs创建

apiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "gv0"
    readOnly: false

查看创建的PV资源:

这里写图片描述

可以看到通过NFS创建的容量5G的pv已经成功了

创建pvc

只创建pv并不能直接使用,还需要pvc进行对pv的消费

pvc是统一的,不用考虑后端是nfs还是glusterfs

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc001
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

kubectl create -f pvc.yaml

requests指定了这个pvc申请多大的pv

一般情况下可能会有多个pv,这种情况下pvc如何绑定pv的呢?其实是有两个条件:

1、根据pvc申请的容量,采用最小匹配原则,例如有5G、10G、20G的pv,pvc申请4G,那么就会匹配到5G的pv

2、根据访问模式匹配,匹配访问模式和pv模式一直的

查看创建情况:

这里写图片描述

可以看到pv和pvc已经是绑定的状态。

创建应用

现在创建一个nginx应用来使用这个pvc:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: wwwroot
  volumes:
    - name: wwwroot
      persistentVolumeClaim:
        claimName: pvc001

kubectl create -f pvc-app.yaml

在这个应用创建的时候指定了使用pvc的名称为pvc001

查看创建结果:

这里写图片描述

已经创建成功了

查看一下这个pod的ip,然后在任意节点上访问测试下这个pod:

现在nginx的页面是nfs中的index的内容

然后尝试修改一下nfs中的index的内容然后重新访问:

在修改后nginx的页面也同时更改了

pv和pvc带来的好处

首先就是不需要过多的关注后端的存储,不论后端是nfs还是glasterfs,对于开发人员更加友好。

另外就是方便统一管理后端存储,运维人员负责生成不同大小的pv,开发人员只需要请求合适的pvc即可。

相关阅读

FancyCache Volume 0.8.0

下载:http://www.ctdisk.com/file/8139185 FancyCache 概述 FancyCache是一个可以将系统内存或闪存虚拟成硬盘缓存的软件。它把从

电脑里每个盘下都出现$RECYCLE.BIN和system volume in

电脑里每个盘下都出现$RECYCLE.BIN和system volume information等文件夹,如下:     解决方案:如下图片中的四步操作。解释:首先说

分享到:

栏目导航

推荐阅读

热门阅读