minio-operator部署指南
概述
MinIO 提供高性能、兼容 S3 的对象存储,原生于 Kubernetes
文档URL:https://min.io/docs/minio/kubernetes/upstream/operations/installation.html
版本说明 - 服务
名称 | 版本 | 描述 |
---|---|---|
console | v0.19.0 | 租户控制台 |
operator | v4.4.25 | minio-operator |
minio | RELEASE.2022-06-20T23-13-45Z | minio server |
busybox | busybox:1.33.1 | 初始化日志api服务 |
postgres | library/postgres:13 | 数据库服务 |
版本说明 - 测试工具
名称 | 版本 | 描述 |
---|---|---|
kubectl-minio | v4.4.25 | kubectl minio 插件(初始化operator、管理租户) |
mc | RELEASE.2022-07-06T14-54-36Z | minio客户端管理工具 |
依赖服务
名称 | 版本 | 描述 |
---|---|---|
kubernetes | 1.19.x | k8s集群 |
RKE集群说明
- rke集群的kubelet服务是基于docker部署,因此无法操作宿主机文件系统,所以需要将抽象成PV资源的hostpath挂载至kubelet
- rke集群默认没有指定集群范围签名的CA机构,但是由于minio-operator初始化时会生成csr并向api请求tls认证,如果没有指定签名的CA机构,csr请求将不会被处理且minio-operator将无法正常初始化完成,所以需要在kube-controller服务启动参数中指定集群签名的CA机构
需要在rke 的cluster.yaml文件中按需填写以下配置
services: kubelet: extra_binds: - "<hostPath>:<hostPath>" kube-controller: extra_args: cluster-signing-cert-file: /etc/kubernetes/ssl/kube-ca.pem cluster-signing-key-file: /etc/kubernetes/ssl/kube-ca-key.pem
配置
初始化minio-opeator
minio-operator初始化后会启动两个pod,其中operator为minio的控制器,而console则为多租户管理程序
#kubectl-minio拷贝至可搜寻路径并赋予执行权限 #拷贝kubectl-minio文件至目标目标时,名称需要保持一致 cp tools/kubectl-minio /usr/local/bin/ && chmod +x /usr/local/bin/kubectl-minio #查看插件版本以确认该插件是否可用 kubectl minio version #初始化operator,指定operator、console的镜像版本,默认会创建minio-operator名称空间并在该空间安装operator资源 kubectl minio init --image=reg.chebai.org/icospaas/minio/operator:v4.4.25 \ --console-image=reg.chebai.org/icospaas/minio/console:v0.19.0 #查看operator安装状态 kubectl get all -n minio-operator
访问operator-console
#该命令会创建operator console的代理,并生成jwt token用于登录 kubectl minio proxy -n minio-operator
可正常登录则说明operator已经初始化完成且处于可用状态
Storage Class
创建一个自定义的StorageClass供minio租户的PV使用,minio租户要求volumeBindingMode设置为WaitForFirstConsumer
#创建存储类资源 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: node-local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
Persistent Volume
tenant_pv
- pv需要绑定k8s节点上的路径目录作为存储资源
- 目录需要为空,且挂载的磁盘容量需要满足pv请求资源的要求
- 如节点上没有所需的请求资源,则需要额外挂载磁盘
- pv的容量需要提前规划,详情可以先查看Create Tenant.volumes下的内容
- pv的数量取决于需要多少个volume
创建前需要根据需求替换pv.yaml文件中的name、storage、path、values字段的值
#创建pv资源 apiVersion: v1 kind: PersistentVolume metadata: name: node1-volume-01 #根据需求指定pv名称 spec: capacity: storage: 80Gi #根据需求修改存储大小 volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: node-local-storage local: path: /minio/data1 #拥有volume的文件路径 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1 #选择拥有当前资源需求的节点
log_pv
创建5Gi的PV给tenant log服务所使用
#创建pv资源并根据实际需求修改log_pv.yaml文件name、path、values字段的值 apiVersion: v1 kind: PersistentVolume metadata: name: minio-log-pv #根据租户名称修改该值 spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: minio-log-storage local: path: /minio/data1 #拥有volume的文件路径 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1 #选择拥有当前资源需求的节点
Create Tenant
租户需要和namespace进行绑定,然后在namespace下初始化minio集群,而这一整体被称之为一个租户(tenant)
volumes
创建租户前需要提前规划所需总容量以及volume个数(volume个数推荐>=4),可以根据总容量和volume个数来计算单个pv的容量,计算公式如下
**总容量 / 磁盘数量 = 单个PV的容量 **
提示:valume >= 4 才能拥有erasure code(纠删码)的功能
servers
根据集群实际规模或者servers配置来决定一个server绑定多少个volume
sample:
--servers 4 --volumes 4 则每个server绑定一个volume
--servers 2 --volumes 4 则每个server绑定两个volume
初始化minio集群
#创建名称空间 kubectl create ns <namespace> #初始化租户(servers、volumes、capacity值根据实际需求进行填写) kubectl minio tenant create <tenant-name> \ --servers 4 --volumes 4 \ --capacity 320Gi \ #320Gi为假设需要的存储资源,由于volumes为4,那么 320Gi / 4 即得出单个pv为80Gi,一共则需要4个80Gi的pv --storage-class node-local-storage \ --audit-logs-storage-class minio-log-storage \ --namespace <namespace> \ --image reg.chebai.org/icospaas/minio/minio:RELEASE.2022-06-20T23-13-45Z \ --audit-logs-image reg.chebai.org/icospaas/minio/operator:v4.4.25 \ --audit-logs-pg-init-image reg.chebai.org/icospaas/minio/busybox:1.33.1 \ --audit-logs-pg-image reg.chebai.org/icospaas/minio/postgres:13
-
创建后会返回当前租户的根鉴权信息,需妥善保管
-
通过kubectl get svc -n <namespace> 查看svc信息,其中minio用于集群内应用所使用,console则用于web端管理,如需集群外访问,可基于ingress来实现
创建租户console ingress
#根据需求修改./ingress/tenant_minio_console.yaml中的namespace、host、nginx.ingress.kubernetes.io/proxy-body-size、service.name字段的值 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: console namespace: <namespace> annotations: nginx.ingress.kubernetes.io/proxy-body-size: <100m> nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-passthrough: "true" spec: ingressClassName: "nginx" rules: - host: <domain> http: paths: - backend: service: name: <svc_name> port: number: 9443 path: / pathType: Prefix 创建租户minio ingress
#根据需求修改namaspace、host、nginx.ingress.kubernetes.io/proxy-body-size字段的值 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minio namespace: <namespace> annotations: nginx.ingress.kubernetes.io/proxy-body-size: <100m> nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-passthrough: "true" spec: ingressClassName: "nginx" rules: - host: <domain> http: paths: - backend: service: name: minio port: number: 443 path: / pathType: Prefix
测试
登录Operator console查看租户状态
#创建operator-console ingress,且根据需求修改ingress.yaml文件中host、nginx.ingress.kubernetes.io/proxy-body-size字段的值 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: console namespace: minio-operator annotations: nginx.ingress.kubernetes.io/proxy-body-size: <100m> spec: ingressClassName: "nginx" rules: - host: <domain> http: paths: - backend: service: name: console port: number: 9090 path: / pathType: Prefix
#在访问客户端上增加hosts记录 || dns服务器增加解析记录 <address> <domain> #获取console控制台token,获取到token后请及时终止该proxy kubectl minio proxy -n minio-operator
通过域名访问operator console服务
冒烟测试
minio-operator在初始化集群时是基于k8s的ca自签的证书且无法通过校验,所以mc操作租户minio时需要加上--insecure
#将mc工具添加至可搜寻路径并赋予执行权限 cp tools/mc /usr/local/sbin && chmod +x /usr/local/sbin/mc #添加minio cluster信息(集群内endpoint为svc的地址、集群外endpoint则为ingress的域名) mc alias set minio1 <endpoint> <key> <secretKey> --insecure #创建bucket mc mb minio1/test --insecure #上传文件至test bucket mc cp ./kubectl-minio minio1/test --insecure #查看test bucket中的文件 mc ls minio1/test --insecure
清理
清理minio租户
kubectl minio tenant delete <tenent_name> -n <namespace>
清理minio-operator
kubectl minio delete
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!