通过operator的方式在k8s中部署minio

发布时间 2023-04-23 14:48:41作者: 众里寻它千百度

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