十一、K8S之持久化存储-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

持久化存储

一、概念

在K8S中数据持久化可以让容器在重新调度、重启或者迁移时保留其数据并且确保数据的可靠性和持久性。

持久化存储通常用于程序的状态数据、数据库文件、日志文件等需要在容器生命周期之外的数据它可以通过各种存储解决方案实现如主机路径、本地存储、网络存储如NFS、ISCSI、云存储等。

二、HostPath

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

但不适合生产环境因为它对宿主机的依赖性较高无法实现数据的高可用和迁移。

apiVersion: v1
kind: Pod
metadata:
  name: test-volume-pod
spec:
  containers:
  - image: nginx
    name: nginx-volume
    volumeMounts:
    - mountPath: /test-pd # 挂载到容器的哪个目录
      name: test-volume # 挂载哪个 volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data # 节点中的目录
      type: Directory # 挂载目录类型  Directory 代表/data必须存在 ,如果不存在则报错

在volumes类型为hostPath的时候 type有多种配置方式如

类型说明
DirectoryOrCreate如果给定的 path 不存在就创建一个 755 的空目录
Directory这个目录必须存在
FileOrCreate如果给定的文件不存在则创建一个空文件权限为 644
File这个文件必须存在
SocketUNIX 套接字必须存在
CharDevice字符设备必须存在
BlockDevice块设备必须存在

三、EmptyDir

EmptyDir 主要用于一个 Pod 中不同的 容器共享数据使用的由于只是在 Pod 内部使用因此与其他 volume 比较大的区别是当 Pod 如果被删除了那么 emptyDir 也会被删除。 这种方式适用于临时性的数据存储当Pod重新启动时EmptyDir也会被清空。也就是说它只做到了数据化共享并没有做到持久化存储

apiVersion: v1
kind: Pod
metadata:
  name: test-emptyDir-pd
spec:
  containers:
  - image: nginx
    name: nginx-emptydir
    volumeMounts:
    - mountPath: /cache1
      name: cache-volume
  - image: nginx
    name: nginx-emptydir
    volumeMounts:
    - mountPath: /cache2
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

四、NFS 挂载

4.1、安装NFS

需要使用nfs的文件服务的都要安装

  • 使用apt安装
apt-get update

# 安装
apt-get install nfs-kernel-server nfs-common

# 启动
systemctl start nfs-server
  • 修改配置文件
vim /etc/exports

# /data/nfs/ 代表共享目录  ip代表可访问的ip信息 后面是权限
/data/nfs/ 192.168.31.0/24(rw,sync,no_subtree_check,no_root_squash)
  • 重启
# 重新加载
exportfs -f
systemctl reload nfs-server
  • 创建挂载目录
# 前面的是nfs服务地址及目录后面是挂载到本地的目录
mount -t nfs 192.168.31.101:/data/nfs/html /data/nfs/nginx/html
  • 其他命令
查看挂载的目录
mount | grep nfs
4.2、配置文件使用
  • 配置文件
apiVersion: v1
kind: Pod
metadata:
  name: test-nfs-pd
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: test-volume
  volumes:
  - name: test-volume
    nfs:
      server: 192.168.31.101 # 网络存储服务地址
      path: /data/nfs/html # 网络存储路径

  • 测试是否成功
# 在NFS服务的/data/nfs/html 目录下创建文件
echo '123' > index.html


# 使用命令查看pod的ip
kubectl get po -o wide


#使用wget访问
wget ip

五、PV和PVC

5.1、概念

持久卷PersistentVolumePV 是集群中的一块存储它可以是物理存储设备、网络存储卷或云提供商的存储服务。PV独立于Pod的生命周期可以被多个Pod共享。由管理员事先制备 或者使用存储类Storage Class来动态制备。

