K8s中的PV的介绍

PV 的生命周期

 PV 生命周期总共四个阶段 :

Available(可用)—— 可用状态,尚未被 PVC 绑定。

Bound(已绑定)—— 绑定状态,已经与某个 PVC 绑定。

Released(已释放)—— 与之绑定的 PVC 已经被删除,但资源尚未被集群回收。

Failed(失败)—— 当删除 PVC 清理资源,自动回收卷时失败,所以处于故障状态。 命令行会显示绑定到 PV 的 PVC 的名称 ——kubectl get pv命令

PV 的常用配置参数

存储能力 (capacity)

PV 可以通过配置 capacity 中的 storage 参数,对 PV 挂多大存储空间进行设置。 目前 capacity 只 有一个设置存储大小的选项,未来可能会增加。

存储卷模式(volumeMode)

PV 可以通过配置 volumeMode 参数,对存储卷类型进行设置,可选项包括: Filesystem: 文件系统,默认是此选项。 Block: 块设备 目前 Block 模式只有 AWSElasticBlockStore、AzureDisk、FC、GCEPersistentDisk、iSCSI、 LocalVolume、RBD、VsphereVolume 等支持)。

访问模式(accessModes)

PV 可以通过配置 accessModes 参数,设置访问模式来限制应用对资源的访问权限,有以下机制访问模 式:

(1) ReadWriteOnce——该卷可以被单个节点以读/写模式挂载

(2) ReadOnlyMany——该卷可以被多个节点以只读模式挂载

(3) ReadWriteMany——该卷可以被多个节点以读/写模式挂载

挂载参数(mountOptions)

PV 可以根据不同的存储卷类型,设置不同的挂载参数,每种类型的存储卷可配置参数都不相同。

存储类 (storageClassName)

PV 可以通过配置 storageClassName 参数指定一个存储类 StorageClass 资源,具有特定 StorageClass 的 PV 只能与指定相同 StorageClass 的 PVC 进行绑定,没有设置 StorageClass 的 PV 也是同样只能与没有指定 StorageClass 的 PVC 绑定。

回收策略(persistentVolumeReclaimPolicy)

PV 可以通过配置 persistentVolumeReclaimPolicy 参数设置回收策略,可选项如下:

Retain(保留): 保留数据,需要由管理员手动清理。

