6. k8s 之存储配置

打印 上一主题 下一主题

主题 1953|帖子 1953|积分 5859

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

1. 什么是 PV(PersistentVolume)?

PV(PersistentVolume) 是 Kubernetes 中表现持久化存储资源的对象。它抽象了底层存储系统的细节(如云存储、NFS、当地磁盘等),答应用户通过声明式配置(YAML)利用存储资源,而无需关心存储的详细实现。
焦点特点

集群级资源:由管理员预先创建或通过 StorageClass 动态生成。
与存储后端解耦:支持多种存储范例(如 AWS EBS、NFS、HostPath 等)。
生命周期独立于 Pod:Pod 删除后,PV 及其数据仍然保留。
需通过 PVC(PersistentVolumeClaim)绑定:用户通过 PVC 申请存储资源,PVC 会匹配并绑定到符合条件的 PV。

2. 在 Linux 系统中创建 PV 的步骤

在 Kubernetes 中创建 PV 不直接依赖 Linux 系统本身的操作,而是通过 Kubernetes API 界说。以下是常见的几种 PV 范例及其配置方法:

场景 1:利用 hostPath(节点当地目录)

实用场景

开发测试环境。
• 单节点集群(如 Minikube)。
步骤


  • 在 Linux 节点上创建目录
    1. sudo mkdir -p /mnt/data
    2. sudo chmod 777 /mnt/data  # 确保容器有写入权限
    复制代码
  • 界说 PV YAML 文件
    1. # hostpath-pv.yaml
    2. apiVersion: v1
    3. kind: PersistentVolume
    4. metadata:
    5.   name: pv-hostpath
    6. spec:
    7.   capacity:
    8.     storage: 10Gi      # 存储容量
    9.   accessModes:
    10.     - ReadWriteOnce    # 访问模式(单节点读写)
    11.   persistentVolumeReclaimPolicy: Retain  # 回收策略(保留数据)
    12.   hostPath:
    13.     path: /mnt/data    # 节点本地目录
    14.     type: DirectoryOrCreate  # 目录不存在则自动创建
    复制代码
  • 创建 PV
    1. kubectl apply -f hostpath-pv.yaml
    复制代码
  • 验证
    1. kubectl get pv
    2. # 输出示例:
    3. # NAME           CAPACITY  ACCESS MODES  RECLAIM POLICY  STATUS      CLAIM
    4. # pv-hostpath    10Gi      RWO           Retain          Available
    复制代码

场景 2:利用 NFS(网络共享存储)

实用场景

• 多节点集群共享存储。
• 需要跨节点读写数据的应用(如文件服务器)。
步骤


  • 在 Linux 系统中配置 NFS 服务端
    1. # 在 NFS 服务器上操作
    2. sudo apt install nfs-kernel-server
    3. sudo mkdir -p /nfs_share
    4. sudo chmod 777 /nfs_share
    5. echo "/nfs_share *(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
    6. sudo systemctl restart nfs-server
    复制代码
  • 界说 PV YAML 文件
    1. # nfs-pv.yaml
    2. apiVersion: v1
    3. kind: PersistentVolume
    4. metadata:
    5.   name: pv-nfs
    6. spec:
    7.   capacity:
    8.     storage: 100Gi     # 存储容量
    9.   accessModes:
    10.     - ReadWriteMany    # 多节点读写
    11.   persistentVolumeReclaimPolicy: Retain
    12.   nfs:
    13.     server: 192.168.1.100  # NFS 服务器 IP
    14.     path: /nfs_share       # NFS 共享目录
    复制代码
  • 创建 PV
    1. kubectl apply -f nfs-pv.yaml
    复制代码

场景 3:利用当地卷(Local Volume)

实用场景

• 需要高性能当地存储(如数据库)。
• 利用当地磁盘或 SSD。
步骤


  • 在节点上预备磁盘或目录
    1. sudo mkdir -p /mnt/local-ssd
    2. sudo chmod 777 /mnt/local-ssd
    复制代码
  • 界说 PV YAML 文件
    1. # local-pv.yaml
    2. apiVersion: v1
    3. kind: PersistentVolume
    4. metadata:
    5.   name: pv-local
    6. spec:
    7.   capacity:
    8.     storage: 500Gi
    9.   accessModes:
    10.     - ReadWriteOnce
    11.   persistentVolumeReclaimPolicy: Retain
    12.   local:
    13.     path: /mnt/local-ssd  # 本地目录
    14.   nodeAffinity:           # 限制 PV 只能被调度到特定节点
    15.     required:
    16.       nodeSelectorTerms:
    17.       - matchExpressions:
    18.         - key: kubernetes.io/hostname
    19.           operator: In
    20.           values:
    21.           - node1  # 节点名称
    复制代码
  • 创建 PV
    1. kubectl apply -f local-pv.yaml
    复制代码

