PV、PVC、StorageClass

This commit is contained in:
huanqing.shao
2019-09-06 08:59:05 +08:00
parent 9e0ba7ace3
commit aca4f17b4c
14 changed files with 236 additions and 23 deletions

View File

@ -186,9 +186,9 @@ module.exports = {
collapsable: false,
children: [
'k8s-intermediate/persistent/volume',
'k8s-intermediate/persistent/pv',
'k8s-intermediate/persistent/storage-class',
// 'k8s-intermediate/persistent/nfs',
// 'k8s-intermediate/persistent/pvc',
// 'k8s-intermediate/persistent/storage-class',
]
}
]

Binary file not shown.

View File

@ -18,7 +18,9 @@ description: Kubernetes 学习路径推荐
* [使用 ConfigMap 配置您的应用程序](/learning/k8s-intermediate/config-map.html)
* [使用私有 registry 中的 docker 镜像](/learning/k8s-intermediate/private-registry.html)
* 持久化数据
* [数据卷](/learning/k8s-intermediate/persistent/volume.html)
* [数据卷 Volume](/learning/k8s-intermediate/persistent/volume.html)
* [存储卷 PV 和存储卷声明 PVC](/learning/k8s-intermediate/persistent/pv.html)
* [存储类 StorageClass](/learning/k8s-intermediate/persistent/storage-class.md)
## **课程推荐**

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

