MinIO单机+集群部署
一.使用 Kubernetes 部署 Minio
1.使用 Helm Chart 部署 MinIO
1.1 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 对象的配置,比如 ConfigMap
、DaemonSet
等。
我们查看下使用 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 install
或 helm 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的
调试空部署(调试部署)
#这种方式的运行,不会有结果的部署,只是将部署过程的日志输出,方便调试
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
最终成功部署
获取 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(单机)
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 成功绑定
注: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
图2
删除单机模式相关服务
kubectl delete deployment minio-deployment \
&& kubectl delete pvc minio-pv-claim \
&& kubectl delete svc minio-service
3.使用 yaml 部署 MinIO(分布式)
目前还是暂时只能通过无状态部署,即用 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
上一篇: XSS平台获取cookie
下一篇: idea常用快捷键
推荐阅读
-
MinIO单机+集群部署
-
tomcat7用redis集群解决方案 博客分类: tomcat/jdk部署相关Nosql tomcat、session、redis
-
ocp集群部署daemonset的node-exporter报错:Host network is not allowed to be used provider restricted
-
ElasticSearch2.4.0单机版及集群安装 博客分类: Search elasticsearchelasiicsarch v2.4cluster
-
Apache Geode 不使用集群配置服务来部署配置文件 博客分类: 框架Apache Geode Apache Geode
-
Apache Geode 不使用集群配置服务来部署配置文件 博客分类: 框架Apache Geode Apache Geode
-
kettle集群服务部署 博客分类: kettle脚本编辑 kettle
-
zookeeper伪集群windows部署
-
windows下zookeeper集群部署
-
ZooKeeper--集群部署安装