3. PV 的关键配置参数

(1) 访问模式(Access Modes)

ReadWriteOnce (RWO):单节点读写。
ReadOnlyMany (ROX):多节点只读。
ReadWriteMany (RWX):多节点读写。
(2) 接纳策略(Reclaim Policy)

Retain:删除 PVC 后保留 PV 和数据(需手动清理)。
Delete:自动删除 PV 和底层存储(仅限动态供给的云存储)。
Recycle(已废弃):擦除数据后重新绑定。
(3) 存储类别(StorageClass)

• 动态供给 PV 时需指定 StorageClass,静态 PV 可省略或设为空字符串。

4. 验证 PV 绑定到 PVC


  • 创建 PVC
    1. # pvc.yaml
    2. apiVersion: v1
    3. kind: PersistentVolumeClaim
    4. metadata:
    5.   name: my-pvc
    6. spec:
    7.   accessModes:
    8.     - ReadWriteOnce
    9.   resources:
    10.     requests:
    11.       storage: 10Gi
    12.   # storageClassName: ""  # 空字符串表示使用静态 PV
    复制代码
  • 绑定 PV
    1. kubectl apply -f pvc.yaml
    2. kubectl get pv,pvc
    3. # 输出示例:
    4. # NAME             STATUS  CLAIM           CAPACITY
    5. # pv-hostpath      Bound   default/my-pvc  10Gi
    复制代码

5. 常见问题

(1) PV 无法绑定到 PVC

原因:PVC 的 accessModes、storage 或 storageClassName 不匹配。
办理:查抄 PV 和 PVC 的配置是否一致。
(2) 容器无法写入 PV

原因:目录权限不足或存储后端故障。
办理
  1. kubectl exec -it <pod-name> -- ls -l /data  # 检查挂载点权限
  2. kubectl describe pv <pv-name>               # 查看 PV 事件日志
复制代码

总结

PV 是存储资源的抽象:由管理员创建或动态供给,供应用通过 PVC 申请。
常用 PV 范例:hostPath(当地目录)、nfs(网络存储)、local(高性能当地盘)。
关键配置:访问模式、容量、接纳策略和节点亲和性(Local PV)。
操作流程:界说 PV → 创建 PVC → 挂载到 Pod。
在 Kubernetes 中配置存储的焦点是通过 持久化存储卷(Persistent Volume, PV)持久化存储声明(Persistent Volume Claim, PVC) 实现数据持久化和动态管理。以下是详细的存储配置指南:

1. 焦点概念

概念作用PersistentVolume (PV)集群级别的存储资源(如云存储、NFS、当地磁盘),由管理员创建或动态生成。PersistentVolumeClaim (PVC)用户对存储资源的申请,指定容量、访问模式等要求,绑定到 PV。StorageClass (SC)动态生成 PV 的模板(如 AWS EBS、GCP PD),按需创建存储资源。
2. 存储配置步骤

(1) 静态供给(手动创建 PV)

场景:已有存储资源(如 NFS、当地磁盘),需手动绑定。

步骤


  • 创建 PV(以 NFS 为例):
    1. # nfs-pv.yaml
    2. apiVersion: v1
    3. kind: PersistentVolume
    4. metadata:
    5.   name: pv-nfs
    6. spec:
    7.   capacity:
    8.     storage: 10Gi
    9.   accessModes:
    10.     - ReadWriteMany
    11.   persistentVolumeReclaimPolicy: Retain
    12.   nfs:
    13.     server: 192.168.1.100
    14.     path: /data/nfs
    复制代码
    1. kubectl apply -f nfs-pv.yaml
    复制代码
  • 创建 PVC(匹配 PV):
    1. # pvc.yaml
    2. apiVersion: v1
    3. kind: PersistentVolumeClaim
    4. metadata:
    5.   name: pvc-nfs
    6. spec:
    7.   accessModes:
    8.     - ReadWriteMany
    9.   resources:
    10.     requests:
    11.       storage: 10Gi
    12.   storageClassName: ""  # 空字符串表示手动绑定
    复制代码
    1. kubectl apply -f pvc.yaml
    复制代码
  • 挂载到 Pod
    1. # pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5.   name: my-pod
    6. spec:
    7.   containers:
    8.   - name: app
    9.     image: nginx
    10.     volumeMounts:
    11.     - name: nfs-volume
    12.       mountPath: /usr/share/nginx/html
    13.   volumes:
    14.   - name: nfs-volume
    15.     persistentVolumeClaim:
    16.       claimName: pvc-nfs
    复制代码

(2) 动态供给(自动创建 PV)

