使用和监控存储

学习目标

  • 说明如何在 Kubernetes 中使用存储

  • 描述 SAP BTP, Kyma runtime 中提供存储的方式

  • 在容器中执行卷挂载

  • 使用 Kyma dashboard 执行和监控存储

在 Kubernetes 中使用存储:业务场景

视频:本节含 SAP 官方视频(视频 ID 1_jhqnn8lu),需在 learning.sap.com 在线观看。

作为开发人员,您被要求创建一个将数据存储在持久存储中的数据库。您想探究存储在 Kubernetes 中如何工作,以及如何在您的应用程序中使用它。

如何在 Kubernetes 中使用存储?

在 Kubernetes 中运行无状态容器时,所有磁盘上的文件都是临时的。这意味着如果容器崩溃、被删除或扩缩,数据都会丢失。这是因为每个新容器都是以干净状态创建的。

在 Kubernetes 中,管理云存储与管理云计算不同。不过,Kubernetes 提供了一组存储原语,您可以使用它们在 Kubernetes 集群中管理存储,并将持久存储挂载到容器。

  • Volumes:卷以特定路径挂载到 Pod 中。

  • PersistentVolumes (PVs):表示物理存储并提供访问存储的接口。

  • PersistentVolumeClaims (PVCs):卷为从 PersistentVolume 获取存储而发出的存储请求。

  • StorageClasses:为管理员提供一种描述其提供的存储类别的方式。

Kubernetes 本身不是存储系统。底层基础设施必须提供物理存储,集群管理员必须将其接入 Kubernetes。此物理存储可以是节点上的本地磁盘、基于 NFS 的存储,或云提供商的存储系统,例如 AWS EBS 或 Azure Disks。

集群管理员向集群预配 PersistentVolumes,它们抽象物理存储并使其可供集群使用。请注意,PersistentVolumes 不属于任何命名空间。它们对集群中的所有命名空间可用。StorageClass 也可以动态预配 PersistentVolumes

另一方面,Kubernetes 用户部署的应用程序需要在重启之间保持持久状态。为此,他们必须从集群请求存储。这通过为 Pod 创建 PersistentVolumeClaim 来完成。此声明是对存储的请求,由 PersistentVolume 满足。PersistentVolumeClaim 绑定到 PersistentVolume。Pod 将 PersistentVolumeClaim 作为卷挂载到特定路径,以便应用程序可以从 PersistentVolume 读取数据或向其写入数据。

SAP BTP, Kyma Runtime 中如何提供存储?

SAP 使用“Gardener”项目在您选择的主机服务商(例如 AWS、Azure 或 GCP)上预配底层 Kubernetes 集群。主机服务商提供物理存储。

SAP BTP, Kyma runtime 附带一组预定义的 StorageClasses。

存储类

当您转到 Kyma dashboard 并选择 default 存储类时,您可以看到标签表明此存储类由 Gardener 管理。

在以下示例中,SAP BTP, Kyma runtime 预配在 Microsoft Azure 上,并使用 Azure Disks 作为存储后端。创建 PersistentVolume 后,您可以创建多个绑定到该 PersistentVolume 的 PersistentVolumeClaim,直到其容量被用完。该图片展示了在 Microsoft Azure 上运行的 SAP BTP, Kyma runtime 中 PersistentVolume 与 PersistentVolumeClaim 之间的示例关系:

在容器中挂载卷

通常,建议避免将数据持久化到相应容器的虚拟文件系统中。相反,建议将卷挂载到容器中。为此,Pod 定义必须指定卷以及容器内的挂载点。

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-frontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: my-volume
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-claim

在此示例中,Pod 将卷 my-volume 挂载到容器中的 /var/www/html 路径。Pod 通过 PersistentVolumeClaim my-claim 请求该卷,而 PersistentVolumeClaim 在集群中查找 PersistentVolume。

您可以在 Pod 定义中定义 PersistentVolumeClaim,也可以单独创建它。如果您想为多个 Pod 重用同一个 PersistentVolumeClaim,单独创建 PersistentVolumeClaim 会很有用。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-claim
spec:
storageClassName: manual
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

如果找到 PersistentVolumeClaim 与 PersistentVolume 之间的绑定,则可以创建 Pod。但是,一旦 Pod 使用了 PersistentVolumeClaim,该 PersistentVolumeClaim 就会绑定到 PersistentVolume。删除 Pod 不会导致删除 PersistentVolumeClaim,并且该 PersistentVolumeClaim 仍绑定到 PersistentVolume。

查看一个将数据存储在节点本地磁盘上的 PersistentVolume 示例:

apiVersion: v1
kind: PersistentVolume
metadata:
name: my-persistent-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"

您还可以在 Deployment 或 StatefulSet 中挂载卷并定义 PersistentVolumeClaim。这种方式更为常见,因为通常您不会手动创建 Pod,而是在父资源中定义它。

Kyma Dashboard 中的存储监控集成

Kyma dashboard 在命名空间级别提供了 Persistent Volume Claims 视图。

PVC 详细信息

通过单击 Persistent Volume Claim,您可以查看该声明的详细信息以及正在使用该声明的 Pod。

Persistent Volumes 在 Kyma dashboard 的集群级别可见:

Persistent Volumes

摘要

在本课中,您了解了 Kubernetes 中的存储概念。您还学习了如何在容器中挂载卷。

延伸阅读

Kubernetes 存储