注意事项
使用helm部署MinIO分为两部分
- helm部署MinIO operator,用来管理tenant(K8S集群中只能部署一个)
- helm部署MinIO tenant,真实的MinIO Cluster(K8S集群中可以部署多个)
使用helm部署到K8S集群,则需要考虑如何暴露服务的问题。官方文档helm安装步骤是通过修改service nodePort配置,暴露服务。但也可以考虑部署ingress-nginx之类的ingress,MinIO helm配置文件中提供了指定ingress的参数。
本地Helm Chart部署MinIO
1.下载Helm Chart到本地
curl -O https://raw.githubusercontent.com/minio/operator/master/helm-releases/operator-5.0.11.tgz
Chart包含values.yaml文件,可以通过修改配置文件满足定制化需求。
解压后的文件,包含operator和tenant的Helm Chart。
2.部署ingress-nginx
helm upgrade ingress-minio-test -n minio-tenant-default ./ingress-nginx \
--set controller.image.tag=v1.4.0 \
--set controller.ingressClassResource.name=ingress-minio-test \
--set controller.ingressClassResource.controllerValue=k8s.io/ingress-minio-test \
--set controller.replicaCount=3 \
--set controller.service.enabled=false \
--set controller.scope.enabled=false \
--set controller.metrics.enabled=true \
--set controller.electionID=ingress-minio-test \
--set controller.nodeSelector.nodetype=minio-node \
--set controller.image.registry=k8s.gcr.io \
--set controller.image.image=ingress-nginx/controller \
--set controller.metrics.serviceMonitor.namespace=minio-ingress-test \
--description "install ingress-nginx 1.4.0"
下载ingress-nginx Helm Chart
wget https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.9.0/ingress-nginx-4.9.0.tgz
3.部署Operator
helm install \
--namespace minio-operator \
--set operator.image.repository=quay.io/minio/operator \
--set operator.image.tag=v5.0.9 \
--set operator.nodeSelector.minioowner=minio \
--set console.image.repository=quay.io/minio/operator \
--set console.image.tag=v5.0.9 \
--set console.nodeSelector.minioowner=minio \
--set console.ingress.enabled=true \
--set console.ingress.ingressClassName=ingress-minio-test \
--set console.ingress.host=minio-operator-test1.mytest.com \
minio-operator operator-5.0.9.tgz
4.部署Tenant
helm install \
--namespace minio-tenant-default \
--set tenant.name=minio-tenant-default \
--set tenant.image.repository=quay.io/minio/operator \
--set tenant.image.tag=RELEASE.2023-09-07T02-05-02Z \
--set tenant.pools[0].storageClassName=cbs \
--set tenant.pools[0].nodeSelector.minioowner=minio \
--set tenant.certificate.requestAutoCert=false \
--set tenant.env[0].name=MINIO_SERVER_URL \
--set tenant.env[0].value=http://minio-api-test1.mytest.com:80 \
--set tenant.env[1].name=MINIO_STORAGE_CLASS_STANDARD \
--set tenant.env[1].value=EC:8 \
--set tenant.configuration.name=minio-config-prod \
--set secrets.existingSecret=minio-config-prod \
--set ingress.api.enabled=true \
--set ingress.api.ingressClassName=ingress-minio-test \
--set ingress.api.host=minio-api-test1.mytest.com \
--set ingress.console.enabled=true \
--set ingress.console.ingressClassName=ingress-minio-test \
--set ingress.console.host=minio-console-test1.mytest.com \
minio-tenant-default tenant-5.0.9.tgz
指定storageClass
--set tenant.pools[0].storageClassName=cbs \
MinIO通过storageClass 创建PV,最小部署会创建16块PV,挂载到4个POD上。
通过ingress暴露服务
--set ingress.api.enabled=true \
--set ingress.api.ingressClassName=ingress-minio-test \
--set ingress.api.host=minio-api-test1.mytest.com \
--set ingress.console.enabled=true \
--set ingress.console.ingressClassName=ingress-minio-test \
--set ingress.console.host=minio-console-test1.mytest.com \
MinIO域名分为console域名和api域名,console域名默认调用服务9001端口,api域名默认调用服务9000端口。
ingress.api.enabled=true #开启通过ingress暴露api服务
ingress.api.ingressClassName=ingress-minio-test #指定ingress-nginx的ingressClassName
ingress.api.host=minio-api-test1.mytest.com #自定义api服务域名
ingress.console.enabled=true #开启通过ingress暴露console服务
ingress.console.ingressClassName=ingress-minio-test #指定ingress-nginx的ingressClassName
ingress.console.host=minio-console-test1.mytest.com #自定义console服务域名
环境变量参数配置
MinIO服务配置参数
MinIO大部分配置参数都是通过环境变量配置的,所以可以通过--set tenant.env[x].name 设置环境变量名,通过--set tenant.env[x].value 设置环境变量值
配置MINIO_SERVER_URL
参考文档:MinIO Console Settings — MinIO Object Storage for Linux
MINIO_SERVER_URL 用于指定MinIO Share功能反馈的URL中的域名。可以通过此域名下载MinIO中的文件。
如果不设置,域名默认为K8S service内部域名,无法用于集群外部下载文件。
--set tenant.env[0].name=MINIO_SERVER_URL \
--set tenant.env[0].value=http://minio-api-test1.mytest.com:80 \
配置MinIO奇偶校验分片
配置文档:Erasure Code Settings — MinIO Object Storage for Linux
什么是奇偶校验分片?纠删码文档:Erasure Coding — MinIO Object Storage for Linux
默认值EC:4,此参数可不修改。如果为了提高数据可用性,可以提高EC的值。但是同样会减少实际可用空间。简单来说这就是设置数据冗余的比例。
--set tenant.env[1].name=MINIO_STORAGE_CLASS_STANDARD \
--set tenant.env[1].value=EC:8 \
设置用户名和密码
参考文档:Root Access Settings — MinIO Object Storage for Linux
默认用户名:minio;密码minio123
用于生产环境时一定要修改,默认情况下minio用户密码非常简单,拥有最高权限,存在安全风险。
修改用户名和密码有两种方式:
- helm参数设置,明文设置,通过helm命令即可拿到明文用户名密码
- 通过环境变量设置。缺点就是明文配置,可以通过kubectl直接查看到。
- (推荐)通过创建K8S secret,配置账号密码。虽然也有方式解密密文,但是比直接明文安全。
1.helm参数设置
--set secrets.accessKey=miniouser \
--set secrets.secretKey=miniouser@123 \
2.环境变量设置
--set tenant.env[3].name=MINIO_ROOT_USER \
--set tenant.env[3].value=minioadmin \
--set tenant.env[4].name=MINIO_ROOT_PASSWORD \
--set tenant.env[4].value=minioadmin@123 \
3.K8S secret设置
在MinIO tenant 的Helm Chart的values.yaml文件的最后,给出了创建secret的示例。
可以参考示例,创建secret。
实际上所有需要环境变量配置的参数,都可以用一样的格式写到secret中。
在values.yaml文件的开头,也给出了引用secret的方法。
--set tenant.configuration.name=minio-config-prod \
--set secrets.existingSecret=minio-config-prod \
Helm Chart中templates/tenant-configuration.yaml文件也可以看出,如果没有设置secrets.existingSecret,那么此yaml文件就会拿secrets.accessKey和secrets.secretKey的值作为用户名和密码。
参考文档
Deploy Operator With Helm — MinIO Object Storage for Kubernetes