一、 什么是Volume

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

    与 Docker 不同,Kubernetes Volume 的生命周期与 Pod 绑定。容器挂掉后 Kubelet 再次重启容器时,Volume 的数据依然还在,而 Pod 删除时,Volume 才会清理。数据是否丢失取决于具体的 Volume 类型,比如 emptyDir 的数据会丢失,而 PV 的数据则不会丢
    —————————————————-
    二、k8s常用的 Volume类型
    emptyDir:把宿主机的空目录挂载到pod, 会在宿主机上创建数据卷目录并挂在到容器中。这种方式,Pod被删除后,数据也会丢失

    hostPath:把宿主机的真实存在的目录挂载到pod

    nfs:把nfs共享存储的目录挂载到pod

    glusterfs:把glusterFS集群文件系统挂载到pod

    cephrbd/cephfs: 把cephrbd集群块存储/cephfs集群文件系统挂载到pod

    三、 emptyDir类型演示

    创建emptyDir.ymal文件,内容如下:

    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镜像,创建一个叫redis-pod的pod,并在宿主机上创建一个空目录挂载到pod的/cache目录下。
    创建pod:
    kubectl create -f emptdir.ymal
    常用的Volume类型: - 图1
    常用的Volume类型: - 图2
    四、 HostPath类型演示
    在所有节点上创建/k8sdata目录,并创建一个文件
    mkdir /k8sdata
    echo “hello” > /k8sdata/testfile
    创建hostPath.ymal文件
    apiVersion: v1

    kind: Pod

    metadata:

    name: test-pod

    spec:

    containers:

    • image: nginx

      name: test-container

      volumeMounts:

      • mountPath: /test

        name: test-volume

      volumes:

    • name: test-volume

      hostPath:

      path: /k8sdata
      把源主机止的/k8sdata目录挂载到pod的/test目录下。
      创建pod
      kubectl create -f hostPath.ymal
      常用的Volume类型: - 图3
      进去看一下

    五、 NFS类型演示

    在集群外的一个节点上安装NFS,我这里使用了192.168.117.90作为NFS服务器,并执行如下命令:

    yum install -y rpcbind

    yum install -y nfs-utils

    echo “/nfs *(rw,no_root_squash)” >> /etc/exports

    mkdir /nfs

    echo “hello nfs” > /nfs/index.html

    启动nfs
    systemctl restart rpcbind
    systemctl status rpcbind
    systemctl enable rpcbind
    systemctl restart nfs
    systemctl status nfs
    systemctl enable nfs

    在master上创建nginx-nfs.ymal文件
    cat nginx-nfs.ymal

    apiVersion: v1

    kind: ReplicationController

    metadata:

    name: nginx

    spec:

    replicas: 1

    selector:

    1. app: web01

    template:

    metadata:
    
      name: nginx
    
      labels:
    
        app: web01
    
    spec:
    
      containers:
    
      - name: nginx
    
        image: nginx
    
        ports:
    
        - containerPort: 80
    
        volumeMounts:
    
        - mountPath: /usr/share/nginx/html
    
          readOnly: false
    
          name: nginx-data
    
      volumes:
    
      - name: nginx-data
    
        nfs:
    
          server: 192.168.117.90
    
          path: "/nfs"
    

    创建Pod
    kubectl create -f nginx-nfs.ymal
    常用的Volume类型: - 图4

    六、 GlusterFS类型演示

    部署glusterFS,另开两台机器

    我这里使用了192.168.117.90和192.168.117.100做为node9和node10部署GlusterFS

    在Node9和node10上执行

    yum install -y epel-release

    yum install centos-release-gluster -y

    yum install glusterfs-server –y

    systemctl restart glusterd

    systemctl status glusterd

    systemctl enable glusterd

    mkdir /data

    echo “hello glusgerfs” > /data/index.html

    在Node9上执行
    gluster peer probe node10
    gluster peer probe node9
    gluster peer status
    gluster volume create gv0 replica 2 node9:/data node10:/data force
    gluster volume start gv0
    gluster volume info
    gluster部署完成,下面开始测试
    在master上创建gluster-endpoints.json
    cat glusterfs-endpoints.json

    {

    “kind”: “Endpoints”,

    “apiVersion”: “v1”,

    “metadata”: {

    "name": "glusterfs-cluster"
    

    },

    “subsets”: [

    {
    
      "addresses": [
    
        {
    
          "ip": "192.168.117.90"
    
        }
    
      ],
    
      "ports": [
    
        {
    
          "port": 1
    
        }
    
      ]
    
    },
    
    {
    
      "addresses": [
    
        {
    
          "ip": "192.168.117.100"
    
        }
    
      ],
    
      "ports": [
    
        {
    
          "port": 1
    
        }
    
      ]
    
    }
    

    ]

    }

    创建
    kubectl create -f glusterfs-endpoints.json
    常用的Volume类型: - 图5

    在master上创建glusterfs-service.json

    cat glusterfs-service.json

    {

    “kind”: “Service”,

    “apiVersion”: “v1”,

    “metadata”: {

    "name": "glusterfs-cluster"
    

    },

    “spec”: {

    "ports": [
    
      {"port": 1}
    
    ]
    

    }

    }

    kubectl create -f glusterfs-service.json
    常用的Volume类型: - 图6

    在master上创建nginx-deployment.yaml

    cat nginx-deployment.yaml

    apiVersion: extensions/v1beta1

    kind: Deployment

    metadata:

    name: nginx-deployment

    spec:

    replicas: 3

    template:

    metadata:
    
      labels:
    
        app: nginx
    
    spec:
    
      containers:
    
      - name: nginx
    
        image: nginx
    
        volumeMounts:
    
        - name: glusterfsvol
    
          mountPath: /usr/share/nginx/html
    
        ports:
    
        - containerPort: 80
    
      volumes:
    
      - name: glusterfsvol
    
        glusterfs:
    
          endpoints: glusterfs-cluster
    
          path: gv0
    
          readOnly: false
    

    apiVersion: v1

    kind: Service

    metadata:

    name: nginx-service

    spec:

    selector:

    app: nginx
    

    ports:

    • name: http

      port: 80

      protocol: TCP

      targetPort: 80

      type: NodePort

    kubectl create -f nginx-deployment.yaml
    常用的Volume类型: - 图7
    验证
    常用的Volume类型: - 图8
    常用的Volume类型: - 图9
    ©著作权归作者所有:来自51CTO博客作者yylinfan的原创作品,请联系作者获取转载授权,否则将追究法律责任
    k8s Volume
    https://blog.51cto.com/yylinfan/2116870

    七、 Cephrbd类型演示

    https://www.yuque.com/u21340498/dg3o6z/vksbz7

    八、 Cephfs类型演示