使用 Minio 和 Kubernetes 在 GCP 上构建与 AWS S3 兼容的云存储
如今的应用程序 生成 比以往更多的數據,而这种上升趋势预计将在可预见的未来 持续下去。您如何处理应用程序不断增长的存储需求?一个可以在您的应用程序运行的地方运行并能够以自动方式扩展的存储解决方案,是最佳选择。添加多租户功能,它将变得近乎完美!
Minio 提供了一个可靠的轻量级对象存储服务。在 Kubernetes 等编排平台上运行它,可以添加自动存储映射和多租户功能。这种设置明确地分离了关注点——这是可扩展性的最重要参数之一。此外,在这样的设置中查找和隔离错误非常容易。
在 Kubernetes 等编排平台上运行的 Minio 是满足不断增长的存储需求的完美解决方案。
在这篇文章中,我们将看到如何在 Google Cloud Platform 上使用 Minio 和 Kubernetes 构建兼容 AWS S3 的对象存储服务器。我们还将看到如何在多租户环境中扩展此设置。

什么是 Minio?
Minio 是一个轻量级、兼容 AWS S3 的对象存储服务器。它最适合存储非结构化数据,例如照片、视频、日志文件、备份、虚拟机和容器镜像。对象的尺寸范围可以从几 KB 到最大 5 TB。Minio 的主要功能包括
Kubernetes 术语
对于不熟悉 Kubernetes 术语的读者,我将快速介绍本文中使用的所有术语。
Pod: Pod 是 Kubernetes 中最小的计算单元。它是一组在共享上下文中运行的容器。
副本集: 副本集确保始终有特定数量的 Pod 副本处于运行状态。虽然副本集是独立的实体,但它们主要由 部署 用作编排 Pod 创建、删除和更新的机制。
部署: 部署可以被认为是一个包含 Pod 和副本集的抽象。
服务: 服务定义了 Pod 的逻辑集合,以及访问它们的策略。服务所针对的 Pod 集由标签选择器(在服务的 yaml 文件中定义)决定。
持久卷:持久卷(PV)是集群中的一块网络存储,其中存储的特定细节被抽象化。
持久卷声明:持久卷声明(PVC)是应用程序/Pod 对存储的请求。
Kubernetes 安装
要开始使用,您需要在 Google Compute Engine (GCE) 上运行一个 Kubernetes 集群。按照这些 详细步骤 在 GCE 上设置 Kubernetes 集群。
配置存储
借助持久卷(PV)和持久卷声明(PVC),Kubernetes 使得将物理存储细节从应用程序中抽象出来变得非常容易。您只需使用集群中的物理存储创建 PV,然后让您的应用程序通过 PVC 请求所需的存储。当通过 PVC 发出存储请求时,Kubernetes 会自动将其映射到实际存储(PV)。
让我们在 Google Compute Engine 上下文中进一步探讨这一点。GCE 有 磁盘,作为计算节点的物理存储。在 Kubernetes 中,您可以创建使用这些磁盘作为基础物理存储的 PV。
稍后,当您在 Kubernetes 集群上部署 Minio 时,您可以创建 PVC 来请求您需要的特定 Minio 实例的存储。Kubernetes 会自动将匹配的 PV 绑定到 PVC。这在 Kubernetes 世界中被称为静态绑定,是的,也有动态绑定,但我们现在先跳过它。在这里阅读有关绑定的更多信息 这里。
现在您已经清楚了事情的工作原理,让我们从创建一个 GCE 磁盘开始。
$ gcloud compute disks create minio-1 --size=10GiB
这将创建一个名为 disk1
的磁盘,大小为 10GiB
。现在,根据我们刚刚创建的 GCE 磁盘创建 PV。
apiVersion: v1
kind: PersistentVolume
metadata:
name: minio-pv-1
spec:
# Size of your PV
capacity:
# This is limited by the size of GCE Persistent disk.
# For example, to create a 10 TB backend, uncomment below line
# storage: 10Ti
storage: 10Gi
# Learn more here: https://kubernetes.ac.cn/docs/user-guide/persistent-volumes/#access-modes
accessModes:
- ReadWriteOnce
# Indicates
gcePersistentDisk:
# Name of the GCE persistent disk.
pdName: minio-1
fsType: ext4
下载 并将文件保存为 minio-gce-pv.yaml。然后,您可以使用以下命令创建一个持久卷
$ kubectl create -f minio-gce-pv.yaml
部署 Minio
部署包含副本集和 Pod——因此,如果一个 Pod 宕机,副本集会确保另一个 Pod 自动启动。这样,您就不必担心 Pod 故障,并且始终可以使用稳定的 Minio 服务。
但在创建部署之前,我们需要创建一个持久卷声明(PVC)来请求 Minio 实例的存储。如上所述,Kubernetes 会在集群中查找与 PVC 请求匹配的 PV,并将其自动绑定到 PVC。
如果您需要一个具有不同存储需求的大规模多租户环境,这种自动化非常有用。您可以为每个租户启动一个 Minio 部署(其中包含请求相应存储的 PVC)。Kubernetes 会自动将 PVC 绑定到 PV。这样,您就可以随时使用多租户、稳定、兼容 S3 的对象存储服务器!
以下是如何创建 PVC 和运行 Minio Docker 镜像的单 Pod 部署。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
# This name uniquely identifies the PVC. Will be used in deployment below.
name: minio-pv-claim
labels:
app: minio-storage-claim
spec:
# Read more about access modes here: https://kubernetes.ac.cn/docs/user-guide/persistent-volumes/#access-modes
accessModes:
- ReadWriteOnce
resources:
# This is the request for storage. Should be available in the cluster.
requests:
storage: 10Gi
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
# This name uniquely identifies the Deployment
name: minio-deployment
spec:
strategy:
type: Recreate
template:
metadata:
labels:
# Label is used as selector in the service.
app: minio-server
spec:
# Refer to the PVC created earlier
volumes:
- name: storage
persistentVolumeClaim:
# Name of the PVC created earlier
claimName: minio-pv-claim
containers:
- name: minio
# Pulls the default Minio image from Docker Hub
image: minio/minio
command: ["minio"]
args: ["server", "/storage"]
env:
# Minio access key and secret key
- name: MINIO_ACCESS_KEY
value: "minio"
- name: MINIO_SECRET_KEY
value: "minio123"
ports:
- containerPort: 9000
hostPort: 9000
# Mount the volume into the pod
volumeMounts:
- name: storage # must match the volume name, above
mountPath: "/storage"
下载 并将文件保存为 minio-standalone-deployment.yaml。请注意,我们首先创建 PVC,然后部署使用它作为它的卷。然后,您可以使用以下命令部署 Minio
$ kubectl create -f minio-standalone-deployment.yaml
将 Minio 暴露为服务
现在您已经运行了 Minio 部署,您可以选择在集群内部(集群内)访问它,或者将其作为服务暴露到外部(集群外部,可能是公共互联网)IP 地址,具体取决于您的用例。
您可以使用 服务 来实现此目的。有三种主要的服务类型——默认类型是 ClusterIP,它将服务暴露给集群内部的连接。NodePort 和 LoadBalancer 是两种将服务暴露给外部流量的类型。在这里阅读有关服务的更多信息 这里。
下面的 yaml 文件为您的 Minio 部署配置了 LoadBalancer 服务。
apiVersion: v1
kind: Service
metadata:
name: minio-service
spec:
type: LoadBalancer
ports:
- port: 9000
targetPort: 9000
protocol: TCP
selector:
app: minio-server
下载 并将此文件保存为 minio-service.yaml,并运行以下命令——
$ kubectl create -f minio-service.yaml
服务提供服务的 IP 地址通常需要几分钟才能在运行上述命令后创建。您可以使用以下方法检查 IP——
$ kubectl get services
获取 IP 地址后,您可以通过以下地址访问 Minio
http://<Service_IP_Address>:9000/
访问密钥和密钥与 minio-standalone-deployment.yaml 中设置的环境变量相同。
请注意,只有在底层云提供商支持外部负载均衡的情况下,LoadBalancer 才能正常工作。
监控
Kubernetes 附带了一个简洁的仪表板。您可以通过仪表板轻松跟踪 Minio Pod 的内存、CPU 使用率以及许多其他指标。
要访问仪表板,请执行以下命令——
$ kubectl cluster-info
访问 kubernetes-dashboard 后面提到的 URL。这是我的仪表板的外观

需要帮助?我们在 Slack 上闲逛。加入我们!
顺便说一句,请帮助我们了解您的用例以及我们如何更好地为您提供帮助!填写 我们 Minio 部署最佳实践表格(不到一分钟),并有机会在 Minio 网站上展示您的 Minio 私有云设计,并向 Minio 社区展示您的设计。