Recycle(回收): 删除数据,即删除目录下的所有文件,比如说执行 rm -rf /thevolume/* 命 令,目前只有 NFS 和 HostPath 支持。

Delete(删除): 删除存储资源,仅仅部分云存储系统支持,比如删除 AWS EBS 卷,目前只有 AWS EBS,GCE PD,Azure 磁盘和 Cinder 卷支持删除。

PVC常用参数

筛选器(selector)

PVC 可以通过在 Selecter 中设置 Laberl 标签,筛选出带有指定 Label 的 PV 进行绑定。 Selecter 中可以指定 matchLabels 或 matchExpressions ,如果两个字段都设定了就需要同时满足 才能匹配。

资源请求(resources)

PVC 设置目前只有 requests.storage 一个参数,用于指定申请存储空间的大小。

存储类(storageClass)

PVC 要想绑定带有特定 StorageClass 的 PV 时,也必须设定 storageClassName 参数,且名称也必 须要和 PV 中的 storageClassName 保持一致。如果要绑定的 PV 没有设置 storageClassName 则 PVC 中也不需要设置。

当 PVC 中如果未指定 storageClassName 参数或者指定为空值,则还需要考虑 Kubernetes 中是否设 置了默认的 StorageClass :(1) 未启用 DefaultStorageClass:等于 storageClassName 值为空。(2) 启用 DefaultStorageClass:等于 storageClassName 值为默认的 StorageClass。 (3)如果设置 storageClassName="",则表示该 PVC 不指定 StorageClass。

访问模式(accessModes)

PVC 中可设置的访问模式与 PV 种一样,用于限制应用对资源的访问权限。

### Kubernetes 动态 PV 的实现方式与配置方法 Kubernetes 动态 PV 是通过 StorageClass 资源实现的,允许根据用户的需求动态创建 PersistentVolume (PV)。这种机制显著提升了存储管理的灵活性和自动化程度。以下是动态 PV 的实现方式和配置方法的详细说明。 #### 1. 动态 PV 的核心组件 - **StorageClass**:定义了一组用于动态创建 PV 的规则和参数[^2]。管理员可以根据性能、备份策略或其他标准创建不同的 StorageClass。 - **Provisioner**:负责实际创建存储资源的插件或工具。例如,`kubernetes.io/aws-ebs` 用于 AWS EBS 卷,`nfs-client-provisioner` 用于 NFS 存储[^3]。 - **PersistentVolumeClaim (PVC)**:用户通过 PVC 请求存储资源,并指定所需的容量和访问模式[^4]。 #### 2. 配置步骤 ##### 2.1 配置 NFS 存储 在使用 NFS 作为动态 PV 的后端存储时,需要先配置 NFS 服务。以下是一个示例: ```bash mkdir /opt/k8s chmod 777 /opt/k8s/ echo "/opt/k8s 20.0.0.0/24(rw,no_root_squash,sync)" > /etc/exports systemctl restart rpcbind nfs ``` 上述命令创建了一个共享目录 `/opt/k8s` 并将其导出给子网 `20.0.0.0/24`[^5]。 ##### 2.2 创建 Service Account 为确保安全性,NFS 客户端 Provisioner 需要一个专用的 Service Account。以下是一个 YAML 示例: ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner namespace: default ``` ##### 2.3 安装 NFS Client Provisioner 使用 Deployment 创建 NFS 客户端 Provisioner,该工具负责动态创建 NFS 存储卷。以下是一个示例: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner spec: replicas: 1 selector: matchLabels: app: nfs-client-provisioner template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: example.com/nfs - name: NFS_SERVER value: <NFS_SERVER_IP> - name: NFS_PATH value: /opt/k8s volumes: - name: nfs-client-root nfs: server: <NFS_SERVER_IP> path: /opt/k8s ``` ##### 2.4 创建 StorageClass 定义一个 StorageClass 来描述动态创建 PV 的规则。以下是一个基于 NFS 的示例: ```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: managed-nfs-storage provisioner: example.com/nfs parameters: archiveOnDelete: "false" ``` ##### 2.5 创建 PVC 用户可以通过 PVC 请求存储资源。以下是一个示例: ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: - ReadWriteMany storageClassName: managed-nfs-storage resources: requests: storage: 1Gi ``` ##### 2.6 测试访问 创建一个 Pod 使用上述 PVC: ```yaml apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: "/usr/share/nginx/html" name: pv-storage volumes: - name: pv-storage persistentVolumeClaim: claimName: example-pvc ``` #### 3. 最佳实践 - **选择合适的 Provisioner**:根据存储后端选择适合的 Provisioner,例如 AWS 使用 `aws-ebs`,NFS 使用 `nfs-client-provisioner`。 - **定义明确的 StorageClass**:为不同类型的存储定义清晰的 StorageClass,便于用户选择[^4]。 - **设置合理的回收策略**:根据业务需求选择 `Delete` 或 `Retain` 回收策略[^4]。 - **监控存储资源**:使用工具如 Prometheus 和 Grafana 监控存储资源的使用情况[^1]。 #### 4. 注意事项 - 确保 NFS 服务器和客户端之间的网络连通性[^5]。 - 配置文件中的 `<NFS_SERVER_IP>` 需替换为实际的 NFS 服务器 IP 地址。 - 动态创建的 PV 默认使用 `Delete` 回收策略,删除 PVC 时会同时删除底层存储资源[^4]。 ```python # 示例 Python 脚本用于验证 NFS 共享目录是否可访问 import os def check_nfs_access(nfs_server, nfs_path): mount_point = "/mnt/nfs" if not os.path.exists(mount_point): os.makedirs(mount_point) command = f"mount -t nfs {nfs_server}:{nfs_path} {mount_point}" result = os.system(command) if result == 0: print("NFS mounted successfully.") else: print("Failed to mount NFS.") check_nfs_access("<NFS_SERVER_IP>", "/opt/k8s") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值