一.、Volume

        容器和Pod是短暂的,会被频繁的销毁和创建,为了持久化保存容器的数据,可以使用 Kubernetes Volume。

        本质上,Volume是一个目录,这一点与Docker Volume类似。当Volume被mount到Pod,Pod中的所有容器都可以访问这个Volume。k8s Volume支持多种backend类型,包括emptyDir、hostPath、GCE Persistent Disk、等。

        Volume提供了对多种backend的抽象,容器在使用Volume读写数据的时候不需要关心数据到底是存放在本地节点的文件系统还是云硬盘上。对它来说,所有类型的Volume都只是一个目录。

1. emptyDir

        emptyDir是最基础的Volume类型,它是Host上的一个空目录。

        emptyDir对于所有容器来说都是持久的,对于Pod则不是。当Pod从节点删除时,Volume的内容也会被删除。但如果指示容器被销毁而Pod还在,则Volume不受影响。

        也就是说,emptyDir Volume 的生命周期与Pod 保持一致

        Pod中的所有容器都可以共享Volume,它们可以指定各自的mount路径。

(1)创建一个配置文件 emptyDir.yml

这里有两个容器,一个生产者容器和一个消费者容器。每个容器都使用 busybox 镜像。生产者容器将 hello zy 输出到 /producer_dir/hello 文件中,并暂停运行 30000 秒。消费者容器将读取 /consumer_dir/hello 文件中的内容并暂停运行 30000 秒。这两个容器都挂载了名为 shared-volume 的卷。

producer负责往Volume中写数据,consumer则是从Volume读数据

apiVersion: v1   #指定k8sAPI版本
kind: Pod        #指定资源的类型
metadata:        #指定该pod中的元数据
  name: producer-consumer
spec:            #这个字段指定了 Pod 的规范,其中包含一个或多个容器定义以及挂载的卷。
  containers:
    - image: busybox
      name: producer
      volumeMounts:
        - mountPath: /producer_dir
          name: shared-volume
      args:
        - /bin/sh
        - -c
        - echo "hello zy" > /producer_dir/hello ; sleep 30000
    - image: busybox
      name: consumer
      volumeMounts:
        - mountPath: /consumer_dir
          name: shared-volume
      args:
        - /bin/sh
        - -c
        - cat /consumer_dir/hello ; sleep 30000
  volumes:
    - name: shared-volume
      emptyDir: {}

#这个字段定义了一个卷,其中指定了卷的名称和类型。在这种情况下,它是一个空目录,这意味着它不包含持
#久性数据,并且将在容器重启时被清除。

(2)创建Pod

zy@k8s-master:~$ kubectl apply -f emptyDir.yml 
pod/producer-consumer created

zy@k8s-master:~$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
producer-consumer   2/2     Running   0          5m34s

(3)读数据

kubectl logs 显示容器consumer成功读到了producer写入的数据,验证了两个容器共享emptyDir Volume。

zy@k8s-master:~$ kubectl logs producer-consumer consumer 
hello zy

因为 emptyDir 是 Docker Host 文件系统里的目录,其效果相当于执行了 docker run -v /producer_dir 和 docker run -v /consumer_dir。通过docker inspect 查看容器的详细配置信息,我们发现两个容器都 mount 了同一个目录。

kubectl exec -it <pod-name> -c <container-name> -- /bin/bash

zy@k8s-master:~$ kubectl exec -it producer-consumer -c producer -- /bin/sh

node2上查看: 

root@k8s-node2:/var/lib/kubelet/pods/0914474f-7c22-49aa-8ab4-4653a2bc19b3/volumes/kubernetes.io~empty-dir/shared-volume# pwd
/var/lib/kubelet/pods/0914474f-7c22-49aa-8ab4-4653a2bc19b3/volumes/kubernetes.io~empty-dir/shared-volume

root@k8s-node2:/var/lib/kubelet/pods/0914474f-7c22-49aa-8ab4-4653a2bc19b3/volumes/kubernetes.io~empty-dir/shared-volume# ls -a
.  ..  hello

root@k8s-node2:/var/lib/kubelet/pods/0914474f-7c22-49aa-8ab4-4653a2bc19b3/volumes/kubernetes.io~empty-dir/shared-volume# cat hello 
hello zy

这里 /var/lib/kubelet/pods/0914474f-7c22-49aa-8ab4-4653a2bc19b3/volumes/kubernetes.io~empty-dir/shared-volume 就是emptyDir在host上的真正路径。

        emptyDir是Host上创建的临时目录,其优点是能够方便地为Pod中的容器提供共享存储,不需要额外的配置。

2. hostPath

        hostPath Volume 的作用是将 Docker Host 文件系统中已经存在的目录 mount给Pod的容器。大部分应用都不会使用hostPath Volume,因为这实际增加了Pod与节点的耦合,限制了Pod的使用。

3. 外部Storage Provider

        如果k8s部署在AWS、GCE、Azure等公有云上,可以直接使用云硬盘作为Volume。

        相对于 emptyDir 和 hostPath,这些Volume类型的最大特点就是不依赖K8s,Volume的底层基础设施由独立的存储管理系统,与k8s集群是分离的,数据被持久化后,整个k8s集群崩溃也不会受损。

二、PersistentVolume&PersistentVolumeClain

        PersistentVolume(PV) 是外部存储系统中的一块存储空间,由管理员创建和维护,与Volume一样,PV具有持久性,生命周期独立于Pod。

        PersistentVolumeClain(PVC)是对PV的申请(Claim)。PVC通常由普通用户创建和维护。需要为Pod分配存储资源时,用户可以创建一个PVC,指明存储资源的容量大小和访问模式(比如只读)等信息,k8s会查找并提供满足条件的PV。

        有了PVC,用户只需要告诉k8s需要什么样的存储资源,而不必关心真正的空间从哪里分配、如何访问等底层细节信息。这些Storage Provider的底层信息交给管理员来处理,只有管理员才应该关心创建PV的细节信息。

        k8s支持多种类型的PV,如AWS EBS、Ceph、NFS等。

1. 在master上搭建一个NFS服务器

(1)安装NFS软件包:使用以下命令安装NFS软件包。

sudo apt-get update
sudo apt-get install nfs-kernel-server

(2)创建共享目录:使用以下命令创建一个共享目录。

sudo mkdir /nfs

(3)设置共享目录权限:使用以下命令设置共享目录的权限。

sudo chown nobody:nogroup /nfs
sudo chmod 777 /nfs

 (4)配置NFS共享:打开/etc/exports文件并添加以下内容。

这个配置将允许任何人从任何位置以读写方式挂载/nfs_share目录。如果您希望限制访问,请更改*为具体的IP地址或主机名。

/nfs *(rw,sync,no_subtree_check)

(5)重启NFS服务:使用以下命令重启NFS服务。

sudo systemctl restart nfs-kernel-server

现在,您已经成功地在master节点上搭建了一个NFS服务器。其他节点可以使用以下命令挂载共享目录。

sudo mount <master节点的IP地址>:/nfs <本地挂载目录>

这里我虚拟机配置不高,搭建的NFS服务会自动killed掉。等搞个好的master再继续搭建。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