单节点部署 参考文档 http://www.minio.org.cn/docs/minio/kubernetes/upstream/#quickstart-minio-for-kubernetes ](http://www.minio.org.cn/docs/minio/kubernetes/upstream/#quickstart-minio-for-kubernetes)
部署minIO 创建资源 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 [root@k8s-master minio]# cat > minio.yaml << EOF kind: PersistentVolumeClaim apiVersion: v1 metadata:   name: minio-pvc   namespace: minio spec:   storageClassName: nfs-client   accessModes:     - ReadWriteOnce   resources:     requests:       storage: 50Gi --- apiVersion: apps/v1 kind: Deployment metadata:   labels:     app: minio   name: minio   namespace: minio spec:   selector:     matchLabels:       app: minio   template:     metadata:       labels:         app: minio     spec:       containers:       - name: minio         image: quay.io/minio/minio:latest         command:         - /bin/bash         - -c         args:          - minio server /data --console-address :9090         volumeMounts:         - mountPath: /data           name: data         ports:         - containerPort: 9090           name: console         - containerPort: 9000           name: api         env:         - name: MINIO_ROOT_USER # 指定用户名           value: "admin"          - name: MINIO_ROOT_PASSWORD # 指定密码,最少8位置           value: "minioadmin"       volumes:       - name: data         persistentVolumeClaim:           claimName: minio-pvc --- apiVersion: v1 kind: Service metadata:   name: minio-service   namespace: minio spec:     type: NodePort      selector:            app: minio     ports:     - name: console       port: 9090       protocol: TCP       targetPort: 9090       nodePort: 30300     - name: api       port: 9000       protocol: TCP       targetPort: 9000       nodePort: 30200 EOF [root@k8s-master minio]# kubectl apply -f minio.yaml  deployment.apps/minio created service/minio-service created 
使用NodePort方式访问web页面 
1 2 3 4 5 6 [root@k8s-master minio]# kubectl get pod -n minio  NAME                     READY   STATUS    RESTARTS   AGE minio-86577f8755-l65mf   1/1     Running   0          11m [root@k8s-master minio]# kubectl get svc -n minio  NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE minio-service   NodePort   10.102.223.132   <none>        9090:30300/TCP,9000:30200/TCP   10m 
访问k8s节点ip:30300,默认用户名密码都是** admin ** 
使用ingress方式访问 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [root@k8s-master minio]# cat minio-ingress.yaml apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata:   name: minio-console   namespace: minio spec:   entryPoints:   - web   routes:   - match: Host(`minio.test.com`) # 域名     kind: Rule     services:       - name: minio-service  # 与svc的name一致         port: 9090           # 与svc的port一致 --- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata:   name: minio-api   namespace: minio spec:   entryPoints:   - web   routes:   - match: Host(`minio-api.test.com`) # 域名     kind: Rule     services:       - name: minio-service  # 与svc的name一致         port: 9000           # 与svc的port一致 [root@k8s-master minio]# kubectl apply -f minio-ingress.yaml  ingressroute.traefik.containo.us/minio-console created ingressroute.traefik.containo.us/minio-api created 
添加hosts记录 <font style="background-color:rgba(255, 255, 255, 0);">192.168.10.10 minio.test.com</font>访问域名即可 
helm部署minIO集群 minIO集群方式部署使用operator或者helm均可。如果是一套 k8s 集群部署一套 minio 推荐 shiyonghelm 方式部署,operator 更适合多套 minio 集群多租户场景使用。 
helm部署minIO参考文档: https://artifacthub.io/packages/helm/bitnami/minio 。 
集群角色规划 使用分布式方式部署高可用的minIO集群时,驱动器总数至少是4 个,以保证纠删码。我们可以在k8s-work1和k8s-work2上的data1和data2路径存放minIO数据,使用local pv方式持久化数据。 
1 2 3 4 5 # 创建数据存放路径 [root@k8s-work1 ~]# mkdir -p /data1/minio [root@k8s-work1 ~]# mkdir -p /data2/minio [root@k8s-work2 ~]# mkdir -p /data1/minio [root@k8s-work2 ~]# mkdir -p /data2/minio 
下载helm包 1 2 3 4 5 6 7 8 [root@k8s-master ~]# helm repo add bitnami https://charts.bitnami.com/bitnami [root@k8s-master ~]# helm search repo minio NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                        bitnami/minio                   14.1.4          2024.3.30       MinIO(R) is an object storage server, compatibl... [root@k8s-master ~]# helm pull bitnami/minio --untar  [root@k8s-master ~]# cd minio [root@k8s-master minio]# ls Chart.lock  charts  Chart.yaml  README.md  templates  values.yaml 
创建sc provisioner 字段定义为 no-provisioner,这是因为 Local Persistent Volume 目前尚不支持 Dynamic Provisioning 动态生成 PV,所以我们需要提前手动创建 PV。 volumeBindingMode 字段定义为 WaitForFirstConsumer,它是 Local Persistent Volume 里一个非常重要的特性,即:延迟绑定。延迟绑定就是在我们提交 PVC 文件时,StorageClass 为我们延迟绑定 PV 与 PVC 的对应关系。 
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@k8s-master minio]# cat > storageClass.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:   name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer EOF [root@k8s-master minio]# kubectl apply -f storageClass.yaml  storageclass.storage.k8s.io/local-storage created [root@k8s-master minio]# kubectl get storageclass NAME                  PROVISIONER                                         RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE local-storage         kubernetes.io/no-provisioner                        Delete          WaitForFirstConsumer   false                  19s 
创建pv pv资源分布如下: 
pv名称 pvc名称 主机 路径 容量  
 
