使用Minio和Kubernetes在GCP上构建与AWS S3兼容的云存储

使用Minio和Kubernetes在GCP上构建与AWS S3兼容的云存储

当今的应用程序产生的数据比以往任何时候都多,并且这种上升趋势有望在可预见的将来保持下去您如何处理不断增长的应用程序存储需求?可以在您的应用程序运行的地方运行并可以自动扩展的存储解决方案是必经之路。添加多租户功能,它将近乎完美!

Minio提供了可靠的轻量级对象存储服务。在Kubernetes等编排平台上运行它可以增加自动存储映射和多租户功能。这种设置将关注点清楚地分开了,这是可伸缩性最重要的参数之一。同样,在这样的设置中查找和隔离错误非常容易。

在诸如Kubernetes之类的编排平台上运行的Minio是满足不断增长的存储需求的完美解决方案。

在本文中,我们将介绍如何使用Minio和Kubernetes在Google Cloud Platform上构建与AWS S3兼容的对象存储服务器。我们还将看到如何在多租户环境中扩展此设置。


1_b1ERH92Sd7Dnn0FiQm1EjQ.png
在GCE上运行的Kubernetes集群上的Minio实例


什么是Minio?

Minio是与AWS S3兼容的轻量级对象存储服务器。它最适合存储非结构化数据,例如照片,视频,日志文件,备份,VM和容器映像。一个对象的大小范围可以从几个KB到最大5TB。突出的Minio功能包括

Kubernetes术语

对于不了解Kubernetes术语的读者,我将快速阅读本文中使用的所有术语。

PodPod是Kubernetes中最小的计算单位。它是在共享上下文中运行的一组容器。

ReplicaSets ReplicaSet确保始终启动并运行特定数量的Pod副本。尽管副本集是独立的实体,但它们主要由Deployments用作协调Pod创建,删除和更新的机制。

部署可以将部署视为包含Pod和ReplicaSet的抽象。

服务服务定义Pod的逻辑集和访问它们的策略。服务所针对的Pod集由标签选择器(在服务的yaml文件中定义)确定。

持久卷:持久卷(PV)是集群中的一部分网络存储,其中抽象了特定于存储的详细信息。

持久卷声明:持久卷声明(PVC)是由应用程序/容器进行存储的请求。

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: http://kubernetes.io/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兼容的对象存储服务器!

这是创建运行Minio Docker映像的PVC和单容器部署的方法。

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: http://kubernetes.io/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部署,您可能要在内部(在群集内)访问它,或者将它作为服务公开到外部(在群集之外,可能是公共Internet)IP地址上,具体取决于您的用例。

您可以使用Services来实现主要有3种服务类型-默认类型是ClusterIP,它将服务从群集内部公开给连接。NodePortLoadBalancer是将服务暴露给外部流量的两种类型。在此处阅读有关服务的更多信息

在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:// <服务ip地址>:9000 /

访问密钥和秘密密钥与minio-standalone-deployment.yaml中设置的环境变量相同

请注意,仅当基础云提供商支持外部负载平衡时,LoadBalancer才能工作。

监控方式

Kubernetes捆绑了一个整洁的仪表板。您可以通过仪表板轻松跟踪Minio pod的内存,CPU使用率和许多其他指标。

要访问仪表板,请执行以下命令—

$ kubectl cluster-info

访问针对kubernetes-dashboard提及的URL。这是我的仪表板的外观


1_YyXgTVqkM0KuSgKraOuxzw.png


需要帮忙?我们在Slack上聚会加入我们!

当您使用它时,请帮助我们了解您的用例以及如何更好地帮助您!填写我们最好的Minio部署表格(只需不到一分钟的时间),并有机会在Minio网站上亮相,并向Minio社区展示您的Minio私有云设计。


上一篇 下一篇