Kubernetes的的 Persistent Volumes

经过一番实验,证明,这东西除了抽象,没啥鸟用,直接挂 Volume 应该是目前最佳选择。

持久卷 PersistentVolumes

本文描述了 Kubernetes 中的 PersistentVolumes。要求读者有对卷 (volumes) 所有了解。

简介

存储管理跟计算管理是两个不同的问题。PersistentVolume 子系统,对存储的供应和使用做了抽象,以 API 形式提供给管理员和用户使用。要完成这一任务,我们引入了两个新的 API 资源:PersistentVolume(持久卷)PersistentVolumeClaim(持久卷申请)

PersistentVolume(PV)是集群之中的一块网络存储。跟 Node 一样,也是集群的资源。PV 跟 Volume (卷) 类似,不过会有独立于 Pod 的生命周期。这一 API 对象包含了存储的实现细节,例如 NFS、iSCSI 或者其他的云提供商的存储系统。

PersistentVolumeClaim (PVC) 是用户的一个请求。他跟 Pod 类似。Pod 消费 Node 的资源,PVCs 消费 PV 的资源。Pod 能够申请特定的资源(CPU 和 内存);Claim 能够请求特定的尺寸和访问模式(例如可以加载一个读写,以及多个只读实例)

PV 和 PVC 的生命周期

PV 是集群的资源。PVC 是对这一资源的请求,也是对资源的所有权的检验。PV 和 PVC 之间的互动遵循如下的生命周期。

供应

集群管理员会创建一系列的 PV。这些 PV 包含了为集群用户提供的真实存储资源。他们可利用 Kubernetes API 来消费。

绑定

用户创建一个包含了容量和访问模式的持久卷申请。Master 会监听 PVC 的产生,并尝试根据请求内容查找匹配的 PV,并把 PV 和 PVC 进行绑定。用户能够获取满足需要的资源,并且在使用过程中可能超出请求数量。

如果找不到合适的卷,这一申请就会持续处于非绑定状态,一直到出现合适的 PV。例如一个集群准备了很多的 50G 大小的持久卷,(虽然总量足够)也是无法响应 100G 的申请的,除非把 100G 的 PV 加入集群。

使用

Pod 把申请作为卷来使用。集群会通过 PVC 查找绑定的 PV,并 Mount 给 Pod。对于支持多种访问方式的卷,用户在使用 PVC 作为卷的时候,可以指定需要的访问方式。

一旦用户拥有了一个已经绑定的 PVC,被绑定的 PV 就归该用户所有了。用户的 Pods 能够通过在 Pod 的卷中包含的 PVC 来访问他们占有的 PV。

释放

当用户完成对卷的使用时,就可以利用 API 删除 PVC 对象了,而且他还可以重新申请。删除 PVC 后,对应的卷被视为 “被释放”,但是这时还不能给其他的 PVC 使用。之前的 PVC 数据还保存在卷中,要根据策略来进行后续处理。

回收