@ -0,0 +1,148 @@
---
description: 本文介绍了存储卷 PersistentVolume存储卷声明 PersistentVolumeClaim 的概念,他们的关系,以及如何使用
---
# 存储卷 PersistentVolume
参考文档: Kubernetes 官方文档 [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)
## 概述
与管理计算资源相比管理存储资源是一个完全不同的问题。为了更好的管理存储Kubernetes 引入了 PersistentVolume 和 PersistentVolumeClaim 两个概念,将存储管理抽象成如何提供存储以及如何使用存储两个关注点。
::: tip 关注点分离
Kuboard 可以导出名称空间中应用程序的配置到一个 YAML 文件,然后在新的名称空间导入该 YAML 文件。
* 如果应用程序直接使用 nfs 类型的数据卷,则该 nfs 的 server 和 path 配置随应用程序一起导出到 YAML 文件中,到新的名称空间导入的应用程序还是对应原来的 nfs 配置(除非导入后手工修改 nfs 数据卷的 server/path 参数)。
* 如果应用程序使用 PersistentVolumeClaim 声明该应用需要使用一个存储卷,导出成 YAML 后,可以等到在新的名称空间再导入该 YAML 时,再决定应该使用什么类型的 PersistentVolume 以及对应的参数。(新的名称空间中,可能使用 cephfs 或 glusterfs而不是 nfs
通过 PersistentVolume 和 PersistentVolumeClaimKubernetes 分离了提供存储和使用存储着两个关注点:
* PersistentVolumeClaim 必须定义在与应用程序相同的名称空间中,关注应用程序如何使用存储,通常由应用程序管理员或开发人员负责
* PersistentVolume 只能定义在集群层面,关注集群如何提供存储,通常由集群管理员或者运维人员负责
:::
PersistentVolumePV 存储卷)是集群中的一块存储空间,由集群管理员管理、或者由 Storage Class存储类自动管理。PV存储卷和 node节点一样是集群中的资源kubernetes 集群由存储资源和计算资源组成。PersistentVolumeClaim存储卷声明是一种类型的 Volume数据卷PersistentVolumeClaim存储卷声明引用的 PersistentVolume存储卷有自己的生命周期该生命周期独立于任何使用它的容器组。PersistentVolume存储卷描述了如何提供存储的细节信息NFS、cephfs等存储的具体参数
PersistentVolumeClaimPVC 存储卷声明代表用户使用存储的请求。Pod 容器组消耗 node 计算资源PVC 存储卷声明消耗 PersistentVolume 存储资源。Pod 容器组可以请求特定数量的计算资源CPU / 内存PersistentVolumeClaim 可以请求特定大小/特定访问模式(只能被单节点读写/可被多节点只读/可被多节点读写)的存储资源。
根据应用程序的特点不同,其所需要的存储资源也存在不同的要求,例如读写性能等。集群管理员必须能够提供关于 PersistentVolume存储卷的更多选择无需用户关心存储卷背后的实现细节。为了解决这个问题Kubernetes 引入了 StorageClass存储类的概念
## 存储卷和存储卷声明的关系
存储卷和存储卷声明的关系如下图所示:
* PersistentVolume 是集群中的存储资源,通常由集群管理员创建和管理
* StorageClass 用于对 PersistentVolume 进行分类如果正确配置StorageClass 也可以根据 PersistentVolumeClaim 的请求动态创建 Persistent Volume
* PersistentVolumeClaim 是使用该资源的请求,通常由应用程序提出请求,并指定对应的 StorageClass 和需求的空间大小
* PersistentVolumeClaim 可以做为数据卷的一种,被挂载到容器组/容器中使用
<img src="./pv.assets/image-20190906074512760.png" style="max-width: 450px;"/>
PersistantVolume 和 PersistantVolumeClaim 的管理过程描述如下:
### 提供 Provisioning
有两种方式为 PersistentVolumeClaim 提供 PersistentVolume : 静态、动态
* **静态提供 Static** <Badge text="Kuboard 暂禁用该特性" type="warn"/>
集群管理员实现创建好一系列 PersistentVolume它们包含了可供集群中应用程序使用的关于实际存储的具体信息。
* **动态提供 Dynamic** <Badge text="Kuboard 已支持" type="success"/>
在配置有合适的 StorageClass存储类且 PersistentVolumeClaim 关联了该 StorageClass 的情况下kubernetes 集群可以为应用程序动态创建 PersistentVolume。
### 绑定 Binding
假设用户创建了一个 PersistentVolumeClaim 存储卷声明并指定了需求的存储空间大小以及访问模式。Kubernets master 将立刻为其匹配一个 PersistentVolume 存储卷,并将存储卷声明和存储卷绑定到一起。如果一个 PersistentVolume 是动态提供给一个新的 PersistentVolumeClaimKubernetes master 会始终将其绑定到该 PersistentVolumeClaim。除此之外应用程序将被绑定一个不小于可能大于其 PersistentVolumeClaim 中请求的存储空间大小的 PersistentVolume。一旦绑定PersistentVolumeClaim 将拒绝其他 PersistentVolume 的绑定关系。PVC 与 PV 之间的绑定关系是一对一的映射。
PersistentVolumeClaim 将始终停留在 ***未绑定 unbound*** 状态,直到有合适的 PersistentVolume 可用。举个例子:集群中已经存在一个 50Gi 的 PersistentVolume同时有一个 100Gi 的 PersistentVolumeClaim在这种情况下该 PVC 将一直处于 ***未绑定 unbound*** 状态,直到管理员向集群中添加了一个 100Gi 的 PersistentVolume。
### 使用 Using
对于 Pod 容器组来说PersistentVolumeClaim 存储卷声明是一种类型的 Volume 数据卷。Kubernetes 集群将 PersistentVolumeClaim 所绑定的 PersistentVolume 挂载到容器组供其使用。
### 使用中保护 Storage Object in Use Protection
* 使用中保护Storage Object in Use Protection的目的是确保正在被容器组使用的 PersistentVolumeClaim 以及其绑定的 PersistentVolume 不能被系统删除,以避免可能的数据丢失。
* 如果用户删除一个正在使用中的 PersistentVolumeClaim则该 PVC 不会立即被移除掉,而是推迟到该 PVC 不在被任何容器组使用时才移除;同样的如果管理员删除了一个已经绑定到 PVC 的 PersistentVolume则该 PV 也不会立刻被移除掉,而是推迟到其绑定的 PVC 被删除后才移除掉。
### 回收 Reclaiming
当用户不在需要其数据卷时,可以删除掉其 PersistentVolumeClaim此时其对应的 PersistentVolume 将被集群回收并再利用。Kubernetes 集群根据 PersistentVolume 中的 reclaim policy回收策略决定在其被回收时做对应的处理。当前支持的回收策略有Retained保留、Recycled重复利用、Deleted删除
* **保留 Retain**
保留策略需要集群管理员手工回收该资源。当绑定的 PersistentVolumeClaim 被删除后PersistentVolume 仍然存在,并被认为是”已释放“。但是此时该存储卷仍然不能被其他 PersistentVolumeClaim 绑定,因为前一个绑定的 PersistentVolumeClaim 对应容器组的数据还在其中。集群管理员可以通过如下步骤回收该 PersistentVolume
* 删除该 PersistentVolume。PV 删除后其数据仍然存在于对应的外部存储介质中nfs、cefpfs、glusterfs 等)
* 手工删除对应存储介质上的数据
* 手工删除对应的存储介质,您也可以创建一个新的 PersistentVolume 并再次使用该存储介质
*
* **删除 Delete**
删除策略将从 kubernete 集群移除 PersistentVolume 以及其关联的外部存储介质(云环境中的 AWA EBS、GCE PD、Azure Disk 或 Cinder volume
* **再利用 Recycle** <Badge text="Kuboard 暂不支持" type="warn"/>
* 再利用策略将在 PersistentVolume 回收时执行一个基本的清除操作rm -rf /thevolume/*),并使其可以再次被新的 PersistentVolumeClaim 绑定。
* 集群管理员也可以自定义一个 recycler pod template用于执行清除操作。请参考 [Recycle](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#recycle)
::: tip
动态提供的 PersistentVolume 将从其对应的 StorageClass 继承回收策略的属性。
:::
### 扩展 Expanding Persistent Volumes Claims
Kubernetes 中,该特性处于 beta 状态 <Badge text="Kuboard 暂不支持" type="warn"/>
该特性只针对极少数的 PersistentVolume 类型有效。请参考 [Expanding Persistent Volumes Claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#expanding-persistent-volumes-claims)
## 存储卷类型
Kubernetes 支持 20 种存储卷类型Types of Persistent Volumes但是大多数都特定于具体的云环境如 GCEPersistentDisk / AWSElasticBlockStore / AzureFile / AzureDisk 等,具体请参考 [Types of Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes)
针对自建 Kubernetes 集群的情况Kuboard 支持如下几种存储卷类型:
* NFS <Badge text="Kuboard 已支持" type="success"/>
* CephFS <Badge text="Kuboard 正在计划中" type="warn"/>
## 存储卷 PersistentVolume
在 Kuboard 中查看 PersistentVolume 的界面如下图所示:
![image-20190905221422172](./pv.assets/image-20190905221422172.png)
PersistentVolume 字段描述如下表所示:
| 字段名称 | 可选项/备注 |
| ----------------------- | ------------------------------------------------------------ |
| 容量 Capacity | 通常,一个 PersistentVolume 具有一个固定的存储容量capacity |
| Volume Mode | FEATURE STATE: Kubernetes v1.13 beta<br />Kubernetes 1.9 之前的版本,所有的存储卷都被初始化一个文件系统。当前可选项有:<li>block使用一个 块设备raw block device </li><li>filesystem默认值使用一个文件系统</li> |
| Access Modes | <li>可被单节点读写-ReadWriteOnce </li><li>可被多节点只读-ReadOnlyMany </li><li>可被多节点读写-ReadWriteMany</li> |
| 存储类 StorageClassName | 带有存储类 StorageClassName 属性的 PersistentVolume 只能绑定到请求该 StorageClass 存储类的 PersistentVolumeClaim。<br />没有 StorageClassName 属性的 PersistentVolume 只能绑定到无特定 StorageClass 存储类要求的 PVC。 |
| 回收策略 Reclaim Policy | <li>保留 Retain 手工回收 </li><li>再利用 Recycle 清除后重新可用 (rm -rf /thevolume/*) </li><li>删除 Delete 删除 PV 及存储介质</li> |
| Mount Options | 挂载选项用来在挂载时作为 mount 命令的参数 |
| 状态 Phase | <li>Available 可用的 PV尚未绑定到 PVC</li><li>Bound 已经绑定到 PVC</li><li>Released PVC 已经被删除,但是资源还未被集群回收</li><li>Failed 自动回收失败</li> |
## 存储卷声明 PersistentVolumeClaims
在 Kuboard 中查看存储卷声明的界面如下图所示:
![image-20190906070246134](./pv.assets/image-20190906070246134.png)
| 字段名称 | 可选项/备注 |
| --------------------- | ------------------------------------------------------------ |
| 存储类 | 只有该 StorageClass 存储类的 PV 才可以绑定到此 PVC |
| 读写模式 Access Modes | <li>可被单节点读写-ReadWriteOnce </li><li>可被多节点只读-ReadOnlyMany </li><li>可被多节点读写-ReadWriteMany</li> |
| Volume Modes | <li>block</li><li>filesystem - default</li> |
| 总量 | 请求存储空间的大小 |
## 在数据卷中使用存储卷声明 Claims As Volumes
在您完成存储卷声明的定义后,您可以在 Kuboard 工作复杂编辑器的 ***数据卷 Volume*** 区域引用该存储卷声明,如下图所示:
![image-20190906072544024](./pv.assets/image-20190906072544024.png)

View File

@ -1,5 +0,0 @@
---
description: 存储类声明
---
# 存储类声明

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

View File

@ -1,5 +1,55 @@
---
description: 存储类
description: 本文介绍了存储类的概念及其使用
---
# 存储类
# 存储类 StorageClass
参考文档: Kubernetes 官网 [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/)
## 存储类概述
StorageClass 存储类用于描述集群中可以提供的存储的类型。不同的存储类可能对应着不同的:
* 服务等级quality-of-service level
* 备份策略
* 集群管理员自定义的策略
Kubernetes 自身对存储类所代表的含义并无感知,由集群管理员自行约定。
## 存储类的种类
参考 [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/)Kubernetes 提供 19 种存储类 Provisioner但是绝大多数与具体的云环境相关如 AWSElasticBlockStore / AzureFile / AzureDisk / GCEPersistentDisk 等。
Kuboard 支持的存储类的种类如下:
* NFS <Badge text="Kuboard 已支持" type="success"/>
* CephFS <Badge text="Kuboard 正在计划中" type="warn"/>
## 存储类
在 Kuboard 中查看存储类,如下图所示:
![image-20190906080746368](./storage-class.assets/image-20190906080746368.png)
### 回收策略 Reclaim Policy
由 StorageClass 动态创建的 PersistentVolume 将使用 StorageClass 中定义的回收策略。可选项有:
* 回收后删除 Delete
* 回收后保留 Retain
同一 StorageClass 中,手动创建的 PersistentVolume将使用创建时手动指定的回收策略。
### 存储卷绑定模式 Volume Binding Mode
StorageClass 根据存储卷绑定模式的选项,确定何时执行 存储卷与存储卷声明的绑定、何时执行动态存储卷提供(动态创建存储卷)。可选项有:
* 即刻绑定 Immediate
存储卷声明创建后,立刻动态创建存储卷并将其绑定到存储卷声明。
* 首次使用时绑定 WaitForFirstConsumer
直到存储卷声明第一次被容器组使用时,才创建存储卷,并将其绑定到存储卷声明。

View File

@ -1,8 +1,8 @@
---
description: 数据卷
description: 本文介绍 Kubernetes 中 Volume数据卷的基本概念、用法以及支持的数据卷类型
---
# 数据卷
# 数据卷 Volume
参考文档: Kubernetes 官网文档 [Volumes](https://kubernetes.io/docs/concepts/storage/volumes/)
@ -24,7 +24,7 @@ Docker 里同样也存在一个 volume数据卷的概念但是 docker
* 一个容器组可以包含多个数据卷、多个容器
* 一个容器通过挂载点决定某一个数据卷被挂载到容器中的什么路径
* 不同类型的数据卷对应不同的存储介(图中列出了 nfs、PVC、ConfigMap 三种存储介,接下来将介绍更多)
* 不同类型的数据卷对应不同的存储介(图中列出了 nfs、PVC、ConfigMap 三种存储介,接下来将介绍更多)
<img src="./volume.assets/image-20190904201849792.png" style="max-width: 450px;"/>
@ -57,7 +57,7 @@ Docker 里同样也存在一个 volume数据卷的概念但是 docker
## 数据卷的类型
Kubernetes 目前支持多达 28 种数据卷类型,如需查阅所有的数据卷类型,请查阅 Kubernetes 官方文档 [Volumes](https://kubernetes.io/docs/concepts/storage/volumes/)
Kubernetes 目前支持多达 28 种数据卷类型(其中大部分特定于具体的云环境如 GCE/AWS/Azure 等),如需查阅所有的数据卷类型,请查阅 Kubernetes 官方文档 [Volumes](https://kubernetes.io/docs/concepts/storage/volumes/)
本文针对自建 Kubernetes 时,经常使用的数据卷的类型描述如下:
@ -94,6 +94,16 @@ Kubernetes 目前支持多达 28 种数据卷类型,如需查阅所有的数
* MySQL的data目录建议只在测试环境中
* 用户上传的临时文件
### cephfs <Badge text="Kuboard正在计划中" type="warn"/>
* **描述**
cephfs 数据卷使得您可以挂载一个外部 CephFS 卷到您的容器组中。对于 kubernetes 而言cephfs 与 nfs 的管理方式和行为完全相似,适用场景也相同。不同的仅仅是背后的存储介质。
* **适用场景**
同 nfs 数据卷
### hostPath <Badge text="Kuboard已支持" type="success"/>
* **描述**
@ -143,9 +153,7 @@ Kubernetes 目前支持多达 28 种数据卷类型,如需查阅所有的数
具体使用方法请参考 [使用 ConfigMap 配置您的应用程序](/learning/k8s-intermediate/config-map.html#configmap-数据卷)
::: tip
将 ConfigMap 数据卷挂载到容器时,如果该挂载点指定了 ***数据卷内子路径*** subPath则该 ConfigMap 被改变后,该容器挂载的内容仍然不变。
:::
* **适用场景**
@ -156,16 +164,20 @@ Kubernetes 目前支持多达 28 种数据卷类型,如需查阅所有的数
* **描述**
secret 数据卷可以用来注入敏感信息(例如密码)到容器组。您可以将敏感信息存入 kubernetes secret 对象,并通过 Volume数据卷以文件的形式挂载到容器组或容器。secret 数据卷使用 tmpfs基于 RAM 的文件系统)挂载。
::: tip
将 Secret 数据卷挂载到容器时,如果该挂载点指定了 ***数据卷内子路径*** subPath则该 Secret 被改变后,该容器挂载的内容仍然不变。
:::
* **适用场景**
### cephfs <Badge text="Kuboard正在计划中" type="warn"/>
* **描述**
* **适用场景**
* 将 HTTPS 证书存入 kubernets secret并挂载到 /etc/nginx/conf.d/myhost.crt、/etc/nginx/conf.d/myhost.pem 路径,用来配置 nginx 的 HTTPS 证书
### persistentVolumeClaim <Badge text="Kuboard已支持" type="success"/>
* **描述**
* **适用场景**
persistentVolumeClaim 数据卷用来挂载 PersistentVolume 存储卷。PersistentVolume 存储卷为用户提供了一种在无需关心具体所在云环境的情况下”声明“ 所需持久化存储的方式。
请参考 [存储卷](./pv.html)

View File

@ -127,7 +127,9 @@ Kuboard 为 Kubernetes 初学者设计了如下学习路径:
* [使用 ConfigMap 配置您的应用程序](/learning/k8s-intermediate/config-map.html)
* [使用私有 Registry 中的 docker 镜像](/learning/k8s-intermediate/private-registry.md)
* 持久化数据
* [数据卷](/learning/k8s-intermediate/persistent/volume.html)
* [数据卷 Volume](/learning/k8s-intermediate/persistent/volume.html)
* [存储卷 PV 和存储卷声明 PVC](/learning/k8s-intermediate/persistent/pv.html)
* [存储类 StorageClass](/learning/k8s-intermediate/persistent/storage-class.md)
* 进阶路线一
* 在实际项目中锻炼完成各种与微服务、容器化、Kubernetes更多高级功能的学习、理解和应用
* **适合人群:** 身边有人带路,并且技术功底比较强的人,能够自行翻阅大量 docker / kubernetes 的官网英文资料。这些人在完成上面的 Kubernetes 入门教程之后,基本上可以在项目中开始实战了。

View File

@ -1,3 +1,7 @@
## v1.0.3-beta.1
**发布日期**
* 存储卷声明去掉分配模式的字段
* 存储卷声明增加 Volume Modes 字段
* 存储卷声明将 读写模式 修改为 Access Modes