系列:4.4、Kubernetes 存储

Kubernetes 存储

Kubernetes storage存储的相关选项

1、Kubernetes Volumes

由于 Pod 是短暂的,我们有时要求 Pod 上的数据可用于下一个计划的 Pod。或者,有时容器应该在 Pod 中共享文件。卷volume通常用于解决这些问题。

如果您熟悉 docker 中的卷的概念,卷的概念在 Kubernetes 中是相似的,但更高级。在 Kubernetes 中,不同类型的卷volume使用户能够根据应用程序的需要使用卷volume。

对于不同的用例和不同的平台,有许多类型的卷Volumes。你可以在这里找到整个列表:https://kubernetes.io/docs/concepts/storage/volumes/#volume-types

将我们的本地文件系统用于卷的选项很少,例如; local、hostPath 和 emptyDir。为了给你这个概念的基础知识,我将使用 emptyDir。

当 Pod 分配给一个节点时,首先会创建一个 emptyDir 卷,并且只要该 Pod 在该节点上运行就存在。顾名思义,emptyDir 卷最初是空的。 Pod 中的所有容器都可以在 emptyDir 卷中读取和写入相同的文件,尽管该卷可以安装在每个容器中相同或不同的路径上。当 Pod 因任何原因从节点中移除时,emptyDir 中的数据将被永久删除。

让我们再次使用 emptyDir 卷创建我们的 nginx pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-emptydir
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /tmp
      name: tmp-volume
  volumes:
  - name: tmp-volume
    emptyDir: {}

该配置中将nginx容器中的 /tmp 挂载在 本地文件系统的空目录上。

kubectl apply -f emptydir.yaml

在这里插入图片描述

查看该pod信息

kubectl describe   pod nginx-emptydir

在这里插入图片描述

2、Kubernetes Storage Classes (存储类别)

StorageClass 为管理员提供了一种描述他们提供的存储“类别”的方法。

每个 StorageClass 都包含字段 provisioner、parameters 和 reclaimPolicy,当需要动态配置属于该类的 PersistentVolume 时使用这些字段。

基本上,使用存储类,您可以定义要用于挂载卷的存储 (PersistentVolume)。

在 Provisioner 下,您必须根据您的存储设置指定配置程序。例如,如果您使用 AWS 进行存储,这意味着您将使用 AWS EBS,那么您必须检查存储块提供程序上的配置文件。必须提供Provisioner字段。

ReclaimPolicy 用于定义如果用户使用完卷会发生什么。有两个选项可用:删除和保留,其中删除是在使用后删除卷,您可能猜到保留是保留它。如果未提供任何内容,则此参数默认为删除。

创建存储类时的另一个重要参数是 VolumeBindingMode。默认模式是立即Immediate。此模式表示一旦创建 PersistentVolumeClaim,就会发生卷绑定和动态供应。另一种模式称为 WaitForFirstConsumer。在这种模式下,绑定将被延迟,PersistentVolume 的配置只会在 Pod 开始使用 PersistentVolumeClaim 时发生。

PersistentVolume 的动态配置通常发生在非本地环境(例如云等)中(至少在生产中)。在本地使用中,如果不是如下所示的本地存储类示例,我们可能会使用 PersistentVolume 的静态配置。

storage-local.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
kubectl apply -f storage-local.yaml

查看storage:

kubectl get storageclass

或者:

kubectl get sc

在这里插入图片描述

3、Persistent Volumes

PersistentVolume 是集群中的一块存储,由管理员配置或使用存储类storage class动态配置。

当我们讨论volumes和emptyDir示例时,我们看到只要pod存在,volume就存在。 但是 Kubernetes 的整个想法是拥有高可用的系统。 因此,我们需要一个不依赖于特定 Pod 的卷。 为此,我们使用 PersistentVolumes。

您可以静态或动态配置 PersistentVolume。

对于静态配置,应提供真实存储的详细信息。 对于动态供应,应该创建一个存储类(参见上面的部分)。

例如,让我们创建一个 hostPath。 请注意,不建议将 hostPath 用于生产目的,而仅用于开发和测试。

persistent-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv
spec:
  storageClassName: standard
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

创建:

kubectl apply -f persistent-volume.yaml

查看:

 kubectl get persistentvolumes

或者:

kubectl get pv

在这里插入图片描述

4、PersistentVolumeClaims

创建的 PersistentVolume 可以被多个源使用,因此每个资源都应该声明它自己的一部分。通过使用 PersistentVolumeClaim 实现。换句话说,您正在从该持久卷中声明你的卷。

创建 PVC 时的重要参数是:

accessModes:可以以资源提供者支持的任何方式将 PersistentVolume 挂载到主机上。访问模式有:

ReadWriteOnce — 卷可以由单个节点以读写方式挂载
ReadOnlyMany — 卷可以被许多节点以只读方式挂载
ReadWriteMany — 卷可以被许多节点以读写方式挂载
ReadWriteOncePod — 卷可以由单个 Pod 以读写方式挂载。
volumeModes:如果未指定,则默认为 FileSystem,这是通常的文件系统用法。另一个选项是 Block,它使用卷作为原始块设备。 Pod 中运行的应用程序必须知道如何处理原始块设备。

resources:声明 PersistentVolumes(例如 Pod)的资源和请求的容量在此处指定。

persistent-volume-vlaims.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

创建

kubectl apply -f persistent-volume-vlaims.yaml

获取存在的 persistent volume :

kubectl get persistentvolumeclaims

或者

kubectl get pvc

在这里插入图片描述

如您所见,PVC 的状态为“Pending”。 这是因为 StorageClass VolumeBindingMode 设置为“WaitForFirstConsumer”,但它没有消费者。

在pod中使用PersistentVolume

现在让我们回到我们的 nginx Pod。 这次将它附加到我们创建的 PersistentVolume 上。

现在我们需要在 Pod 定义中指定 PersistentVolumeClaim。 以下是执行此操作的示例 YAML 文件:

pod-persistent-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pv-pod
spec:
  volumes:
  - name: nginx-storage
    persistentVolumeClaim:
      claimName: nginx-pvc
  containers:
  - name: nginx-container
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: nginx-storage

正如您在 .spec.volume 下看到的,我们将 PersistentVolumeClaim 命名为我们之前创建的 PVC (nginx-pvc)。 然后我们通过给出我们想要的卷的路径和卷定义的名称(nginx-storage)来使用 .spec.containers 下的这个卷定义。

在我们观察到 Pod 启动并运行之后:

kubectl apply -f pod-persistent-volume.yaml

查看pod:

kubectl get pods

在这里插入图片描述

查看pvc

kubectl get pvc

在这里插入图片描述

其中 Status 的值是 Bound

系列:1、Kubernetes 简介

系列:2、创建Kubernetes集群

系列:3、Kubectl 的使用

系列:4.1、Kubernetes 对象

系列:4.2、Kubernetes 工作负载

系列:4.3、Kubernetes 服务

系列:4.4、Kubernetes 存储(本文)

系列:4.5、Kubernetes 配置对象

系列:5、Kubernetes中的调度

系列:6、Kubernetes 的升级与部署策略

系列:7、 Kubernetes 安全性

系列:8、部署一个全栈应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值