点击上方蓝字 👆关注公众号,别让消息溜走
后台回复【加群】,与牛人互动不停
在 Kubernetes 中,Pod 是临时的,当它们被删除或重新启动时,存储在其中的任何数据都会丢失。
为了避免这种情况,我们需要使用持久存储选项,例如 PV(持久Volumes)和 PVC(持久Volumes声明)。PV是具有独立生命周期的存储资源,而PVC是对存储的声明。使用它们来简化存储管理和扩展。配置持久Volumes可以是静态的,也可以是动态的。StorageClass 定义动态配置的 PV 的供应商、参数和回收策略。
在 Kubernetes 中,Pod 是最小的可部署单元,可以包含一个或多个容器,每个容器都有自己的存储要求。但是,由于Pod 是短暂的,因此当 Pod 被删除或重新启动时,存储在 Pod 内的任何数据都会丢失。为了避免此类数据丢失,重要的是使用 持久存储选项,允许将数据存储在 Pod 外部,并在 Pod 的生命周期之外持续存在。
在 Kubernetes 中,Volumes是pod 中的容器可以访问的目录。Volumes为容器提供了一种存储和访问数据的方式,它们可用于在同一 Pod 中的容器之间共享数据。
要在 Pod 中使用Volumes,您需要使用该字段在 Pod 的 YAML 文件spec.volumes中指定Volumes,然后使用该字段spec.containers[*].volumeMounts将其挂载到容器文件系统中的目录。
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp-container
image: myapp-image
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
hostPath:
path: /mnt/data
在此示例中,该spec.volumes字段用于定义名为data-volume 的 hostPath Volumes。该hostPath字段指定主机上存储数据的目录。然后使用spec.containers[*].volumeMounts该字段将data-volume Volumes挂载到容器文件系统内的目录。在这种情况下,data-volumeVolumes将挂载到容器内的/data目录。
此配置允许容器将数据写入主机上的/mnt/data目录,即使Pod被删除或重新启动,该数据也会被持久化。
Volumes会增加应用程序的复杂性,因为它们需要单独管理每个 Pod 的存储要求。更新 Pod 的存储要求需要修改 Pod 定义文件并重新部署,这可能非常耗时且容易出错。
Kubernetes 中的持久Volumes( PV) 是集群中配置的存储资源。它具有独立于使用它的 Pod 的生命周期,即使 Pod 被删除,数据也可以保留。PV 可以是物理磁盘或基于云的存储资源(例如 Amazon EBS Volumes)。
持久Volumes声明( PVC) 是用户对存储的声明。用户可以发出 PVC 请求,而无需知道存储来自何处的详细信息。然后,Kubernetes控制平面找到满足声明要求的可用 PV并将PVC绑定到 PV。Kubernetes 中 PV 和 PVC 之间是一对一的关系。一旦 PVC 绑定到 PV ,其他 PVC 就不能绑定到同一个 PV。
通过使用 PV 和 PVC,简化了 Kubernetes 中的存储管理和扩展。管理员可以独立于 Pod 管理 PV,从而能够在不影响 Pod 的情况下配置、调整大小和删除存储资源。同时,PVC 允许用户请求特定的存储量,而无需了解底层存储系统。
注意:在生产集群中,不建议使用 hostPath。集群管理员会提供网络存储资源,比如 Google Compute Engine 持久盘卷、NFS 共享卷或 Amazon Elastic Block Store 卷。集群管理员还可以使用 StorageClass 来设置动态制备存储。
pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/data
此配置文件指定卷位于集群节点上的 /mnt/data 路径。其配置还指定了卷的容量大小为 5 GB,访问模式为 ReadWriteOnce, 这意味着该卷可以被单个节点以读写方式安装。
persistentVolumeReclaimPolicy有以下三个可用选项:Retain:删除 PVC 时不会删除 PV 的存储,允许手动恢复数据。Delete:删除 PVC 时,PV 的存储也会被删除。Recycle:PV 的存储已格式化并可供新 PVC 使用。
pvc.yaml
你将创建一个 PersistentVolumeClaim,它请求至少 5 GB 容量的卷, 该卷一次最多可以为一个节点提供读写访问。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Kubernetes 中提供三种类型的accessModes: **1. ReadWriteOnce (RWO)**:此模式允许单个节点以读写方式挂载Volumes。**2. ReadOnlyMany (ROX)**:此模式允许Volumes被多个节点以只读方式挂载。 3. ReadWriteMany (RWX ):此模式允许Volumes以读写方式被多个节点挂载。
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: my-volume
mountPath: /data
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
Pod 有一个名为my-volume的Volumes,它是使用名为my-pvc的 PVC 创建的。
然后使用volumeMounts字段将该Volumes挂载到容器的文件系统。该volumeMounts字段指定my-volumeVolumes应挂载在容器内的/data目录中。
在 Kubernetes 中,PVC 和 PV 的绑定遵循以下规则:
1. 按 Access Mode 匹配:PVC 请求的 Access Mode 必须与 PV 支持的 Access Mode 匹配,否则不能进行绑定。
2. 按 Storage Class 匹配:如果 PVC 显式指定了 Storage Class,则只能绑定到支持该 Storage Class 的 PV 上;如果 PVC 没有指定 Storage Class,则可以绑定到任何 PV 上。
3. 按容量大小匹配:PVC 请求的容量大小必须小于等于 PV 的可用容量大小。
4. 按 Selector 匹配:如果 PV 没有被绑定到 PVC,那么系统会按照 Selector 规则寻找匹配的 PV。如果找到多个匹配的 PV,那么会选择 Storage Class 匹配的 PV 中最小的一个。
5. 静态绑定:管理员可以手动创建 PV,并将其绑定到 PVC 上,此时 PV 和 PVC 的属性必须匹配。
绑定后,PVC 可以通过 PVC 名称来引用 PV,而不需要关心 PV 的实际名称。这种解耦合的方式可以使管理员更加方便地管理存储资源,并且在进行存储迁移时,也可以更加灵活地替换 PV。
在 Kubernetes 中,有两种配置Volumes的方法:静态和动态。
静态配置涉及集群管理员创建一组具有预定义存储类型的持久Volumes (PV) 供开发人员使用。它非常适合具有可预测存储需求或跨多个团队或应用程序共享存储的组织。
当使用定义所需存储类型的StorageClass 创建持久Volumes声明 (PVC) 时,会自动配置存储。此方法消除了管理员手动管理 PV 的需要,适合具有不可预测的存储需求或需要更灵活的存储选项的组织。
在 Kubernetes 中,StorageClass 是一个对象,每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段。StorageClass 为管理员提供了一种定义具有不同性能特征或后端存储提供程序的存储配置文件的方法。
StorageClass 支持动态配置存储Volumes,这意味着当用户创建持久Volumes声明(PVC) 时,会根据 StorageClass 的参数自动为其配置Volumes。它简化了存储管理,为 Kubernetes 中的存储资源管理提供了更大的灵活性和效率。
关于StorageClass和 PV/PVC 的关系,我们这里借用《深入剖析kubernetes》一书中的描述来说明:
• "PVC 描述的,是 Pod 想要使用的持久化存储的属性,比如存储的大小、读写权限等。"
• "PV 描述的,则是一个具体的 Volume 的属性,比如 Volume 的类型、挂载目录、远程存储服务器地址等。"
• "而 StorageClass 的作用,则是充当 PV 的模板。并且,只有同属于一个 StorageClass 的 PV 和 PVC,才可以绑定在一起。"
当一个 PVC 没有指定 storageClassName 时,会使用默认的 StorageClass。集群中只能有一个默认的 StorageClass。如果不小心设置了多个默认的 StorageClass, 当 PVC 动态配置时,将使用最新设置的默认 StorageClass。
storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
定义供应商和存储参数,以便在请求 PVC 时按需创建 PV。
PVC.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: fast
请求具有特定存储大小和 accessModes的 PVC,并指定storageClassName--与 storage-class.yaml 中的名称匹配的StorageClass。
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: my-volume
mountPath: /data
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
使用persistentVolumeClaim字段引用 PVC。
1. Persistent Volume (PV) :持久卷,是集群中的存储资源,可以被动态或静态地分配给 Pod。它代表了一个物理或虚拟的存储资源,可以是磁盘、网络存储等。
2. Persistent Volume Claim (PVC) :持久卷声明,是 Pod 对持久卷的请求。PVC 定义了所需的存储容量、访问模式等。系统根据 PVC 创建或绑定合适的 PV。
3. StorageClass:存储类别,定义了动态分配 PV 的策略。StorageClass 允许管理员为 PVC 指定存储特性,如性能、复制级别等,系统会根据 StorageClass 创建 PV。
4. Volume:卷,是容器内的文件或目录,用于在 Pod 中存储数据。卷可以连接到 PV 或其他存储资源,提供持久化存储。
5. Dynamic Provisioning:动态分配,是自动创建 PV 的过程。使用 StorageClass,Kubernetes 可以在 PVC 创建时自动创建和绑定 PV,简化了存储管理。

原文作者:云原生AI百宝箱;如有侵权,请联系管理员删除。