下面我们来介绍一下k8s的持久化存储方案,目前k8s支持的存储方案主要如下:
分布式文件系统:NFS/GlusterFS/CephFS
公有云存储方案:AWS/GCE/Auzre
Nfs存储方案
NFS 是Network File System的缩写,即网络文件系统。Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。
1、首先安装nfs
# yum -y install nfs-util*
# cat /etc/exports
/home 192.168.115.0/24(rw,sync,no_root_squash)
# systemctl start rpcbind
# systemctl start nfs
# showmount -e 127.0.0.1
Export list for 127.0.0.1:
/home 192.168.115.0/24
2、使用pod直接挂载nfs
要保证集群内所有的node节点都可以挂载nfs
# cat nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name : busybox
image: registry.fjhb.cn/busybox
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
volumeMounts:
- mountPath: /busybox-nfsdata
name: nfsdata
volumes:
- name: nfsdata
nfs:
server: 192.168.115.6
path: /home
3、使用PV和PVC
在实际的使用中,我们通常会将各存储划分成PV,然后和PVC绑定给pod使用。
PV:PersistentVolume
PVC:PersistentVolumeClaim
PV和PVC的生命周期:
供应准备:通过集群外的存储系统或者公有云存储方案来提供存储持久化支持。
静态提供:管理员手动创建多个PV,供PVC使用。
动态提供:动态创建PVC特定的PV,并绑定。
绑定:用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
使用:用户可在pod中像使用volume一样使用pvc。
释放:用户删除pvc来回收存储资源,pv将变成“released”状态。由于还保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他pvc使用。
回收(Reclaiming):pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)
保留策略:允许人工处理保留的数据。
删除策略:将删除pv和外部关联的存储资源,需要插件支持。
回收策略:将执行清除操作,之后可以被新的pvc使用,需要插件支持。
PV卷阶段状态:
Available – 资源尚未被PVC使用
Bound – 卷已经被绑定到PVC了
Released – PVC被删除,PV卷处于释放状态,但未被集群回收。
Failed – PV卷自动回收失败
PV卷的访问模式
ReadWriteOnce – 单node的读写
ReadOnlyMany – 多node的只读
ReadWriteMany – 多node的读写
创建pv与pvc
# cat nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-001
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /home
server: 192.168.115.6
persistentVolumeReclaimPolicy: Recycle
# cat nfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-data
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
在PVC绑定PV时通常根据两个条件来绑定,一个是存储的大小,另一个就是访问模式。
在rc文件中使用PVC
# cat nginx-rc-configmap.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
labels:
name: nginx
spec:
replicas: 2
selector:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: docker.io/nginx
volumeMounts:
- name: nginx-data
mountPath: /usr/share/nginx/html
- name: nginx-etc
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
ports:
- containerPort: 80
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: nfs-data
- name: nginx-etc
configMap:
name: nginxconfig
items:
- key: nginx.conf
path: nginx.conf