欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MinIO单机+集群部署

程序员文章站 2024-03-17 20:08:16
...

minio-helm-github

helmhub-minio安装指引

Kubernetes包管理工具-Helm3安装

Helm v3概念和常用命令详述

一.使用 Kubernetes 部署 Minio

1.使用 Helm Chart 部署 MinIO

1.1 Helm

使用Helm管理kubernetes应用

Helm 入门指南

首先学习下 Helm

1.1.1 Chart 目录结构

使用 helm create mychart 创建一个名为 mychart 的示例,使用 tree chart 查看下 chart 的目录结构

mychart
├── Chart.yaml
├── charts # 该目录保存其他依赖的 chart(子 chart)
├── templates # chart 配置模板,用于渲染最终的 Kubernetes YAML 文件
│   ├── NOTES.txt # 用户运行 helm install 时候的提示信息
│   ├── _helpers.tpl # 用于创建模板时的帮助类
│   ├── deployment.yaml # Kubernetes deployment 配置
│   ├── ingress.yaml # Kubernetes ingress 配置
│   ├── service.yaml # Kubernetes service 配置
│   ├── serviceaccount.yaml # Kubernetes serviceaccount 配置
│   └── tests
│       └── test-connection.yaml
└── values.yaml # 定义 chart 模板中的自定义配置的默认值,可以在执行 helm install 或 helm update 的时候覆盖

以上仅为 helm 为我们自动创建的目录结构,我们还可以在 templates 目录加其他 Kubernetes 对象的配置,比如 ConfigMapDaemonSet 等。

我们查看下使用 helm create 命令自动生成的 templates/service.yaml 文件。

apiVersion: v1
kind: Service
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    {{- include "mychart.selectorLabels" . | nindent 4 }}

可以看到其中有很多{{ }} 包围的字段,这是使用的 Go template 创建的自定义字段,其中 mychart 开头的都是在 _helpers.tpl 中生成的定义。

例如 _helpers.tpl 中对 chart.fullname 的定义:

{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "mychart.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- if contains $name .Release.Name -}}
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}
{{- end -}}

我们再看下 values.yaml 文件中有这样的一段配置:

service:
  type: ClusterIP
  port: 80

在使用 helm installhelm update 时,会渲染 templates/service.yaml 文件中的 {{ .Values.service.type }}{{ .Values.service.port }} 的值。

1.1.2 Helm 常用命令如下:

  • helm create:在本地创建新的 chart;
  • helm dependency:管理 chart 依赖;
  • helm intall:安装 chart;
  • helm lint:检查 chart 配置是否有误;
  • helm list:列出所有 release;
  • helm package:打包本地 chart;
  • helm repo:列出、增加、更新、删除 chart 仓库;
  • helm rollback:回滚 release 到历史版本;
  • helm pull:拉取远程 chart 到本地;
  • helm search:使用关键词搜索 chart;
  • helm uninstall:卸载 release;
  • helm upgrade:升级 release;

1.1.3 安装 chart

安装 chart 的命令格式为:

helm install [NAME] [CHART] [flags]

示例:

# 安装本地 chart
helm install -f myvalues.yaml myredis ./redis
# 指定变量
helm install --set name=prod myredis ./redis
# 指定变量的值为 string 类型
helm install --set-string long_int=1234567890 myredis ./redis
# 指定引用的文件地址
helm install --set-file my_script=dothings.sh myredis ./redis
# 同时指定多个变量
helm install --set foo=bar --set foo=newbar  myredis ./redis

其中:

  • myvalues.yaml:自定义变量配置文件;
  • myredis:release 名称;
  • ./redis:本地的 chart 目录;

Helm chart 安装后会转化成 Kubernetes 中的资源对象,生成一个 chart release,可以使用 helm list 命令查看。

关于 helm intsall 详细用法见:https://helm.sh/docs/helm/helm_install/。

1.2 部署运行

由于 helm3 只需要安装客户端即可,无需安装服务端(Tiller)。将相应的 xxx.tar.gz 上传到服务器解压。

我是从华为开源镜像站获取的,速度较快

如下示例:

wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.1-linux-amd64.tar.gz
tar -zxvf helm-v2.12.1-linux-amd64.tar.gz
cd linux-amd64/
# 拷贝helm到 /usr/local/bin 
cp helm /usr/local/bin
#验证helm
[aaa@qq.com minio]# helm version
version.BuildInfo{Version:"v3.0.2", GitCommit:"19e47ee3283ae98139d98460de796c1be1e3975f", GitTreeState:"clean", GoVersion:"go1.13.5"}

helm 有其公共的仓库: helm hub

