概述
我们知道,平时kubernetes在部署无状态服务的时候,并不需要太多考虑持久化存储的事情,直接通过volume挂载网络存储,比如常见的nfs就能实现文件共享存储。
但是如果在有状态服务中,你就会需要很多的问题,比如:当你部署一些集群服务的时候:
1. 不可以用共享存储,因为每个服务的数据都不能相同。
2. 不可以直接用node的本地路径进行挂载,因为pod的随机性,一个node可能会跑多个pod副本,则会造成冲突。
3. 数据量可能会很大,可能需要使用外部存储,或者独立的磁盘,云盘等
4. 就算用pv,pvc也很不方便,需要你提前手动创建,不方便扩展。
然后我们细数一下k8s里的持久化存储,总的分为两种,静态卷和动态卷。静态卷就是刚才我们说的,volume挂载,或者通过手动创建pv,pvc进行挂载。都属于静态卷。而动态卷,则是将一个网络存储作为一个StorageClass类,通过自己的配置,来动态的创建pv,pvc并进行绑定,这样就可以实现动态的存储生成与持久化保存。
具体详细的k8s的存储系统知识我这里就不想洗说明,有兴趣的自行百度,谷歌就可以了,先了解一下k8s的存储,再来看如何实现
下面我们就说一下,怎么通过nfs动态卷来实现有状态服务的储存。
正文
环境:
kubernetes v1.12.2
centos7
这里以搭建neo4j 因果集群为例,展示nfs动态卷的使用,namespace为neo4j。
nfs动态卷的整体结构大致如下图,用户通过yaml创建StatefulSet,StatefulSet找到StorageClass,StorageClass指定到nfs-provisioner为nfs的pv提供者,这是一个pod的服务,用来自动生成pv的,此pod来绑定到对应的nfs服务。以此来通过nfs服务进行动态的pv生成,然后通过StatefulSet的pvc,与pod进行绑定,实现数据的持久化存储。
1. 搭建好nfs服务
nfs服务的搭建,请看:《centos7.2 配置NFS文件服务器,远程共享文件》
我这里搭建好nfs后,创建文件夹 /opt/nfs 作为主目录进行,配置如下:
# 172.18.0.0/16是我的内网网段,自己根据情况自定义
/opt/nfs 172.18.0.0/16(rw,sync,no_root_squash)
nfs服务的ip为:172.18.196.238
2. 配置rbac权限
由于我这里以neo4j为namespace,所以先创建namespace.yaml 文件,内容如下:
---
apiVersion: v1
kind: Namespace
metadata:
name: neo4j
labels:
name: neo4j
执行此yaml文件,创建neo4j的命名空间,以保证下面的使用
kubectl create -f namespace.