数据持久化
1.k8s存储介绍
容器内部的的存储在生命周期是短暂的,会随着容器环境的销毁而销毁,具有不稳定性。在k8s里将对容器应用所需的存储资源抽象为存储卷(Volume)概念来解决这些问题。
k8s目前支持的Volume类型包括k8s的内部资源对象类型,开源共享存储类型和公有云存储等。分类如 下:
k8s特定的资源对象:
ConfigMap 应用配置
Secret 加密数据
ServiceAccountToken token数据
k8s本地存储类型:
EmptDir: 临时存储
HostPath: 宿主机目录
持久化存储(PV)和网络共享存储:
CephFS: 开源共享存储系统
GlusterFS: 开源共享存储系统
NFS: 开源共享存储
PersistentVolumeClaim: 简称PVC,持久化存储的申请空间
2. 创建hostPath类型volume资源配置清单
cat >emptyDir.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: busybox-empty
spec:
containers:
- name: busybox-pod
image: busybox
volumeMounts:
- mountPath: /data/busybox/
name: cache-volume
command: ["/bin/sh","-c","while true;do echo $(date) >> /data//busybox/index.html;sleep 3;done"]
volumes:
- name: cache-volume
hostPath:
emptyDir: {}
EOF
3.hostPath类型
3.1 type类型说明
https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
DirectoryOrCreate 目录不存在就自动创建
Directory 目录必须存在
FileOrCreate 文件不存在则创建
File 文件必须存在
3.2 创建hostPath类型volume资源配置清单
apiVersion: v1
kind: Pod
metadata:
name: busybox-nodename
spec:
nodeName: node2
volumes:
- name: hostpath-volume
hostPath:
path: /data/node/
type: DirectoryOrCreate
containers:
- name: busybox-pod
image: busybox
volumeMounts:
- mountPath: /data/pod/
name: hostpath-volume
command: ["/bin/sh","-c","while true;do echo $(date) >> /data/pod/index.html;sleep 3;done"]
4.NFS类型
4.1 NFS类型说明
我们也可以直接使用Node节点自己本身的nfs软件将共享目录挂载到Pod里,前提是NFS服务已经安装配
置好,并且Node节点上安装了NFS客户端软件。
4.2 创建NFS类型资源清单
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
nodeName: node2
volumes:
- name: nfs-data
nfs:
server: 10.0.0.10
path: /data/nfs-volume/
containers:
- name: liveness
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nfs-data
mountPath: /usr/share/nginx/html/
5.根据Node标签选择POD创建在指定的Node上
5.1 方法1: 直接选择Node节点名称
apiVersion: v1
kind: Pod
metadata:
name: busybox-nodename
spec:
nodeName: node2
containers:
- name: busybox-pod
image: busybox
volumeMounts:
- mountPath: /data/pod/
name: hostpath-volume
command: ["/bin/sh","-c","while true;do echo $(date) >> /data/pod/index.html;sleep 3;done"]
volumes:
- name: hostpath-volume
hostPath:
path: /data/node/
type: DirectoryOrCreate
5.2 方法2: 根据Node标签选择Node节点
节点添加标签
kubectl label nodes node3 disktype=SSD
资源配置清单
apiVersion: v1
kind: Pod
metadata:
name: busybox-nodename
spec:
nodeSelector:
disktype: SSD
containers:
- name: busybox-pod
image: busybox
volumeMounts:
- mountPath: /data/pod/
name: hostpath-volume
command: ["/bin/sh","-c","while true;do echo $(date) >> /data/pod/index.html;sleep 3;done"]
volumes:
- name: hostpath-volume
hostPath:
path: /data/node/
type: DirectoryOrCreate
持久化存储PV和PVC
https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
1.PV和PVC介绍
PV是对底层⽹络共享存储的抽象,将共享存储定义为⼀种“资源”。
PV由管理员创建和配置
PV只能是共享存储
PVC则是⽤户对存储资源的⼀个“申请”。
就像Pod消费Node的资源⼀样,PVC能够“消费”PV资源 PVC可以申请特定的存储空间和访问模式
注意:
PVC 申领与 PV 卷之间的绑定是一对一的映射,也就是说一个pv只能被一个pvc绑定。
PVC和PV都受限于Namespace,PVC在选择PV时受到Namespace的限制,只有相同Namespace中的PV才可能与PVC绑定。Pod在引用PVC时同样受Namespace的限制,只有相同Namespace中的PVC才能挂载到Pod内。
2.PV和PVC生命周期
3.PV和PVC需要注意的地方
在PV的整个生命周期中,可能会处于4种不同的阶段:
Avaliable(可用):表示可用状态,还未被任何PVC绑定
Bound(可绑定):表示PV已经被PVC绑定
Released(已释放):PVC被删除,但是资源还未被集群重新声明
Failed(失败):表示该PV的自动回收失败
创建PVC之后,k8s就会去查找满足我们声明要求的PV,比如storageClassName,accessModes以及容量 这些是否满足要求,如果满足要求就将PV和PVC绑定在一起。
需要注意的是目前PV和PVC之间是一对一绑定的关系,也就是说一个PV只能被一个PVC绑定。