K8S存储PV与PVC持久化

K8S存储PV与PVC持久化

Deng YongJie's blog 1,300 2023-06-03

数据持久化

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生命周期

image-20230426142404088

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绑定。

image-20230426142709507
image-20230426142818720
image-20230426143423857