kubernetes 数据卷volume 以及持久化数据卷 pv以及pvc使用 – 21运维
通知: .-...

kubernetes 数据卷volume 以及持久化数据卷 pv以及pvc使用

K8S 21运维 5771浏览

1,pod异常会重启,或者各种原因导致pod删除,那么之前pod里边存储的数据将会丢失。那么就需要将pod进行数据持久化。
2,不同的pod间可能会共享一些数据,这些数据需要持久化。
为了解决这个问题,官网也给出了一些解决方案,具体可以到 https://kubernetes.io/docs/concepts/storage/volumes/ 了解支持的数据卷类型种类,不同的应用常用使用不同的volume。这里仅简单记录下学习持久化数据卷以及如何使用pv,pvc过程。
个人理解:
volume就是我们所说的数据卷。
pv 就是我们规划好的一个存储集群池
pvc 就是pod申请具体大小的pv,通过pvc来消耗pv里边的资源。

一,常见volume

官网支持的volume比较多,个人认为用到比较多的是云厂商的各种云盘,nas,oss,emptydir ,hostpath等。这里简单记录下epmty,hostpath,nfs(为测试pv以及pvc),其他的云盘,nas,对象存储等具体根据自己厂商阿里云或者aws或其他来单独设置。

1,empty
顾名思义,初始值是一个空目录。用于放置一些临时数据,pod重启或移除后会丢失。

apiVersion: v1
kind: Pod
metadata:
  name: emptydir-pod
spec:
  nodeName: 10.1.14.25
  containers:
  - image: nginx:1.14
    name: testemptypod
    volumeMounts:
    - mountPath: /test
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

2,hostpath
顾名思义,将node节点的一个目录或文件挂载到pod上边。这个还是比较常用的。
应用场景:挂载node的/etc/hosts,/etc/localtime时区文件,挂载特定目录或者日志文件等。
yaml文件声明里边volume,主要是name以及hostpath, 容器挂载指定volumemounts挂载的路径以及name即可。

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  nodeSelector:
    role: prod
  containers:
  - image: nginx:1.14
    name: testhostpath
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: wwwroot
    - mountPath: /etc/hosts
      name: hosts
    - mountPath: /etc/localtime
      name: time-zone
  volumes:
  - name: wwwroot
    hostPath:
      path: /data
      type: Directory
  - name: hosts
    hostPath:
      path: /etc/hosts
  - name: time-zone
    hostPath:
      path: /etc/localtime

这里分别挂载了目录 以及node节点的/etc/hosts,/etc/localtime 。创建以后,可以进入pod查看挂载:

root@hostpath-pod:/# cat  /usr/share/nginx/html/index.html 
hello node2 /data
root@hostpath-pod:/# cat  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.14.21 master01
10.1.14.22 master02
10.1.14.23 etcd01
10.1.14.24 etcd02
10.1.14.25 node01
10.1.14.26 node02
10.1.14.27 mastercluster

3,nfs
搭建过程不详细阐述,只记录快速配置

master安装:yum install -y nfs-utils rpcbind 
mkdir -p /data/wwwroot/test
echo "hello nfs server"> /data/wwwroot/test/index.html
注意配置/etc/exports:
/data/wwwroot/test   10.1.14.0/24(rw,no_root_squash,no_all_squash,sync)

node安装: yum install -y nfs-utils

配置完以后将其服务都启动。
具体参数可以参考: https://blog.csdn.net/shenhonglei1234/article/details/80827570

测试yamal如下:

[root@master01 volume]# cat nfsvolume.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod
spec:
  nodeName: 10.1.14.25
  containers:
  - image: nginx:1.14
    name: testnfspod 
    volumeMounts:
    - name: wwwroot
      mountPath: /usr/share/nginx/html
  volumes:
  - name: wwwroot
    nfs:
      server: 10.1.14.17
      path: /data/wwwroot/test

创建以后访问pod:

[root@node01 data]# curl 172.50.4.8
hello  nfs server

二,持久化数据卷pv
PersistentVolume 持久卷,简称PV,对存储的具体实现,供集群使用。
创建nfs pv:

[root@master01 volume]# cat nfs-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-wwwroot
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/wwwroot/test
    server: 10.1.14.17
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-log
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/wwwroot/test
    server: 10.1.14.17

创建以后查看pv情况:

[root@master01 volume]# kubectl  get  pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv-log       10Gi       RWX            Retain           Available                                   4s
nfs-pv-wwwroot   5Gi        RWX            Retain           Available                                   9s

参数说明:
(1)访问模式
spec:
capacity:
storage: 10Gi #容量
accessModes: #访问模式
– ReadWriteMany
访问模式有三种:
ReadWriteOnce #可读写仅一次
ReadOnlyMany #只读
ReadWriteMany #可读写
(2)回收策略
pv可以设置三种回收策略:Retain(默认),Recycle和Delete。
– retain:允许人工处理保留的数据。
– recycle:将执行清除操作,之后可以被新的pvc使用,需要插件支持
– delete:将删除pv和外部关联的存储资源,需要插件支持。
网上资料:目前只有NFS和HostPath类型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。
(3)pv状态
Available: pv可用
Bound: pv已被绑定到某pvc
Released: pv已经被释放,但需要手工处理
Faild:pv不可用

三,持久化数据卷申请pvc
persistentvolumeclaim 持久卷申请简称PVC,消费具体的pv,相当于拆分了配额的存储模块。
pod申请pvc作为卷来使用,集群通过pvc查找绑定的pv,达到pod通过指定pvc name间接把数据卷给挂载了。

[root@master01 volume]# cat nfs-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wwwroot-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: log-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

create以后查看状态:

[root@master01 volume]# kubectl  get  pv,pvc
NAME                              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
persistentvolume/nfs-pv-log       10Gi       RWX            Retain           Bound    default/log-pvc                               6m32s
persistentvolume/nfs-pv-wwwroot   5Gi        RWX            Retain           Bound    default/wwwroot-pvc                           6m32s

NAME                                STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/log-pvc       Bound    nfs-pv-log       10Gi       RWX                           5m58s
persistentvolumeclaim/wwwroot-pvc   Bound    nfs-pv-wwwroot   5Gi        RWX                           5m58s

pvc匹配pv的时候,根据容量以及读写模式来就近匹配。 有了pvc以后,pod就可以直接用来使用了。

创建pod测试下pvc:

[root@master01 volume]# cat pod-pvc.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pvc-nfs
spec:
  containers:
  - name: testnginxpvfnfs
    image: nginx:1.14
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: wwwroot
  volumes:
  - name: wwwroot
    persistentVolumeClaim:
      claimName: wwwroot-pvc

创建并进入带容器:

root@nginx-pvc-nfs:/usr/share/nginx/html# df -h
Filesystem                     Size  Used Avail Use% Mounted on
overlay                         36G  3.3G   32G  10% /
tmpfs                           64M     0   64M   0% /dev
tmpfs                          1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root         36G  3.3G   32G  10% /etc/hosts
shm                             64M     0   64M   0% /dev/shm
10.1.14.17:/data/wwwroot/test   36G  3.3G   32G  10% /usr/share/nginx/html

挂载依旧是成功的。

参考文章:
1,搭建NFS服务 ,并在Kubernetes挂载NFS https://blog.csdn.net/shenhonglei1234/article/details/80827570
2,Kubernetes Pv & Pvc https://www.jianshu.com/p/fda9de00ba5f

转载请注明:21运维 » kubernetes 数据卷volume 以及持久化数据卷 pv以及pvc使用