K8S-数据持久化

在k8s中为什么要做持久化存储?

使用POD的文件系统保存数据并不可靠,因为POD可能会被删除或重启,从而导致数据丢失

我们想要使用存储卷,需要经历如下步骤

1、定义pod的volume,这个volume指明它要关联到哪个存储上的

2、在容器中要使用volumemounts挂载对应的存储`

持久化的类型
kubectl explain pod.spec.volumes # 查看持久化类型的字段定义

emptyDir:挂载在宿主机临时目录,生命周期绑定整个 Pod 资源,只要 Pod 不删,即使容器反复重启数据都在

hostPath:Pod 重启、Pod 删除,数据都永久保存在宿主机本地目录|只能给同节点的POD使用|DaemonSet

PV 是一整块完整存储空间(NFS / 云盘 / 本地盘),PV只能绑定一个PVC

PVC是存储申请单,声明需要多大容量,PV剩余的容量会处于闲置状态

StorageClass:PVC 需要多大空间,PV 就自动创建多大空间

临时共享文件夹--emptyDir

Pod 一删,数据就没了
同一个 Pod 里的多个容器可以共享数据
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  namespace: default
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: vol-emptydir
          emptyDir:
            sizeLimit: 200Mi
      containers:
        - name: container-alpine
          image: alpine:3.7
          command: ["bin/sh", "-c", "sleep 3600"]
          volumeMounts:
            - name: vol-emptydir
              mountPath: /home
        - name: container-nginx
          image: nginx:1.26.2
          ports:
            - containerPort: 80
          volumeMounts:
            - name: vol-emptydir
              mountPath: /usr/share/nginx/html

kubectl get pod deploy-nginx-54d8c55bcf-gfbg2 -oyaml | grep uid  # 查看pod的uid
cd /var/lib/kubelet/pods/<uid>/volumes/kubernetes.io~empty-dir/vol-emptydir[spec/template/spec/volumes/name]  # 在pod对应的node上查看数据
kubectl exec -it deploy-nginx-d7b6d6b8b-gg4kb -c container-nginx -- ls /usr/share/nginx/html  # 查看容器内的文件内容
# 任意pod写入文件,emptyDir的卷会同步数据到其他容器中
kubectl exec -it deploy-nginx-d7b6d6b8b-gg4kb -c container-alpine -- sh
echo 'Test' > /home/index.html

# node的/var/lib/kubelet/pods/<uid>/volumes/kubernetes.io~empty-dir/vol-emptydir
# 等于
# container-alpine的/home
# 等于
# container-nginx的/usr/share/nginx/html
kubectl delete -f empty-dir.yaml
# node的/var/lib/kubelet/pods/<uid>也会被删除

宿主机目录--hostPath

hostPath类型:即使pod被删除,数据也不会丢失
hosePath可以挂载宿目录或文件,emtpyDir只能挂载目录

DirectoryOrCreate 若主机路径不存在,自动创建该目录(权限为0755,属主是root);若路径已存在,要求必须是目录。
FileOrCreate 若主机路径不存在,自动创建该文件(权限为0644,属主是root);若路径已存在,要求必须是文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  namespace: default
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: vol-hostpath
          hostPath:
            path: /root/nginx
            type: DirectoryOrCreate
      containers:
        - name: container-nginx
          image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx
          ports:
            - containerPort: 80
          volumeMounts:
            - name: vol-hostpath
              mountPath: /usr/share/nginx/html
# node的/root/nginx 等于 pod的/usr/share/nginx/html

网络文件存储--NFS

文件系统挂载到远程服务器上,客户端和服务端通过RPC实现访问

NFS服务器

yum install rpcbind nfs-utils -y
mkdir -p /root/nfs/data
echo "/root/nfs/data *(insecure,rw,sync,no_root_squash)" > /etc/exports
systemctl start rpcbind && systemctl start nfs-server
systemctl enable rpcbind && systemctl enable nfs-server

NFS客户端
客户端无法直接删除挂载目录,只能先卸载[取消挂载]

yum install rpcbind nfs-utils -y
systemctl start rpcbind && systemctl enable rpcbind
showmount -e 192.168.248.10  # 查看nfs服务器共享目录
mkdir -p /root/nfs
mount -t nfs 192.168.248.10:/root/nfs/data /root/nfs  # 挂载nfs服务器共享目录到本地
df -t nfs4  # 查看nfs挂载情况

umount -f /root/nfs  # 取消挂载,-f强制卸载
0. *代表所有客户端地址,也可以指定,例如: 192.168.1.50
1. insecure:使用1024以上的端口, secure:使用1024以下的端口
2. rw:可读写权限, ro:只读权限
3. sync:数据同步写入内存和硬盘(效率低不丢数据), async:数据先缓存到内存, 待硬盘空闲再写入硬盘
4. no_root_squash:客户端用root访问共享文件夹时不压缩root权限。root_squash:将root访问转为匿名访问。all_squash:将所有用户访问转为匿名。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-nginx
  namespace: default
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: vol-nfs
          nfs:
            path: /root/nfs/data  # NFS_server
            server: 192.168.248.10
      containers:
        - name: container-nginx
          image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx
          ports:
            - containerPort: 80
          volumeMounts:
            - name: vol-nfs
              mountPath: /usr/share/nginx/html

NFS简单易用, 支持跨平台, 数据集中存储, 这些都是它的优点。不足之处体现在
- 在高并发场景下性能不佳
- 不提供数据备份的高级别配置
- pod挂载任意的NFS写数据, 存储资源的使用不可控, 可能导致NFS服务器崩溃

集群级持久化存储

PV

kubectl api-resources | grep pv # 查看pv资源
kubectl get pv # 查看所有PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv1
  labels:
    pv: nfs-pv1
spec:
  # 1.存储能力
  capacity:
    # 存储大小(200Mi)
    storage: 200Mi
  # 2.访问模式(HostPath仅支持ReadWriteOnce, NFS除ReadWriteOncePod外都支持)
  # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
  accessModes:
    # RWO访问模式。只允许被单个节点读写挂载
    - ReadWriteOnce
    # RWO访问模式。只允许被单个Pod读写挂载
    - ReadWriteOncePod
    # ROX访问模式。允许被多个节点只读挂载
    - ReadOnlyMany
    # RWX访问模式。允许被多个节点读写挂载
  # 3.回收策略
  # Retain 保留。删除PVC不会同步删除PV, 等管理员手动去处理PV里的数据。NFS、HostPath都支持该选项
  # Delete 删除。删除PVC同步删除PV。NFS、HostPath都不支持该选项
  # Recycle 回收。删除PVC同步删除PV且返回可用状态。K8s v1.9后该回收策略标记为过时
  persistentVolumeReclaimPolicy: Retain
  # nfs服务器设置
  nfs:
    path: /root/nfs/data/pv1  # 确保/root/nfs/data/pv1事先存在
    server: 192.168.248.10
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv1
  labels:
    pv: nfs-pv1
spec:
  capacity:
    storage: 200Mi
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Retain  # 回收策略,默认为Retain,Retain的意思是保留数据,删除PVC不会同步删除PV
  nfs:
    path: /root/nfs/data/pv1  # 确保/root/nfs/data/pv1事先存在
    server: 192.168.248.10
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv2
  labels:
    pv: nfs-pv2
spec:
  capacity:
    storage: 200Mi
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /root/nfs/data/pv2
    server: 192.168.248.10
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-grafana
  labels:
    pv: nfs-grafana
spec:
  capacity:
    storage: 200Mi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /root/nfs/data/grafana
    server: 192.168.248.10

PVC

POD必须与PVC在同一个命名空间下
img

StoageClass

动态模式:通过StoageClass自动完成PV的创建以及PVC的绑定

provisioner # 存储卷插件,作用是创建存储卷, 例如: kubernetes.io/nfs
parameters # 存储卷插件的参数, 例如: 对于NFS来说, 需要指定服务器地址和共享目录
reclaimPolicy # 回收策略

posted @ 2026-09-15 17:24  WiseHYH  阅读(8)  评论(0)    收藏  举报