场景:利用云存储(如 AWS EBS、GCP PD),按需自动生成 PV。

步骤


  • 创建 StorageClass
    1. # storageclass-aws.yaml
    2. apiVersion: storage.k8s.io/v1
    3. kind: StorageClass
    4. metadata:
    5.   name: aws-gp3
    6. provisioner: ebs.csi.aws.com
    7. parameters:
    8.   type: gp3
    9. volumeBindingMode: WaitForFirstConsumer  # 延迟绑定到 Pod 调度
    10. reclaimPolicy: Delete
    复制代码
    1. kubectl apply -f storageclass-aws.yaml
    复制代码
  • 创建 PVC(触发动态供给):
    1. # pvc-dynamic.yaml
    2. apiVersion: v1
    3. kind: PersistentVolumeClaim
    4. metadata:
    5.   name: pvc-dynamic
    6. spec:
    7.   accessModes:
    8.     - ReadWriteOnce
    9.   resources:
    10.     requests:
    11.       storage: 50Gi
    12.   storageClassName: aws-gp3  # 引用 StorageClass
    复制代码
    1. kubectl apply -f pvc-dynamic.yaml
    复制代码
  • 挂载到 Deployment
    1. # deployment.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5.   name: web-app
    6. spec:
    7.   template:
    8.     spec:
    9.       containers:
    10.       - name: nginx
    11.         image: nginx
    12.         volumeMounts:
    13.         - name: dynamic-storage
    14.           mountPath: /data
    15.       volumes:
    16.       - name: dynamic-storage
    17.         persistentVolumeClaim:
    18.           claimName: pvc-dynamic
    复制代码

3. 存储范例与实用场景

存储范例配置方式实用场景示例临时存储emptyDir容器间共享临时数据(如缓存)日记处理中心效果当地存储hostPath 或 local开发测试、单节点高性能存储当地数据库、测试环境网络存储NFS/CephFS多节点共享读写文件服务器、共享配置云存储StorageClass 动态供给生产环境持久化存储(跨节点可用)AWS EBS、Azure Disk、GCP PD配置/密钥ConfigMap/Secret注入配置文件或敏感信息数据库毗连字符串、TLS 证书
4. 高级配置本领

(1) 子路径隔离

同一 PVC 挂载到多个 Pod 时,利用 subPath 隔离目录:
  1. volumeMounts:
  2. - name: shared-storage
  3.   mountPath: /app/data
  4.   subPath: app1  # 使用 PVC 中的子目录
复制代码
(2) 文件权限控制

通过 securityContext 设置文件系统权限:
  1. securityContext:
  2.   fsGroup: 1000    # 设置挂载目录的组 ID
  3.   runAsUser: 1000  # 容器运行的用户 ID
复制代码
(3) 存储扩容

动态供给的 PVC 支持在线扩容(需存储插件支持):
  1. kubectl edit pvc pvc-dynamic  # 修改 spec.resources.requests.storage
复制代码
(4) 多 Pod 共享存储

利用 ReadWriteMany 访问模式的存储(如 NFS):
  1. # pvc.yaml
  2. spec:
  3.   accessModes:
  4.     - ReadWriteMany
复制代码

5. 常见问题排查

(1) PVC 处于 Pending 状态

原因:无可用 PV 或 StorageClass 配置错误。
办理
  1. kubectl describe pvc <pvc-name>  # 查看事件日志
  2. kubectl get storageclass         # 检查 StorageClass 是否存在
复制代码
(2) 容器无法写入存储卷

原因:权限不足或存储后端故障。
办理
  1. kubectl exec -it <pod-name> -- ls -l /data  # 检查挂载点权限
  2. kubectl logs <storage-plugin-pod>           # 查看存储插件日志
复制代码
(3) PV 无法接纳

原因:接纳策略为 Retain,需手动删除 PV 和底层数据。
办理
  1. kubectl delete pv <pv-name>  # 手动清理
复制代码

6. 最佳实践


  • 生产环境优先利用动态供给:避免手动管理 PV,进步资源利用率。
  • 公道选择访问模式
    • ReadWriteOnce:数据库等单节点读写场景。
    • ReadWriteMany:文件共享、内容管理系统(CMS)。
  • 定期备份重要数据:纵然利用持久化存储,也需通过工具(如 Velero)备份。
  • 监控存储利用情况:集成 Prometheus 监控 PVC 利用率,预防存储不足。

总结

通过 PV/PVC 和 StorageClass,Kubernetes 提供了机动且强大的存储管理本领。无论是当地开发照旧云上生产环境,公道配置存储卷可确保应用数据的高可用性和持久性。根据业务需求选择合适的存储范例,并团结动态供给、权限控制等高级特性,能够显著提拔运维服从。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表