PV 的回收策略向集群阐述了在 PVC 释放卷的时候,应如何进行后续工作。目前可以采用三种策略:保留,回收或者删除。保留策略允许重新申请这一资源。在持久卷能够支持的情况下,删除策略会同时删除持久卷以及 AWS EBS/GCE PD 或者 Cinder 卷中的存储内容。如果插件能够支持,回收策略会执行基础的擦除操作(rm -rf /thevolume/*),这一卷就能被重新申请了。

持久卷的类型

持久卷是以插件方式实现的,目前支持如下插件:

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • Glusterfs
  • HostPath (单节点测试使用)

持久卷

每个 PV 包含一个 spec 以及 status ,用于描述该卷的规格和状态。

  apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: pv0003
  spec:
    capacity:
      storage: 5Gi
    accessModes:
      - ReadWriteOnce
    persistentVolumeReclaimPolicy: Recycle
    nfs:
      path: /tmp
      server: 172.17.0.2

Capacity(容量)

一般来说,PV 会指定存储容量。这里需要使用 PV 的 capcity 属性。参见 Kubernetes 的 Resource Model 一文,来获取这一属性的计量单位 (Mi/Gi....)。

目前存储大小是唯一一个能够被申请的指标,今后会加入更多属性,例如 IOPS,吞吐能力等。

Access Modes(访问模式)

只要资源提供者支持,持久卷能够被用任何方式加载到主机上。每种存储都会有不同的能力,每个 PV 的访问模式也会被设置成为该卷所支持的特定模式。例如 NFS 能够支持多个读写客户端,但是某个 NFS PV 可能会在服务器上以只读方式使用。每个 PV 都有自己的一系列的访问模式,这些访问模式取决于 PV 的能力。

访问模式的可选范围如下:

  • ReadWriteOnce:该卷能够以读写模式被加载到一个节点上。
  • ReadOnlyMany:该卷能够以只读模式加载到多个节点上。
  • ReadWriteMany:该卷能够以读写模式被多个节点同时加载。

在 CLI 下,访问模式缩写为:

  • RWO:ReadWriteOnce
  • ROX:ReadOnlyMany
  • RWX:ReadWriteMany

重要!一个卷不论支持多少种访问模式,同时只能以一种访问模式加载。例如一个 GCEPersistentDisk 既能支持 ReadWriteOnce ,也能支持 ReadOnlyMany。

Recycling Policy(回收策略)

当前的回收策略可选值包括:

  • Retain - 人工重新申请
  • Recycle - 基础擦除(“rm -rf /thevolume/*”)
  • Delete - 相关的存储资产例如 AWS EBS,GCE PD 或者 OpenStack Cinder 卷一并删除。

目前,只有 NFS 和 HostPath 支持 Recycle 策略,AWS EBS、GCE PD 以及 Cinder 卷支持 Delete 策略(其他的都是 Retain 是吧。。)。

阶段(Phase)

一个卷会处于如下阶段之一:

  • Available:可用资源,尚未被绑定到 PVC 上
  • Bound:该卷已经被绑定
  • Released:PVC 已经被删除,但该资源尚未被集群回收
  • Failed:该卷的自动回收过程失败。

CLI 会显示绑定到该 PV 的 PVC。

PersistentVolumeClaims(持久卷申请)

每个 PVC 包含一个 spec 以及 status,用以表达其规格和状态。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi

访问模式

PVC 使用跟 PV 一致的访问模式。

资源

PVC 跟 Pod 一样可以请求特定数量的资源。在这里的请求内容就是存储(storage)。Resource Model 文中提到的内容对 PV 和 PVC 同样适用。

PVC 卷

Pod 能够借助 PVC 来访问存储。PVC 必须跟 Pod 处于同一个命名空间。集群找到 Pod 命名空间中的 PVC,然后利用 PVC 获取到背后的 PV。这个卷就会被加载到主机上,让 Pod 可以使用。

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
      image: dockerfile/nginx
      volumeMounts:
      - mountPath: "/var/www/html"
        name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: myclaim

转载于:https://www.cnblogs.com/leidaxia/p/6485646.html

<think>我们正在解决用户的问题:执行 `kubectl describe pv pv-nfs` 时出现报错 `persistentvolumes 'pv-nfs' not found`。 根据用户提供的引用和上下文,我们可以分析可能的原因和解决方案。 引用[1]和[2]中显示,当用户创建PVC后,使用`kubectl get pv`和`kubectl get pvc`命令时,没有找到任何资源(No resources found)。这可能是由于PV尚未创建,或者创建失败。 用户之前的问题中,我们给出了创建PV的步骤,并假设用户已经创建了名为`pv-nfs`的PV。但根据错误信息,该PV不存在。 可能的原因: 1. PV尚未创建:用户可能没有成功创建PV,或者创建PV的YAML文件中的名称不是`pv-nfs`。 2. PV创建失败:PV创建过程中出现错误,导致PV没有成功创建。 3. 命名空间问题:PV是集群级别的资源,但用户可能没有在正确的命名空间下查看(实际上PV是集群范围的,没有命名空间的概念,所以不存在命名空间问题)。 4. 权限问题:如引用[4]所示,用户可能没有足够的权限查看PV(例如,用户`magedu`无法列出集群范围的PV资源)。 因此,我们需要按照以下步骤排查: 步骤1:检查PV是否已创建 执行命令: ```bash kubectl get pv ``` 查看输出的列表中是否有名为`pv-nfs`的PV。 步骤2:如果没有找到,则检查PV的创建过程 - 确认用于创建PV的YAML文件(如`pv.yaml`)中`metadata.name`字段确实是`pv-nfs`。 - 重新应用该YAML文件:`kubectl apply -f pv.yaml`。 - 检查是否有错误信息。 步骤3:检查PV的创建状态 - 使用`kubectl get pv`查看PV的状态,如果是`Available`、`Bound`等状态则存在,如果是`Failed`则需排查原因。 步骤4:权限问题 - 如果执行`kubectl get pv`时出现权限错误(如引用[4]中的错误),则需要检查当前用户的权限。 - 使用`kubectl auth can-i list persistentvolumes`来检查当前用户是否有权限列出PV。 - 如果没有权限,需要联系集群管理员授予权限。 步骤5:确认PV是否被删除 - 如果之前创建过,但可能被删除了,需要重新创建。 根据用户提供的引用[1]中,当PVC处于`Pending`状态时,可能是因为没有可用的PV(或者StorageClass没有正确配置)。因此,用户需要确保PV已经成功创建。 解决方案: 1. 重新创建PV(如果尚未创建): 确保YAML文件正确,然后运行: ```bash kubectl apply -f pv.yaml ``` 2. 检查PV列表: ```bash kubectl get pv ``` 如果看到`pv-nfs`,则说明创建成功。 3. 如果创建成功但无法描述,检查权限: ```bash kubectl auth can-i get persistentvolume pv-nfs ``` 如果返回`no`,则需要提升权限。 4. 如果创建失败,查看事件: ```bash kubectl get events --field-selector involvedObject.name=pv-nfs ``` 5. 如果PV创建成功,但状态不是`Available`,可能是配置问题(如NFS服务器不可达等),需要检查PV的配置。 根据引用[1]和[2]中的情况,用户可能遇到了PV没有创建的问题。因此,我们重点检查PV的创建。 由于用户之前提供的引用中,有用户尝试创建PVC但PV不存在的情况,所以用户需要先确保PV已经创建。 另外,引用[4]中显示,用户`magedu`无法列出PV,所以如果当前用户是`magedu`,则需要使用具有权限的用户,或者让管理员给该用户授权。 授权示例(集群管理员操作): 创建一个ClusterRoleBinding,将列出PV的权限授予用户或用户所在组。 但是,首先需要确认是否是权限问题。如果不是权限问题,那么就是PV没有创建。 因此,我们建议用户按照以下步骤操作: 1. 使用有权限的账户(如管理员)执行`kubectl get pv`,查看PV是否存在。 2. 如果不存在,则使用管理员账户创建PV。 3. 如果存在,但当前用户无法查看,则需授权。 由于用户问题中并没有明确说明当前用户权限,我们优先考虑PV是否创建。 总结步骤: 步骤1:检查PV是否存在 ```bash kubectl get pv pv-nfs ``` 步骤2:如果不存在,则创建 ```bash kubectl apply -f pv.yaml # 确保pv.yaml中名称是pv-nfs ``` 步骤3:如果存在,检查权限 ```bash kubectl auth can-i get persistentvolume pv-nfs ``` 步骤4:授权(如果需要) 例如,创建一个RoleBinding(因为PV是集群资源,所以需要ClusterRoleBinding): ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pv-reader-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: view # 使用内置的view角色,该角色有查看大多数资源的权限 subjects: - kind: User name: magedu # 替换为实际用户名 apiGroup: rbac.authorization.k8s.io ``` 步骤5:如果PV创建失败,查看错误信息 ```bash kubectl describe pv pv-nfs # 如果已经创建但状态不对,用这个命令查看详情 ``` 注意:如果PV创建时配置有误(如NFS路径错误、服务器不可达等),PV可能处于不可用状态,但不会自动消失,除非被删除。 因此,我们给出以下具体操作: 1. 创建PV(如果未创建): 使用用户之前提供的YAML示例,确保NFS服务器地址和路径正确。 2. 如果创建后仍然无法看到,并且没有错误提示,则可能是权限问题。 3. 如果权限没有问题,则可能是上下文(context)问题,确保kubectl连接的是正确的集群。 根据引用[4]中用户使用了`--context`参数,所以用户可能配置了多个集群上下文。因此,需要确保在执行命令时使用正确的上下文。 例如: ```bash kubectl get pv --context=正确的上下文名称 ``` 综上所述,我们建议用户逐步排查:PV是否存在、创建是否正确、权限是否足够、上下文是否正确。 现在,我们按照用户要求生成相关问题:</think>### 解决 `kubectl describe pv pv-nfs` 报错:`persistentvolumes 'pv-nfs' not found` 当执行 `kubectl describe pv pv-nfs` 时出现此错误,表示 Kubernetes 集群中不存在名为 `pv-nfs` 的持久卷(PV)。以下是可能原因及解决方案: --- #### 原因分析与解决方案 1. **PV 尚未创建** **现象**:引用[1][2]中 `kubectl get pv` 返回 `No resources found` **解决方案**: - 确认已正确创建 PV: ```bash kubectl apply -f pv.yaml # 确保 YAML 文件存在且配置正确 ``` - 检查 YAML 文件是否包含以下关键字段: ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs # 名称必须匹配 ``` 2. **PV 名称不匹配** **现象**:命令中指定的 PV 名称与 YAML 中定义不一致 **解决方案**: - 检查 PV 实际名称: ```bash kubectl get pv # 查看现有 PV 列表 ``` - 使用正确的名称查询: ```bash kubectl describe pv <实际名称> ``` 3. **权限不足** **现象**:引用[4]显示用户 `magedu` 无权限访问集群级资源 **解决方案**: - 检查当前用户权限: ```bash kubectl auth can-i list persistentvolumes ``` - 使用管理员账户或申请权限: ```bash kubectl describe pv pv-nfs --as=admin-user # 切换用户 ``` 4. **PV 创建失败** **现象**:PV 状态为 `Failed` 或未出现在列表中 **解决方案**: - 查看创建日志: ```bash kubectl get events --field-selector involvedObject.name=pv-nfs ``` - 常见故障原因: - NFS 服务器不可达(检查 `spec.nfs.server` 配置) - 存储路径权限不足(NFS 目录需开放读写权限) 5. **PV 已被删除** **现象**:PV 曾经存在但当前不可见 **解决方案**: - 重建 PV: ```bash kubectl apply -f pv.yaml # 重新部署 YAML ``` --- #### 验证步骤 1. **确认 PV 存在**: ```bash kubectl get pv pv-nfs # 预期输出 STATUS=Available/Bound ``` 2. **检查详细配置**: ```bash kubectl get pv pv-nfs -o yaml # 查看完整配置 ``` 3. **验证 NFS 连通性**(若使用 NFS): ```bash ping <NFS服务器IP> # 测试网络 showmount -e <NFS服务器IP> # 检查共享目录 ``` --- #### 关键配置注意事项 1. **PV 名称唯一性**:集群内 PV 名称必须唯一 2. **NFS 路径验证**:确保 `spec.nfs.path` 在服务器存在且可访问 3. **回收策略冲突**:若 PVC 已绑定,需先删除 PVC 才能重建 PV(`Retain` 策略时) > 示例:成功创建后的 PV 状态 > ``` > NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS AGE > pv-nfs 5Gi RWX Retain Available nfs 3m > ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值