持久化存储#

这个 感觉 很重要

Volumes#

  • HostPath

    将节点上的文件或目录挂载到 Pod 上,该目录会变成持久化存储目录,即使 Pod 删除后重启,也可以重新加载到该目录,目录下的文件不会丢失

    • 首先创建配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    apiVersion: v1
    kind: Pod
    metadata:
    name: test-volume-pd
    spec:
    volumes: # 卷定义在spec级别
    - name: test-volume
    hostPath: # 与主机共享目录
    path: /usr/share/xx # 主机上的路径
    type: DirectoryOrCreate # 目录的类型
    containers:
    - image: nginx
    name: nginx-volume
    volumeMounts: # 挂载卷的配置在容器级别
    - mountPath: /test-pd
    name: test-volume
    • 可以在主机上找到配置目录
    1
    2
    3
    4
    5
    6
    7
    8
    hhhyc@hhhyc:~$ cd ..
    hhhyc@hhhyc:/home$ ls
    hhhyc
    hhhyc@hhhyc:/home$ cd ..
    hhhyc@hhhyc:/$ ls
    Docker **data** home lib32 lost+found opt run srv usr
    bin dev init lib64 media proc sbin sys var
    boot etc lib libx32 mnt root snap tmp
    • 也可以在容器内找到挂载的路径
    1
    2
    3
    4
    5
    hhhyc@hhhyc:~/volumes$ sudo kubectl exec -it test-volume-pd -- sh
    # ls
    bin docker-entrypoint.d home media proc sbin test-pd var
    boot docker-entrypoint.sh lib mnt root srv tmp
    dev etc lib64 opt run sys usr
  • EmptyDir

    用于一个Pod 不同的 Container 共享数据使用

    在删除 Pod 的时候同样也会被删除

image-20240715140357703

NFS挂载#

需要将NFS服务器挂载到Pod中

NFS 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味者 NFS 卷可以被预先填充数据,并目这些数据可以在 Pod 之间共享,

就是可以不同的 Pod 挂载到同一个 NFS 服务中,就可以共享数据了

但是 这个经过网络访问后 ,稳定性比较差,传输较慢

  • 安装 nfs

    1
    yum install nfs-utils -y
  • 启动 nfs

    1
    systemctl start nfs -server
  • 查看 nfs 版本

    1
    cat /proc/js/nfsd/version
  • 创建共享目录

    1
    mkdir -p /data/nfs

    然后 gpt 启动

PV 与 PVC#

这才是最重要的东西,上面的东西没啥用

概念了解#

image-20240715151658600

之前如果要做数据持久化的操作,就会绑定某个路径或者NFS,但是如果服务器多了,每个节点都有不同的选择,选择起来就会非常混乱,因此我们需要一个存储管理工具,也可以看作是 存储方式的抽象

PV:存储卷 其本身没有存储功能的,他只是会指定数据去哪个工具去存储,很方便

PVC:持久卷申领 对于如何使用 PV,就需要使用 PVC 来申领持久卷

形象一点的比喻就是:

消费者 问 代购 买 具体数量 的 某个产品;然后代购会向厂家申报,厂家申报成功后 选择相应数量和具体产品返回给消费者。

一个 PVC 只能绑定一个 PV

一个Pod 可以绑定多个 PVC

  • 构建#

    • 静态构建

      创建模板

      集群管理员创建若干 PV 卷。这些卷对象带有真实存储的细节信息,并且对集群用户可用(可见)。PV卷对象存在于Kubemetes Api中,可供用户消费(使用)

    • 动态构建

      原有模板不符合,需要新创建(StorageClass)

      如果集群中已经有的 PV 无法满足 PVC的需求,那么集群会根据 PVC 自动构建一个 PV,该操作是通过 Storageclass 实现的 , 想要实现这个操作,前提是PVC必须设置 Storageclass,否则会无法动志构建该 PV,可以通过启用 Defaultstorageclass 来实现 PV 的构建。

  • 绑定#

    但用户创建一个 PVC 对象后,主节点会检测新的 PVC 对象,并且寻找与之匹配的 PV 对象,找到PV卷后两者绑定在一起。

    如果找不到对应的PV,则需要看PVC是否设置了 Storageclass 来决定是否动态创建 PV,如果没有配置,则PVC就会一直处于未绑定的状态,知道有匹配的PV

  • 使用#

    Pod 会把 PVC 当作存储卷来使用,集群会通过 PVC 找到绑定的PV ,并为Pod挂载该卷

    Pod 一旦使用PVC绑定 PV后,为了保护数据,PV对象无法被删除

  • 删除#

    1. Retain(保留)
      • 这是默认的回收策略。当PVC被删除时,PV不会被自动删除,其资源不会被释放。你需要手动清理PV的资源,包括删除PV对象和清理底层存储中的相关数据。
    2. Recycle(回收)
      • 在这种策略下,当PVC被删除时,Kubernetes会尝试删除PV,并且对底层存储执行基本的清理操作。这通常意味着删除存储中的文件。Recycle策略适用于动态供应的PV,特别是那些使用云服务提供商存储或通用存储系统的情况。(现已废弃)
    3. Delete(删除)
      • 当设置为Delete策略时,当PVC被删除,PV也会被自动删除。如果PV是由动态存储供应器创建的,相应的存储资源也会被释放。这是一种干净的回收方式,但请谨慎使用,因为这会导致数据的永久丢失。

