K8S中使用helm安装MinIO

注意事项

使用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到本地

bash 复制代码
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

bash 复制代码
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

bash 复制代码
wget https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.9.0/ingress-nginx-4.9.0.tgz

3.部署Operator

bash 复制代码
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

bash 复制代码
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

bash 复制代码
--set tenant.pools[0].storageClassName=cbs \

MinIO通过storageClass 创建PV,最小部署会创建16块PV,挂载到4个POD上。

通过ingress暴露服务

bash 复制代码
--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内部域名,无法用于集群外部下载文件。

bash 复制代码
--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的值。但是同样会减少实际可用空间。简单来说这就是设置数据冗余的比例。

bash 复制代码
--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用户密码非常简单,拥有最高权限,存在安全风险。

修改用户名和密码有两种方式:

  1. helm参数设置,明文设置,通过helm命令即可拿到明文用户名密码
  2. 通过环境变量设置。缺点就是明文配置,可以通过kubectl直接查看到。
  3. 推荐)通过创建K8S secret,配置账号密码。虽然也有方式解密密文,但是比直接明文安全。

1.helm参数设置

bash 复制代码
--set secrets.accessKey=miniouser \
--set secrets.secretKey=miniouser@123 \

2.环境变量设置

bash 复制代码
--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的方法。

bash 复制代码
--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

相关推荐
杰克逊的日记4 小时前
k8s的csi对接GPFS
云原生·容器·kubernetes·存储·gpfs
岚天start4 小时前
云服务器以域名形式访问机房Kubernetes集群服务之解决方案
nginx·docker·kubernetes·kubesphere·解决方案·云服务器·机房
终端行者8 小时前
k8s之ingress定义https访问方式
容器·https·kubernetes
HANFAN11 小时前
.NET4通过HTTP操作MINIO
.net·minio
东风微鸣13 小时前
AI 赋能的云原生应用:技术趋势与实践
docker·云原生·kubernetes·可观察性
退役小学生呀14 小时前
十七、K8s 可观测性:全链路追踪
linux·云原生·容器·kubernetes·k8s
Johny_Zhao1 天前
CentOS Stream 9上部署FTP应用服务的两种方法(传统安装和docker-compose)
linux·网络安全·信息安全·kubernetes·云计算·containerd·ftp·yum源·系统运维
鼠鼠我捏,要死了捏1 天前
多租户Kubernetes集群架构设计实践——隔离、安全与弹性扩缩容
kubernetes·architecture·multi-tenancy
java叶新东老师1 天前
k8s常用命令
云原生·容器·kubernetes
liux35281 天前
从零构建:Jenkins与Kubernetes集成的完整指南
java·kubernetes·jenkins