minio-pv1 data-minio-0 work1 /data1/minio 10G  
minio-pv2 data-minio-1 work1 /data2/minio 10G  
minio-pv3 data-minio-2 work2 /data1/minio 10G  
minio-pv4 data-minio-3 work2 /data2/minio 10G  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 [root@k8s-master minio]# cat > pv.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata:   name: minio-pv1   labels:     app: minio-0 spec:   capacity:     storage: 10Gi   volumeMode: Filesystem   accessModes:   - ReadWriteOnce   storageClassName: local-storage # storageClass名称,与前面创建的storageClass保持一致   local:     path: /data1/minio # 本地存储路径   nodeAffinity: # 调度至work1节点     required:       nodeSelectorTerms:       - matchExpressions:         - key: kubernetes.io/hostname           operator: In           values:           - work1 --- apiVersion: v1 kind: PersistentVolume metadata:   name: minio-pv2   labels:     app: minio-1 spec:   capacity:     storage: 10Gi   volumeMode: Filesystem   accessModes:   - ReadWriteOnce   storageClassName: local-storage   local:     path: /data2/minio   nodeAffinity:     required:       nodeSelectorTerms:       - matchExpressions:         - key: kubernetes.io/hostname           operator: In           values:           - work1 --- apiVersion: v1 kind: PersistentVolume metadata:   name: minio-pv3   labels:     app: minio-2 spec:   capacity:     storage: 10Gi   volumeMode: Filesystem   accessModes:   - ReadWriteOnce   storageClassName: local-storage   local:     path: /data1/minio   nodeAffinity:     required:       nodeSelectorTerms:       - matchExpressions:         - key: kubernetes.io/hostname           operator: In           values:           - work2 --- apiVersion: v1 kind: PersistentVolume metadata:   name: minio-pv4   labels:     app: minio-3 spec:   capacity:     storage: 10Gi   volumeMode: Filesystem   accessModes:   - ReadWriteOnce   storageClassName: local-storage   local:     path: /data2/minio   nodeAffinity:     required:       nodeSelectorTerms:       - matchExpressions:         - key: kubernetes.io/hostname           operator: In           values:           - work2 EOF [root@master1 minio]# kubectl apply -f pv.yaml  persistentvolume/minio-pv1 created persistentvolume/minio-pv2 created persistentvolume/minio-pv3 created persistentvolume/minio-pv4 created [root@master1 minio]# kubectl get pv | grep minio minio-pv1                                  10Gi       RWO            Delete           Bound    minio/data-minio-1                              local-storage            9s minio-pv2                                  10Gi       RWO            Delete           Bound    minio/data-minio-2                              local-storage            9s minio-pv3                                  10Gi       RWO            Delete           Bound    minio/data-minio-3                              local-storage            9s minio-pv4                                  10Gi       RWO            Delete           Bound    minio/data-minio-0                              local-storage            9s 
创建pvc 创建的时候注意pvc的名字的构成:pvc的名字 = volume_name-statefulset_name-序号,然后通过selector标签选择,强制将pvc与pv绑定。 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [root@master1 minio]# cat > pvc.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: data-minio-0   namespace: minio spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 10Gi   storageClassName: local-storage   selector:     matchLabels:       app: minio-0 --- apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: data-minio-1   namespace: minio spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 10Gi   storageClassName: local-storage   selector:     matchLabels:       app: minio-1 --- apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: data-minio-2   namespace: minio spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 10Gi   storageClassName: local-storage   selector:     matchLabels:       app: minio-2 --- apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: data-minio-3   namespace: minio spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 10Gi   storageClassName: local-storage   selector:     matchLabels:       app: minio-3 EOF [root@tiaoban minio]# kubectl create ns minio namespace/minio created [root@tiaoban minio]# kubectl apply -f pvc.yaml  persistentvolumeclaim/data-minio-0 created persistentvolumeclaim/data-minio-1 created persistentvolumeclaim/data-minio-2 created persistentvolumeclaim/data-minio-3 created [root@tiaoban minio]# kubectl get pvc -n minio NAME           STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS    AGE data-minio-0   Pending                                      local-storage   13s data-minio-1   Pending                                      local-storage   13s data-minio-2   Pending                                      local-storage   13s data-minio-3   Pending                                      local-storage   13s 
修改配置 修改配置values.yaml 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 68 image: 69   registry: docker.io 70   repository: bitnami/minio 71   tag: 2024.3.30-debian-12-r0    104 mode: distributed # 集群模式,单节点为standalone,分布式集群为distributed 197 statefulset: 215  replicaCount: 2 # 节点数 218   zones: 1 # 区域数,1个即可 221   drivesPerNode: 2 # 每个节点数据目录数.2节点×2目录组成4节点的mimio集群 558 #podAnnotations: {} # 导出Prometheus指标 559 podAnnotations: 560   prometheus.io/scrape: "true" 561   prometheus.io/path: "/minio/v2/metrics/cluster" 562   prometheus.io/port: "9000" 1049 persistence: 1052   enabled: true 1060   storageClass: "local-storage" 1063   mountPath: /bitnami/minio/data 1066   accessModes: 1067     - ReadWriteOnce 1070   size: 10Gi 1073   annotations: {} 1076   existingClaim: "" 
部署minIO 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [root@k8s-master minio]# kubectl create ns minio [root@k8s-master minio]# helm install minio . -f values.yaml -n minio NAME: minio LAST DEPLOYED: Tue Apr  2 22:28:03 2024 NAMESPACE: minio STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: minio CHART VERSION: 14.1.4 APP VERSION: 2024.3.30 ** Please be patient while the chart is being deployed ** MinIO® can be accessed via port  on the following DNS name from within your cluster:    minio.minio.svc.cluster.local To get your credentials run:    export ROOT_USER=$(kubectl get secret --namespace minio minio -o jsonpath="{.data.root-user}" | base64 -d)    export ROOT_PASSWORD=$(kubectl get secret --namespace minio minio -o jsonpath="{.data.root-password}" | base64 -d) To connect to your MinIO® server using a client: - Run a MinIO® Client pod and append the desired command (e.g. 'admin info'):    kubectl run --namespace minio minio-client \      --rm --tty -i --restart='Never' \      --env MINIO_SERVER_ROOT_USER=$ROOT_USER \      --env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \      --env MINIO_SERVER_HOST=minio \      --image docker.io/bitnami/minio-client:2024.3.30-debian-12-r0 -- admin info minio To access the MinIO® web UI: - Get the MinIO® URL:    echo "MinIO® web URL: http://127.0.0.1:9001/minio"    kubectl port-forward --namespace minio svc/minio 9001:9001 WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:   - resources +info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ 
查看资源信息 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@master1 minio]# kubectl get all -n minio  NAME          READY   STATUS    RESTARTS   AGE pod/minio-0   1/1     Running   0          15s pod/minio-1   1/1     Running   0          15s pod/minio-2   1/1     Running   0          15s pod/minio-3   1/1     Running   0          14s NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE service/minio            ClusterIP   10.106.74.147   <none>        9000/TCP,9001/TCP   15s service/minio-headless   ClusterIP   None            <none>        9000/TCP,9001/TCP   15s NAME                     READY   AGE statefulset.apps/minio   4/4     15s 
创建ingress资源 以ingrss-nginx为例: 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # cat > ingress.yaml << EOF apiVersion: networking.k8s.io/v1 kind: Ingress metadata:   name: minio-ingreess   namespace: minio   annotations:     nginx.ingress.kubernetes.io/rewrite-target: / spec:   ingressClassName: nginx   rules:   - host: minio.local.com     http:       paths:       - path: /         pathType: Prefix         backend:           service:             name: minio             port:               number: 9001 EOF 
以traefik为例: 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [root@k8s-master minio]# cat ingress.yaml  apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata:   name: minio-console   namespace: minio spec:   entryPoints:   - web   routes:   - match: Host(`minio.local.com`) # 域名     kind: Rule     services:       - name: minio  # 与svc的name一致         port: 9001      # 与svc的port一致 --- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata:   name: minio-api   namespace: minio spec:   entryPoints:   - web   routes:   - match: Host(`minio-api.local.com`) # 域名     kind: Rule     services:       - name: minio  # 与svc的name一致         port: 9000      # 与svc的port一致 [root@k8s-master minio]# kubectl apply -f ingress.yaml  ingressroute.traefik.containo.us/minio-console created ingressroute.traefik.containo.us/minio-api created 
获取用户名密码 1 2 3 4 5 # 获取用户名和密码 [root@k8s-master minio]# kubectl get secret --namespace minio minio -o jsonpath="{.data.root-user}" | base64 -d admin [root@k8s-master minio]# kubectl get secret --namespace minio minio -o jsonpath="{.data.root-password}" | base64 -d HWLLGMhgkp 
访问web管理页 operator部署minIO 参考文档: https://min.io/docs/minio/kubernetes/upstream/operations/installation.html 
安装operator 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 [root@master1 ~]# helm repo add minio-operator https://operator.min.io "minio-operator" has been added to your repositories [root@master1 ~]# helm search repo minio-operator NAME                            CHART VERSION   APP VERSION     DESCRIPTION                     minio-operator/minio-operator   4.3.7           v4.3.7          A Helm chart for MinIO Operator minio-operator/operator         5.0.14          v5.0.14         A Helm chart for MinIO Operator minio-operator/tenant           5.0.14          v5.0.14         A Helm chart for MinIO Operator [root@master1 ~]# helm install \ --namespace minio-operator \ --create-namespace \ operator minio-operator/operator NAME: operator LAST DEPLOYED: Sun Mar 24 21:47:05 2024 NAMESPACE: minio-operator STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: 1. Get the JWT for logging in to the console: kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata:   name: console-sa-secret   namespace: minio-operator   annotations:     kubernetes.io/service-account.name: console-sa type: kubernetes.io/service-account-token EOF kubectl -n minio-operator get secret console-sa-secret -o jsonpath="{.data.token}" | base64 --decode 2. Get the Operator Console URL by running these commands:   kubectl --namespace minio-operator port-forward svc/console 9090:9090   echo "Visit the Operator Console at http://127.0.0.1:9090" [root@master1 ~]# kubectl get all -n minio-operator NAME                                  READY   STATUS    RESTARTS   AGE console-658c74c776-mjdq7              1/1     Running   0          3m minio-operator-5fb5486696-b494r       1/1     Running   0          3m minio-operator-5fb5486696-txds7       1/1     Running   0          3m NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE service/console    ClusterIP   10.98.101.3     <none>        9090/TCP,9443/TCP   6s service/operator   ClusterIP   10.100.70.152   <none>        4221/TCP            6s service/sts        ClusterIP   10.109.22.187   <none>        4223/TCP            6s NAME                             READY   UP-TO-DATE   AVAILABLE   AGE deployment.apps/console          1/1     1            1           39m deployment.apps/minio-operator   2/2     2            2           39m NAME                                        DESIRED   CURRENT   READY   AGE replicaset.apps/console-59cbf8fbfb          1         1         1       6s replicaset.apps/minio-operator-6868bf476d   2         2         2       6s 
访问控制台 创建ingress资源,以traefik为例 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata:   name: minio-console   namespace: minio-operator spec:   entryPoints:   - web   routes:   - match: Host(`minio.local.com`) # 域名     kind: Rule     services:       - name: console  # 与svc的name一致         port: 9090      # 与svc的port一致 
获取token 
1 2 [root@tiaoban minio]# kubectl get secret/console-sa-secret -n minio-operator -o json | jq -r ".data.token" | base64 -d eyJhbGciOiJSUzI1NiIsImtpZCI6IkJqajJ5XzA1LTdjWmhWWTJhUWdtNW5pMHJsejI4Z0d5MjlsWHg1YjF3NG8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtaW5pby1vcGVyYXRvciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjb25zb2xlLXNhLXNlY3JldCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJjb25zb2xlLXNhIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZTA2NmRjOTQtMmI5NS00ODllLTk1MzQtNDdjNTY5MzI0YjQxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Om1pbmlvLW9wZXJhdG9yOmNvbnNvbGUtc2EifQ.0828UMXxhkESZtTo6xUtJRDqHf8ksVNGUVOZas7dIMCPeF9Z2nLZDySMFXBc4qYUb-qGEw5YT0JYxhz_B82Cy-Lg05RaawCmFWlf4Q5O57xdOZ66sUJffRNprqd4uzLejvirtwgzpD6ddiIg4HVN107VIy--S-A-OTbvbrSWtO95GIu4eNG5pM0YALrYAXPuDbBzRsQ9DHjH9dEoXsJW_yhwmlMoIm4Qi4RR4SSRBuVVRvU38DGvg2eZjveSDDJiozOLuGvw3HTPHuamdneEpdfQzCysMEkUm0eZa_uG-5aoSINd7peB9CBPkSx91tM3aX4E1lyN6Q5SVmr3v7o31w 
浏览器访问minio 
helm创建租户 拉取helm包 
1 2 3 4 [root@master1 ~]# helm pull minio-operator/tenant --untar  [root@master1 ~]# cd tenant/ [root@master1 tenant]# ls Chart.yaml  README.md  templates  values.yaml 
修改values.yaml 
1 2 3 4 5 6 7 8 9 10 11 12 39 tenant: 44   name: k8s-minio 68   image: 69     repository: harbor.local.com/minio 70     tag: RELEASE.2024-03-21T23-13-43Z 91   pools: 96     - servers: 4            # 服务器数 102      volumesPerServer: 1   # 每个服务器节点数 105      size: 10Gi            # 每个节点大小 112      storageClassName: local-storage 
安装helm 
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@master1 tenant]# helm install tenant . -f values.yaml -n minio NAME: tenant LAST DEPLOYED: Sun Mar 24 23:12:11 2024 NAMESPACE: minio STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: To connect to the k8s-minio tenant if it doesn't have a service exposed, you can port-forward to it by running:   kubectl --namespace minio port-forward svc/k8s-minio-console 9443:9443   Then visit the MinIO Console at https://127.0.0.1:9443 
web页面创建租户 Prometheus Operator添加监控 访问metrics接口验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@master1 minio]# kubectl get svc -n minio  NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE minio            ClusterIP   10.103.75.63   <none>        9000/TCP,9001/TCP   71m minio-headless   ClusterIP   None           <none>        9000/TCP,9001/TCP   71m [root@rocky /]# curl http://10.103.75.63:9000/minio/v2/metrics/cluster # HELP minio_audit_failed_messages Total number of messages that failed to send since start # TYPE minio_audit_failed_messages counter minio_audit_failed_messages{server="minio-0.minio-headless.minio.svc.cluster.local:9000",target_id="sys_console_0"} 0 minio_audit_failed_messages{server="minio-1.minio-headless.minio.svc.cluster.local:9000",target_id="sys_console_0"} 0 minio_audit_failed_messages{server="minio-2.minio-headless.minio.svc.cluster.local:9000",target_id="sys_console_0"} 0 minio_audit_failed_messages{server="minio-3.minio-headless.minio.svc.cluster.local:9000",target_id="sys_console_0"} 0 # HELP minio_audit_target_queue_length Number of unsent messages in queue for target # TYPE minio_audit_target_queue_length gauge minio_audit_target_queue_length{server="minio-0.minio-headless.minio.svc.cluster.local:9000",target_id="sys_console_0"} 0 minio_audit_target_queue_length{server="minio-1.minio-headless.minio.svc.cluster.local:9000",target_id="sys_console_0"} 0 minio_audit_target_queue_length{server="minio-2.minio-headless.minio.svc.cluster.local:9000",target_id="sys_console_0"} 0 minio_audit_target_queue_length{server="minio-3.minio-headless.minio.svc.cluster.local:9000",target_id="sys_console_0"} 0 ………… 
新增svc标签 1 2 3 4 5 6 7 8 9 10 [root@master1 minio]# kubectl edit svc -n minio minio apiVersion: v1 kind: Service metadata:   annotations:     meta.helm.sh/release-name: minio     meta.helm.sh/release-namespace: minio   creationTimestamp: "2024-03-24T07:52:49Z"   labels:     app: minio # 新增labels标签 
新增ServiceMonitor 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@master1 minio]# cat ServiceMonitor.yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata:   name: minio-exporter  # ServiceMonitor名称   namespace: monitoring # ServiceMonitor所在名称空间 spec:   jobLabel: minio # job名称   endpoints:  # prometheus所采集Metrics地址配置,endpoints为一个数组,可以创建多个,但是每个endpoints包含三个字段interval、path、port     - interval: 30s # prometheus采集数据的周期,单位为秒       path: /minio/v2/metrics/cluster # prometheus采集数据的路径       port: minio-api # prometheus采集数据的端口,这里为port的name,主要是通过spec.selector中选择对应的svc,在选中的svc中匹配该端口       scheme: http # 协议   namespaceSelector: # 需要发现svc的范围     matchNames:     - minio   selector:     matchLabels:  # 选择svc的标签       app: minio 
Prometheus targets验证 
minIO使用 创建bucket 
创建Access Keys 
创建访问控制权限 Minio 的存储桶默认是不跟任何 Acess Key 关联的,不过由于 Minio 支持标准的 S3 协议,我们可以给 Access Key 授予某个 Bucket 存储桶的访问权限,实现 Key 和 Bucket 的绑定。 
创建policy 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 {     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": [                 "s3:ListAllMyBuckets",                 "s3:ListBucket",                 "s3:GetBucketLocation",                 "s3:GetObject",                 "s3:PutObject",                 "s3:DeleteObject"             ],             "Resource": [                 "arn:aws:s3:::es-backup/*"             ]         }     ] } 
创建user 
这里 Access Key 是用户名,Access Secret 是对应的口令。设置时关联上刚才创建的 Policy 即可。 
我们就创建了一个新的存储桶,并且给这个存储桶设置了一个用户,同时授权了用户对存储桶的访问,包括列表、上传、下载这几个基本权限。 
mc客户端使用 MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。 
安装mc客户端(Linux二进制文件) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@k8s-master minio]# curl https://dl.min.io/client/mc/release/linux-amd64/mc --create-dirs -o /usr/local/minio-binaries/mc [root@k8s-master local]# cd /usr/local/minio-binaries [root@k8s-master minio-binaries]# ls mc [root@k8s-master minio-binaries]# chmod +x mc  [root@k8s-master minio-binaries]# ./mc --help ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── (q)uit/esc NAME:                                                                                 mc - MinIO Client for object storage and filesystems.                                                                                                                 USAGE:                                                                                mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...] # 添加环境变量 [root@k8s-master minio-binaries]# cat /etc/profile export PATH="$PATH:/usr/local/minio-binaries" [root@k8s-master minio-binaries]# source /etc/profile [root@k8s-master minio-binaries]# mc --help ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── (q)uit/esc   mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...] 
安装mc客户端(docker) 1 2 3 4 5 6 7 8 [root@tiaoban ~]# docker run -it --rm minio/mc ls play mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials. mc: Successfully created `/root/.mc/share`. mc: Initialized share uploads `/root/.mc/share/uploads.json` file. mc: Initialized share downloads `/root/.mc/share/downloads.json` file. [2023-04-13 01:39:27 UTC]     0B 64375d4bed2b146c15d5383f-files/ [2023-03-15 11:55:17 UTC]     0B abc/ [2023-03-31 18:46:54 UTC]     0B awdkenny/ 
mc客户端常用命令 
命令 功能  
 
ls 列出文件和文件夹。  
mb 创建一个存储桶或一个文件夹。  
cat 显示文件和对象内容。  
pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。  
share 生成用于共享的URL。  
cp 拷贝文件和对象。  
mirror 给存储桶和文件夹做镜像。  
find 基于参数查找文件。  
diff 对两个文件夹或者存储桶比较差异。  
rm 删除文件和对象。  
events 管理对象通知。  
watch 监视文件和对象的事件。  
policy 管理访问策略。  
config 管理mc配置文件。  
update 检查软件更新。  
version 输出版本信息。  
mc连接minIO服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 添加对象存储服务 [root@k8s-master minio-binaries]# mc alias set k8s-minio http://10.102.223.132:9000 minioadmin minioadmin Added `k8s-minio` successfully. [root@k8s-master minio-binaries]# mc admin info k8s-minio ●  10.102.223.132:9000    Uptime: 41 minutes     Version: 2023-04-07T05:28:58Z    Network: 1/1 OK     Drives: 1/1 OK     Pool: 1 Pools:    1st, Erasure sets: 1, Drives per erasure set: 1 12 MiB Used, 1 Bucket, 2 Objects 1 drive online, 0 drives offline 
bucket操作 1 2 3 4 5 6 7 8 9 10 11 # 创建bucket [root@k8s-master ~]# mc mb k8s-minio/test Bucket created successfully `k8s-minio/test`. # 查看bucket [root@k8s-master ~]# mc ls k8s-minio [2023-04-13 10:02:02 CST]     0B test/ # 删除没有文件的bucket [root@k8s-master ~]# mc rb k8s-minio/demo # 删除有文件的bucket [root@k8s-master ~]# mc rb k8s-minio/test --force 
上传下载操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 上传文件到bucket [root@k8s-master ~]# mc cp /etc/hosts k8s-minio/test /etc/hosts:                   2.09 KiB / 2.09 KiB ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 60.07 KiB/s 0s[root@k8s-master ~]# mc cp /etc/yum.repos.d k8s-minio/test # 上传目录到bucket [root@k8s-master ~]# mc cp /etc/yum.repos.d k8s-minio/test --recursive ...m.repos.d/kubernetes.repo: 19.46 KiB / 19.46 KiB ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.99 KiB/s 0s # 下载bucket文件到本地 [root@k8s-master ~]# mkdir /tmp/download [root@k8s-master ~]# mc cp k8s-minio/test/hosts /tmp/download/ ...2.223.132:9000/test/hosts: 2.09 KiB / 2.09 KiB ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 66.18 KiB/s 0s[root@k8s-master ~]# ls /tmp/download/ hosts [root@k8s-master ~]# cat /tmp/download/hosts  127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 # 下载bucket目录到本地 [root@k8s-master ~]# mc cp k8s-minio/test/yum.repos.d /tmp/download/ --recursive ...m.repos.d/kubernetes.repo: 19.46 KiB / 19.46 KiB ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 87.10 KiB/s 0s[root@k8s-master ~]# ls /tmp/download/yum.repos.d/ docker-ce.repo     epel-testing-modular.repo  Rocky-AppStream.repo 
文件操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # 查看bucket文件列表 [root@k8s-master ~]# mc ls k8s-minio/test [2023-04-13 10:04:59 CST] 2.1KiB STANDARD hosts [2023-04-13 10:10:42 CST]     0B yum.repos.d/ # 查看bucket目录内容 [root@k8s-master ~]# mc ls k8s-minio/test/yum.repos.d [2023-04-13 10:05:34 CST]   710B STANDARD Rocky-AppStream.repo [2023-04-13 10:05:34 CST]   695B STANDARD Rocky-BaseOS.repo [2023-04-13 10:05:34 CST] 1.7KiB STANDARD Rocky-Debuginfo.repo [2023-04-13 10:05:34 CST]   360B STANDARD Rocky-Devel.repo # 查看bucket文件内容 [root@k8s-master ~]# mc cat k8s-minio/test/hosts 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 # 删除文件 [root@k8s-master ~]# mc rm k8s-minio/test/hosts Removed `k8s-minio/test/hosts`. # 删除目录 [root@k8s-master ~]# mc rm k8s-minio/test/yum.repos.d --recursive --force Removed `k8s-minio/test/yum.repos.d/Rocky-AppStream.repo`. Removed `k8s-minio/test/yum.repos.d/Rocky-BaseOS.repo`. Removed `k8s-minio/test/yum.repos.d/Rocky-Debuginfo.repo`. Removed `k8s-minio/test/yum.repos.d/Rocky-Devel.repo`. 
curl客户端使用 上传文件 上传文件脚本,按实际情况修改host、s3_key、s3_secret,其中192.168.10.10替换为客户端ip. 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@tiaoban ~]# cat push.sh  #!/bin/bash export PATH=$PATH:/bin:/usr/bin:/usr/local/bin if [ $# != 2 ] ; then  echo "Usage: `basename $0` my-bucket my-file.zip" >&2 exit 1 fi bucket=$1 file=$2 host=minio-api.test.com s3_key=GfuHooI5byVpGf2RGwl3 s3_secret=YpYqXKKhI4bNUmWWULa3qf5n5WPq3TDedb1uzREc resource="/${bucket}/${file}" content_type="application/zstd" date=`date -R` _signature="PUT\n\n${content_type}\n${date}\n${resource}" signature=`echo -en ${_signature} | openssl sha1 -hmac ${s3_secret} -binary | base64` curl -v -X PUT -T "${file}" \           -H "Host: ${host}" \           -x "192.168.10.10:80" \           -H "Date: ${date}" \           -H "Content-Type: ${content_type}" \           -H "Authorization: AWS ${s3_key}:${signature}" \           http://${host}${resource} 
上传文件 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [root@tiaoban ~]# ls anaconda-ks.cfg  cfssl  defaults.ini  es  go  push.sh [root@tiaoban ~]# ./push.sh test defaults.ini  *   Trying 192.168.10.10... * TCP_NODELAY set * Connected to 192.168.10.10 (192.168.10.10) port 80 (#0) > PUT http://minio-api.test.com/test/defaults.ini HTTP/1.1 > Host: minio-api.test.com > User-Agent: curl/7.61.1 > Accept: */* > Proxy-Connection: Keep-Alive > Date: Sat, 06 May 2023 10:10:07 +0800 > Content-Type: application/zstd > Authorization: AWS bhUsp7nwc6XNPzoI:w2ddmcsQWOijC2BZJSGE4u7DgFc= > Content-Length: 55875 > Expect: 100-continue >  < HTTP/1.1 100 Continue * We are completely uploaded and fine < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 0 < Content-Security-Policy: block-all-mixed-content < Date: Sat, 06 May 2023 02:10:07 GMT < Etag: "1b0bdd8f4c5f31ef5661380efcaefce5" < Server: MinIO < Strict-Transport-Security: max-age=31536000; includeSubDomains < Vary: Origin < Vary: Accept-Encoding < X-Amz-Id-2: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 < X-Amz-Request-Id: 175C6BE8ACF79B53 < X-Content-Type-Options: nosniff < X-Xss-Protection: 1; mode=block <  * Connection #0 to host 192.168.10.10 left intact 
查看bucket文件 
下载文件 下载文件脚本 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #!/usr/bin/env sh if [ $# != 3 ] ; then  echo "Usage: `basename $0` my-bucket minio-filename localfile" >&2 echo "Usage: `basename $0` test-bucket 1.log /tmp/1.log" >&2 exit 1 fi # User Minio Vars host=minio-api.test.com s3_key=bhUsp7nwc6XNPzoI s3_secret=w3KBPxMZ5Nw4apRGZY3uAHON7bkkKprP BUCKET=$1 MINIO_PATH="/${BUCKET}/$2" OUT_FILE=$3 # Static Vars DATE=$(date -R) CONTENT_TYPE='application/zstd' SIG_STRING="GET\n\n${CONTENT_TYPE}\n${DATE}\n${MINIO_PATH}" SIGNATURE=`echo -en ${SIG_STRING} | openssl sha1 -hmac ${s3_secret} -binary | base64` curl -v -o "${OUT_FILE}" \     -x "192.168.10.10:80" \     -H "Host: $host" \     -H "Date: ${DATE}" \     -H "Content-Type: ${CONTENT_TYPE}" \     -H "Authorization: AWS ${s3_key}:${SIGNATURE}" \     http://$URL${MINIO_PATH} 
下载文件 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [root@tiaoban ~]# ./pull.sh test defaults.ini /tmp/defaults.ini *   Trying 192.168.10.10... * TCP_NODELAY set   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                  Dload  Upload   Total   Spent    Left  Speed   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 192.168.10.10 (192.168.10.10) port 80 (#0) > GET http://minio-api.test.com/test/defaults.ini HTTP/1.1 > Host: minio-api.test.com > User-Agent: curl/7.61.1 > Accept: */* > Proxy-Connection: Keep-Alive > Date: Sat, 06 May 2023 10:17:18 +0800 > Content-Type: application/zstd > Authorization: AWS bhUsp7nwc6XNPzoI:sl8feCFiJC4MpaKSKrGU9HlDMLw= >  < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 55875 < Content-Security-Policy: block-all-mixed-content < Content-Type: application/zstd < Date: Sat, 06 May 2023 02:17:18 GMT < Etag: "1b0bdd8f4c5f31ef5661380efcaefce5" < Last-Modified: Sat, 06 May 2023 02:10:07 GMT < Server: MinIO < Strict-Transport-Security: max-age=31536000; includeSubDomains < Vary: Origin < Vary: Accept-Encoding < X-Amz-Id-2: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 < X-Amz-Request-Id: 175C6C4CF3EB56C4 < X-Content-Type-Options: nosniff < X-Xss-Protection: 1; mode=block <  { [3529 bytes data] 100 55875  100 55875    0     0  1474k      0 --:--:-- --:--:-- --:--:-- 1515k * Connection #0 to host 192.168.10.10 left intact [root@tiaoban ~]# ls -lh /tmp/defaults.ini  -rw-r--r-- 1 root root 55K 5月   6 10:17 /tmp/defaults.ini