PV#

配置:

pv-nfs.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: v1             # 指定API版本,对于PV通常是v1
kind: PersistentVolume # 定义资源类型为PersistentVolume

metadata:
name: pv00001 # 给PV指定一个名称

spec: # PV的规格说明
capacity: # 存储容量
storage: 10Gi # 存储容量大小,例如这里设置为10Gi(Gibibytes)

volumeMode: Filesystem # 从Kubernetes 1.9版本开始引入,指定卷的模式为文件系统

accessModes: # 访问模式,定义了PV可以怎样被Pod挂载
- ReadWriteOnce # 可以被单个节点以读写模式挂载

persistentVolumeReclaimPolicy: Recycle # 当PVC删除时,PV的回收策略为Recycle

storageClassName: slow # 指定存储卷的类别,可以与PVC中的storageClassName匹配

mountOptions: # 挂载选项,用于配置挂载卷时的额外参数
- hard
- nfsvers=4.1

nfs: # NFS存储的配置,指定了NFS服务器和路径
path: /data/nfs/rw/test-pv # NFS服务器上的路径
server: nfs-server.example.com # NFS服务器的地址或主机名
1
2
3
4
5
6
sudo kubectl create -f pv-nfs.yaml

sudo kubectl get pv

NAME CAPACITY ACCESS-MODES RECLAIM-POLICY STATUS CLAIM STORAGECLASS REASON
PV0001 5Gi RWX Retain Available slow 9s

状态(status):

  1. available: 空闲,违背绑定多个
  2. Bound: 已经被 PVC 绑定
  3. Released: PVC 已经被删除,资源已回收,但是 PV 未被重新使用
  4. Failed: 自动回收失败

PVC#

我们一般使用 Pod 来管理 PVC

  • PV 与 PVC 进行绑定

配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1             # 使用正确的API版本
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc # PVC的名称,但是与实际使用什么PV无关
spec: accessModes: # 访问模式,定义了PVC可以怎样被Pod挂载
- ReadWriteOnce # 权限模式必须要与对应的 PV 相同
volumeMode: Filesystem # 卷的模式为文件系统 resources: # 存储资源请求
requests: # 请求的存储最少资源 storage: 8Gi # 请求8Gi的存储空间,资源可以小于PV,但是不能大于,大>于就匹配不到PV storageClassName: slow # 存储卷的类别,需要与相应的PV匹配 # 上述都是通过范围匹配,如果要精确查找就需要使用 selector: selector: # 使用选择器选择对应的PV
matchLabels: # 匹配的标签
release: "stable" # PVC必须有相同的标签才能匹配PV matchExpressions: # 复杂选择器,用于更复杂的选择逻辑
- key: environment # 选择PV时考虑的标签键
operator: In # 操作符,选择匹配的PV values: # 匹配的标签值列表
- dev # PVC只能匹配有environment标签且值为dev的PV

创建:

1
2
3
4
5
sudo kubectl create -f pvc-test.yaml

sudo kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc Bound pv0001 5Gi RWX slow 8s
  • Pod 与 PVC 进行绑定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
name: my-pvc-pod
spec:
containers:
- name: nginx
image: nginx:1.9.1
volumeMounts:
- name: test-volume # 挂载到 哪个 volume
mountPath: /usr/share/nginx/html # 挂载到容器的哪个目录
volumes:
- name: my-pvc-volume # 这个是volume的名字
persistentVolumeClaim:
claimName: nfs-pvc # 这个就是关联到pvc的名字
1
sudo kubectl create -f pod-test.yaml

🆗了

StorageClass#

sc – 存储类 – 动态制备PV

每一个 StorageClass 都有一个制备器,用来决定使用哪个卷插件来制备PV (本地磁盘/nfs/cri)

这个要自己构建,要用了再学吧,感觉用处不大了