K8s数据卷

docker里面使用Volume进行挂载; k8s里面的数据卷集成了各种的存储系统– Types of Volumes;主要看一下HostPathEmtptyDir,以及PV/PVC的使用和操作

本地存储

EmptyDir

随着Pod的创建而创建,删除而删除,适用于Pod之间的文件共享

创建一个EmptyDir类型的Pod

## 一个count镜像,用于测试日志输出的过程
apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args:
    - /bin/sh
    - -c
    - >
      i=0;
      while true;
      do
        echo "$i: $(date)" >> /var/log/1.log;
        echo "$(date) INFO $i" >> /var/log/2.log;
        i=$((i+1));
        sleep 1;
      done      
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - name: varlog
    emptyDir: {}
➜  k8s kubectl exec  counter -- ls /var/log
1.log
2.log

HostPath

挂载卷在宿主机Node上面的挂载类型,当Pod被删除的时候,还可以被持久化下来;

## 一个count镜像,用于测试日志输出的过程
apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
		## 省略了一下.....
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - name: varlog
    hostPath:
      path: /tmp/log
[root@ops-pre-4-103 tmp]# ll /tmp/log/
total 8
-rw-r--r-- 1 root root 1541 Dec  3 14:30 1.log
-rw-r--r-- 1 root root 1729 Dec  3 14:30 2.log

PV/PVC

有了PV,不管下层用的是什么存储类型,相当于给屏蔽掉底层,只对上层进行服务即可;用户管理员先对PV进行规划,然后开始创建一个一个地小块PVC,每个pvc与pv进行绑定;上层的pod可以使用创建出来的pvc,形成一套闭环的链路;删除的时候,会根据回收策略进行删除,是自行清理或者k8s自动清理等;

这篇 搭建redis-cluster的文章里面使用NFS做为持久化的工具来实现pvpvc

有几个注意的事项:

  1. pv与pvc绑定可以使用相同的StorageClass,若不设置,那pvc就会找空的StorageClass的pv;
  2. Storage有一个属性为volumeBindingMode,默认为Immediate会立即绑定,若设置为WaitForFirstConsumer,则当有Pod使用此pvc的时候才会进行绑定;
  3. 报错:no volume plugin matched;说明你没有对应的 provisioner;去搜索添加对应的provisioner即可,我使用的是nfs,需要安装 nfs-client;然后再指定对应的配置;

可以看到使用nfs比较麻烦,总结一下流程如下:

  • 搭建nfs环境
  • sa创建
  • rbac: 创建
  • nfs-client-provisioner创建
  • storageclass创建
  • 最后才是pv与pvc的创建,及其他所需要 pvc资源的创建;