Helm 添加 MinIO 仓库

helm repo add minio https://helm.min.io/

我是参照这个hub中关于如何使用 helm 来安装 minio的

MinIO单机+集群部署

调试空部署(调试部署)

#这种方式的运行,不会有结果的部署,只是将部署过程的日志输出,方便调试

helm install minio --debug --set "mode=distributed,numberOfNodes=4,imagePullPolicy=IfNotPresent,accessKey=minio,secretKey=minio123,service.type=NodePort,service.nodePort=32099,persistence.enabled=false" minio/minio

解释下 dry-run

通过设置dryRun查询参数来触发空运行,该系统保证空运行请求不会持久存储在存储中或具有任何其他副作用。个人理解就是不会有任何结果!

正式部署

helm install minio --set mode=distributed,numberOfNodes=4,imagePullPolicy=IfNotPresent,accessKey=minio,secretKey=minio123,service.type=NodePort,service.nodePort=32099 minio/minio

同时也参考了大神的博客,根据提供的 values.yaml 部署

其实刚开始,我看到 pod 的日志提示 node xxx insufficient memories ,后来才发现每个 pod 要求分配 4G 内存,这当然不行,因为我每台虚拟机只分配不大于 4G 的内存。

values.yaml

clusterDomain: cluster.local
image:
  repository: minio/minio
  tag: RELEASE.2019-05-14T23-57-45Z
  pullPolicy: IfNotPresent
mcImage:
  repository: minio/mc
  tag: RELEASE.2019-05-01T23-27-44Z
  pullPolicy: IfNotPresent
mode: standalone
DeploymentUpdate:
  type: RollingUpdate
  maxUnavailable: 0
  maxSurge: 100%
StatefulSetUpdate:
  updateStrategy: RollingUpdate
priorityClassName: ""
existingSecret: ""
accessKey: "admin123A"
secretKey: "admin123A"
configPath: "/root/.minio/"
configPathmc: "/root/.mc/"
mountPath: "/export"
replicas: 4
tls:
  enabled: false
  certSecret: ""
  publicCrt: public.crt
  privateKey: private.key
persistence:
  enabled: false
  storageClass: managed-nfs-storage
  accessMode: "ReadWriteOnce"
  size: 10Gi
  subPath: ""
resources:
  limits: {}
  requests:
    memory: 1024Mi
service:
  type: NodePort
  port: 9000
  nodePort: 31311
  annotations: {}

根据这个表格进行相关配置

参数 描述 默认值
image MinIO镜像名称 minio/minio
imageTag MinIO镜像tag. 可选值在 这里. RELEASE.2017-08-05T00-00-53Z
imagePullPolicy Image pull policy Always
mode MinIO server模式 (standalone, shared 或者 distributed) standalone
numberOfNodes 节点数 (仅对分布式模式生效). 可选值 4 <= x <= 16 4
accessKey 默认access key AKIAIOSFODNN7EXAMPLE
secretKey 默认secret key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
configPath 默认配置文件路径 ~/.minio
mountPath 默认挂载路径 /export
serviceType Kubernetes service type LoadBalancer
servicePort Kubernetes端口 9000
persistence.enabled 是否使用持久卷存储数据 true
persistence.size 持久卷大小 10Gi
persistence.storageClass 持久卷类型 generic
persistence.accessMode ReadWriteOnce 或者 ReadOnly ReadWriteOnce
resources CPU/Memory 资源需求/限制 Memory: 256Mi, CPU: 100m

配置 MinIO Helm repo

$ helm repo add minio https://helm.min.io/

查看是否配置成功

[aaa@qq.com vagrant]# helm repo list
NAME            URL
ali_repo        https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
minio           https://helm.min.io/
bitnami         https://charts.bitnami.com/bitnami

helm install 命令详解

helm install install chartmuseum/demo --version 0.1.0 --name demo --namespace default  # 从仓库chartmuseum中拉取demo,并且版本为0.1.0 release名字为demo  命令空间为default

执行以下命令, 安装 minio (单机)

helm install minio-test minio/minio -f values.yaml

查看 helm 部署的 release

[aaa@qq.com minio]# helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART          APP VERSION
minio-test      default         1               2020-10-10 16:54:38.37187018 +0800 CST  deployed        minio-7.2.1    master

如果发现这个 release 部署失败了,可以通过以下命令删除

helm delete minio-test

最终成功部署

MinIO单机+集群部署

获取 pod 暴露的端口

[aaa@qq.com minio]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          3h43m
minio-test   NodePort    10.104.160.1   <none>        9000:31311/TCP   105m