**持久卷申领PersistentVolumeClaimPVC**是Pod对持久化存储的请求。 它相当于是Pod对PV的申请单。Pod可以通过声明PVC来请求所需的存储资源并指定访问模式、容量和存储类等要求。Kubernetes会根据PVC的要求去匹配可用的PV并将其绑定到Pod上。

总结起来PV是集群中的存储资源而PVC是Pod对存储资源的抽象化请求。PVC通过与PV的绑定为Pod提供持久化存储。

5.2、生命周期
  • 1、创建

需要创建PV。PV定义了集群中的实际存储资源可以是物理存储设备、网络存储等。然后使用PVC来申请PV。PVC描述了应用程序对存储资源的需求。

  • 2、绑定

当用户创建一个 PVC 对象后它会尝试与合适的PV进行绑定。绑定是通过使用PVC的标签选择器与PV的标签进行匹配完成的。如果找到匹配的PVPVC就会与之绑定。
如果找不到对应的 PV则需要看 PVC 是否设置 StorageClass 来决定是否动态创建 PV若没有配置PVC 就会一致处于未绑定状态直到有与之匹配的 PV 后才会申领绑定关系。

  • 3、使用

Pod 将 PVC 当作存储卷来使用集群会通过 PVC 找到绑定的 PV并为 Pod 挂载该卷。
Pod 一旦使用 PVC 绑定 PV 后为了保护数据避免数据丢失问题PV 对象会受到保护在系统中无法被删除。

  • 4、回收

当PVC不再使用时可以对其进行回收。回收的方式有两种保留和删除

保留模式下PV和相关的存储资源会被保留下来不会被自动删除。这样可以确保数据的安全性并提供手动清理的机会。
删除模式下PV和相关的存储资源会被自动删除。这将释放存储资源供其他应用程序使用。

5.3、PV创建
  • 配置文件
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels: 
    
spec:
  capacity:
    storage: 1Gi # pv 的容量
  volumeMode: Filesystem # 存储类型为文件系统
  accessModes: # 访问模式ReadWriteOnce-单个读写、ReadWriteMany-多个读写、ReadOnlyMany-多个读
    - ReadWriteOnce # 可被单节点独写
  persistentVolumeReclaimPolicy: Recycle # 回收策略
  storageClassName: slow # 创建 PV 的存储类名需要与 pvc 的相同
  mountOptions: # 加载配置
    - hard
    - nfsvers=4.1
  nfs: # 连接到 nfs
    path: /data/nfs/pv001 # 存储路径
    server: 192.168.31.101 # nfs 服务地址
  • 获取pv信息
kubectl get pv

------------------------
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS      
pv001   1Gi        RWO            Recycle          Available            slow               
  • 配置状态说明
状态值说明
Available空闲未被绑定
Bound已经被 PVC 绑定
ReleasedPVC 被删除资源已回收但是 PV 未被重新使用
Failed自动回收失败
5.4、PVC创建
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteOnce # 权限需要与对应的 pv 相同
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi # 资源可以小于 pv 的但是不能大于如果大于就会匹配不到 pv
  storageClassName: slow # 名字需要与对应的 pv 相同
#  selector: # 使用选择器选择对应的 pv
#    matchLabels:
#      env: "dev"
#    matchExpressions:
#      - {key: environment, operator: In, values: [dev]}

当创建pvc能与pv匹配后再查看pv状态时候就会转变为Bound

5.5、Pod 绑定 PVC

apiVersion: v1
kind: Pod
metadata:
  name: pvc-test-pod
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: nfs-pvc-test
  volumes:
  - name: nfs-pvc-test
    persistentVolumeClaim:
      claimName: nfs-pvc # pvc 的名称

测试

# 先使用命令查看pod的内网地址
kubectl get po -o wide

--------------------------------
NAME                            READY   STATUS        RESTARTS          AGE     IP
pvc-test-pod                    1/1     Running       0                 4m36s   10.244.36.124




#调用
curl 10.244.36.124

六、StorageClass

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s