helm 分布式安装

helm install minio --set mode=distributed,numberOfNodes=4,imagePullPolicy=IfNotPresent,accessKey=minio,secretKey=minio123,service.type=NodePort,service.nodePort=25557 minio/minio 

2.使用 yaml 部署 MinIO(单机)

MinIO-GitHub 官方指导

minio 高性能 Kubernetes 原生对象存储

PVC 的使用

名词解释:PV/PVC/StorageClass

Kubernetes存储之Persistent Volumes简介

minio-standalone-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv-name
  labels:
    app: miniopv
spec:
  storageClassName: slow
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/miniodata"

minio-standalone-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  # 此名称唯一标识PVC。 将在以下部署中使用。
  name: minio-pv-claim
spec:
  # 关于 access modes的更多细节,访问这里: 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
  storageClassName: slow
  selector:
    matchLabels:
      app: miniopv

发现 pv 和 pvc 成功绑定

MinIO单机+集群部署

注:PersistentVolume 的 yaml 文件和 PersistentVolumeClaims 的 yaml 文件要注意 storageClassName 的配置一一对应

minio-standalone-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio-deployment
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      volumes:
      - name: data
      	#这里与持久卷声明(minio-pv-claim) 关联在一起
        persistentVolumeClaim:
          claimName: minio-pv-claim
      containers:
      - name: minio
        image: minio/minio:RELEASE.2017-05-05T01-14-51Z
        args:
        - server
        - /data
        env:
        - name: MINIO_ACCESS_KEY
          value: "minio"
        - name: MINIO_SECRET_KEY
          value: "minio123"
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: data
          mountPath: "/data"

minio-standalone-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: minio-service
spec:
  # NodePort 类型可以让外网访问
  type: NodePort
  ports:
  - port: 9000
    targetPort: 9000
    protocol: TCP
  selector:
    app: minio

结果:

图1

MinIO单机+集群部署

图2

MinIO单机+集群部署

删除单机模式相关服务

kubectl delete deployment minio-deployment \
&&  kubectl delete pvc minio-pv-claim \
&& kubectl delete svc minio-service

3.使用 yaml 部署 MinIO(分布式)

K8S有状态服务-StatefulSet使用最佳实践

目前还是暂时只能通过无状态部署,即用 Deployment。

minio-distributed-deployment.yaml

我这里只用了两台构成集群,作为测试

apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio-deployment
spec:
  strategy:
    type: Recreate
  replicas: 2
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      volumes:
      - name: data
        hostPath:
          path: /tmp/miniodata
      containers:
      - name: minio
        image: minio/minio:RELEASE.2017-05-05T01-14-51Z
        args:
        - server
        - /data
        env:
        - name: MINIO_ACCESS_KEY
          value: "minio"
        - name: MINIO_SECRET_KEY
          value: "minio123"
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: data
          mountPath: "/data"

minio-distributed-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: minio-service
spec:
  type: NodePort
  ports:
  - port: 9000
    targetPort: 9000
    protocol: TCP
  selector:
    app: minio

二.使用 Docker Compose 部署 MinIO

docker-compose 的安装在我的另一篇博客有阐述,这里就不再赘述了。

以下是从官网获取到的 yaml文件

version: '3.7'

# starts 4 docker containers running minio server instances.
# using nginx reverse proxy, load balancing, you can access
# it through port 9000.
services:
  minio1:
    image: minio/minio:RELEASE.2020-10-09T22-55-05Z
    volumes:
      - ./data1-1:/data1
      - ./data1-2:/data2
    expose:
      - "9000"
    ports:
      - "9001:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio2:
    image: minio/minio:RELEASE.2020-10-09T22-55-05Z
    volumes:
      - ./data2-1:/data1
      - ./data2-2:/data2
    expose:
      - "9000"
    ports:
      - "9002:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio3:
    image: minio/minio:RELEASE.2020-10-09T22-55-05Z
    volumes:
      - ./data3-1:/data1
      - ./data3-2:/data2
    expose:
      - "9000"
    ports:
      - "9003:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio4:
    image: minio/minio:RELEASE.2020-10-09T22-55-05Z
    volumes:
      - ./data4-1:/data1
      - ./data4-2:/data2
    expose:
      - "9000"
    ports:
      - "9004:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  nginx:
    image: nginx:1.19.2-alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "9000:9000"
    depends_on:
      - minio1
      - minio2
      - minio3
      - minio4

## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  data3-1:
  data3-2:
  data4-1:
  data4-2:

通过执行以下命令即可完成 minio 部署

docker-compose pull
docker-compose up
相关标签: MinIO kubernetes