云原生 | 从零开始,Minio 高性能分布式对象存储快速入手指南

[ 点击 👉 关注「 全栈工程师修炼指南」公众号 ]

希望各位看友多多支持【关注、点赞、评论、收藏、投币】,助力每一个梦想。

WeiyiGeek Blog's - 花开堪折直须折,莫待无花空折枝 】
作者主页: 【 https://weiyigeek.top
博客地址: 【 https://blog.weiyigeek.top 】
作者答疑学习交流群:欢迎各位志同道合的朋友一起学习交流【点击 👉 加入交流群】, 或者关注公众号回复【学习交流群】。


首发地址(完整的图片显示): https://mp.weixin.qq.com/s/m7yC4S0uzJpaLuxpNCvBxw


0x00 Minio 快速入门

什么是对象存储?

描述: 对象存储(Object Storage)是一种存储数据的计算机体系结构,它以对象的形式存储和管理数据。与传统的文件系统和块存储不同,对象存储将数据作为对象存储在分布式的存储集群中,每个对象都有一个唯一的标识符(通常是一个URL),并且可以通过这个标识符来访问和检索数据。

对象存储特点

  1. 弹性扩展:对象存储可以轻松地扩展存储容量,无需中断服务或重新配置硬件。通过添加更多的存储节点,可以实现无限的存储能力。

  2. 高可靠性:对象存储采用分布式存储架构,数据在多个存储节点上进行冗余备份,以保证数据的可靠性和持久性。

  3. 高性能:对象存储可以提供高并发的数据读写操作,通过并行处理和负载均衡技术,实现快速的数据访问。

  4. 数据管理:对象存储可以对数据进行元数据管理,可以为每个对象添加自定义的元数据信息,方便对数据进行分类、搜索和管理。

  5. 访问控制:对象存储可以实现灵活的访问控制策略,可以根据需要设置不同的权限和访问策略,确保数据的安全性和隐私性。

温馨提示: 当下我们有多种存储设计方案可以进行选择,例如

  • 无中心的存储设计,如 GlusterFS 产品。
  • 有中心的存储设计,如 Hadoop 产品。
  • 基于数据库的存储设计,如 GridFS 和 HBase 产品。
  • 绕过元数据的存储设计,如 FastDFS 产品。
  • 基于对象存储设计,如 Mino 产品。

总结: 对象存储广泛用于云存储、大数据分析、备份和恢复、多媒体内容存储等场景,它提供了高度可靠、高性能、可扩展和经济高效的数据存储解决方案。

本文作者: WeiyiGeek (全栈工程师修炼指南)
作者博客:blog.weiyigeek.top


为什么需要对象存储?

描述:在互联网越来越普及的当下,各种 APP 如雨后春笋。用户通过 APP 可以进行远程办公、查看新闻咨询、理财、社交、教育等等。在上面这些场景中,避免不了需要查看图片、音频、视频。那么问题来了?这些图片、视频、音频是怎样的存储的呢?

传统开发中,我们可以使用 tomcat 类似的服务器进行映射目录实现资源访问(在 server.xml 文件中进行配置)。例如:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">   
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />          
    <!-- 增加的静态资源映射配置 -->
  <Context path="/static" docBase="/usr/local/app/html/" reloadable="true" crossContext="true"></Context>
</Host>

也可以使用 nginx 对静态资源进行代理。例如:

server {
  listen       8080;
  server_name  localhost;
  # charset koi8-r;
  # access_log  logs/host.access.log  main;
  location / {
      root   html; # 代理 html 目录
      index  index.html index.htm;
  }
}

随着 APP 用户量的增加,服务器需要存储海量的图片、音频和视频。此时,再使用上面方式就显得不足了。当然,如果资金充足,可以购买成熟对象存储服务产品,例如:阿里云对象存储 OSS(Object Storage Service)。如果不想购买存储服务产品,则可以自己搭建对象存储服务,MinIO 就是你当下最好的选择。


什么是 MinIO 对象存储?

描述: Minio 是由 GlusterFS 创始人之一的 Anand Babu Periasamy 发布新的开源项目, MinIO 是一种对象存储解决方案,它是一个基于 Go 语言 (跨平台运行)的开源的对象存储系统,专门设计用于云原生和容器化环境,或者部署在任何地方而构建 公共云或私有云、裸机基础架构、编排环境和边缘基础架构。

Minio 提供与亚马逊云科技 S3 兼容的 API,并支持所有核心 S3 功能, 所以也可以看做是S3的开源版本;它允许用户通过简单的 API 接口进行数据的存储和检索,同时提供高度可扩展性和强大的数据保护机制。

MinIo主要是在微服务系统中使用,非常适合于存储大容量非结构化的数据,例如 图片、视频、日志文件、备份数据和容器/虚拟机 镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等,并且其安装配置简单,单行命令可以运行起来; 也可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

温馨提示: MinIO 是在双许可证, GNU Affero 通用公共许可证 v3.0 和 MinIO 商业许可证下发布。

相关概念:

存储桶(Bucket)是对象的载体,可理解为存放对象的 “容器”,且该 “容器” 无容量上限,对象以扁平化结构存放在存储桶中,无文件夹和目录的概念,用户可选择将对象存放到单个或多个存储桶中不能单独存在。

对象(Object)是对象存储的基本单元,可理解为任何格式类型的数据,例如图片、文档和音视频文件等。存储桶(Bucket)是对象的载体,每个存储桶可容纳任意数量的对象。

# 每个对象都由对象键(ObjectKey)、对象值(Value)、和对象元数据(Metadata)组成。
* 对象键(ObjectKey):对象键是对象在存储桶中的唯一标识,可以通俗的理解为文件路径。
* 对象值(Value):即上传的对象本身,可以通俗的理解为文件内容(Object Content)。
* 对象元数据(Metadata):是一组键值对,可以通俗的理解为文件的属性,例如:文件的修改时间、存储类型等,您可以在上传对象后对其进行查询。

MinIO 对象存储有何特点 ?

描述:MinIO 对象存储特点如下所示:

  1. 高可用性:MinIO 支持分布式部署,可以在多个节点上实现数据冗余和负载均衡,从而提供高可用性和容错能力。

  2. 高性能:MinIO 的设计目标是提供快速的数据访问速度。它采用了高度优化的底层存储引擎,并且支持并行读写操作,以满足大规模数据访问的需求。

  3. 可扩展性:MinIO 可以根据实际需求进行水平扩展,用户可以根据数据量的增长来增加节点数量,从而实现存储容量和性能的扩展。

  4. 数据保护:MinIO 提供了多种数据保护机制,包括数据加密、数据完整性校验和故障恢复等。用户可以根据需要选择适当的保护机制来保障数据的安全性和可靠性。

  5. 兼容性:MinIO 兼容 Amazon S3 云存储服务(AWS Signature v2 和 v4) API,这意味着用户可以直接使用现有的 S3 工具和应用程序与 MinIO 进行集成,而无需进行修改。

总之,MinIO 是一个功能强大且易于使用的对象存储系统,适用于各种规模的数据存储和访问需求, 它的开源性质使得用户可以自由地定制和扩展系统,满足特定的业务需求。


0x01 Minio 安装配置

描述: 下述部署操作都是基于单节点Minio且由于处于演示的目录,只采用了一块网络存储卷,若要在中大型的生产环境中,请准备至少4块存储硬盘

Docker 方式部署

描述: 此处假如你已经安装了docker容器运行相关环境,若没有请参考作者公众号《全栈工程师修炼指南》中的Docker入门学习系列文章,关注回复《docker学习》。

首先,创建持久化的目录,打开Shell执行mkdir -vp /app/minio/{data,config}即可。

温馨提示: Minio 持久化数据存储不建议使用网络文件系统卷,有可能导致MinIO无法提供一致性保证,若非要使用NFS网络连接存储的部署,请使用NFSv4以获得最佳效果。

$ mount -l
# 挂载 NFS 时关键参数 vers=4
192.168.1.94:/volume1/storage/ on /app type nfs (rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.94,mountvers=4,mountport=892,mountproto=udp,local_lock=all,addr=192.168.1.94) 

方式1.通过 Docker 一条命令搞定

docker run -d -p 9000:9000 -p 9001:9001 --name minio-server \
-e "MINIO_ROOT_USER=minioadmin" -e "MINIO_ROOT_PASSWORD=weiyigeek.top" \
-v /app/minio/data:/data  -v /app/minio/config:/config \
--restart=always \
quay.io/minio/minio:RELEASE.2023-10-07T15-07-38Z server /data --config-dir=/config --console-address ":9001" --address ":9090"

方式2.通过 Docker-compose 方式, 首先创建 docker-compose.yml 文件

tee docker-compose.yml <<'EOF'
version: '3'
services:
  minio:
    container_name: minio
    image: quay.io/minio/minio:RELEASE.2023-10-07T15-07-38Z
    restart: always
    command: server /data --config-dir=/config --console-address ":9001" --address ":9090"
    ports:
      - 9000:9000
      - 9001:9001
    volumes:
      - /app/minio/data:/data
      - /app/minio/config:/root/.minio
    environment:
      - MINIO_ROOT_USER: admin
      - MINIO_ROOT_PASSWORD: weiyigeek.top
      - MINIO_SERVER_URL: https://minio.weiyigeek.top
      - MINIO_BROWSER_REDIRECT_URL: https://minio.weiyigeek.top/admin/
      - MINIO_BROWSER_SESSION_DURATION: 30m
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
EOF

# 参数&环境变量浅析
--address :指定 minio 监控地址
--console-address :指定 minio console 监控地址
MINIO_ROOT_USER:Minio Console 管理账号
MINIO_ROOT_PASSWORD : Minio Console 管理密码
MINIO_SERVER_URL : 存储桶资源访问路径
MINIO_BROWSER_REDIRECT_URL :Minio Console 管理域名地址
MINIO_BROWSER_SESSION_DURATION :Minio Console 管理页面认证失效时间

# 启动与创建容器 
docker-compose up -d

补充说明:minio-server 可用的环境变量参考[ https://www.minio.org.cn/docs/minio/linux/reference/minio-server/minio-server.html ]

温馨提示: MinIO 可使用纠删码(erasure code)和校验和(check sum)来保护数据免受硬件故障和无声数据损坏, 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据,但是你可能需要准备4块以上的硬盘,分别挂载到minio server服务器中。

# 纠删码限制 (多块硬盘 / 服务)
最大驱动器数量	Unlimited
最小驱动器数量	Unlimited
读仲裁	N / 2
写仲裁	N / 2+1

# 示例演示
$ mkfs.xfs /dev/sdb -L DISK1
$ mkfs.xfs /dev/sdc -L DISK2
$ mkfs.xfs /dev/sdd -L DISK3
$ mkfs.xfs /dev/sde -L DISK4

$ nano /etc/fstab
  # <file system>  <mount point>  <type>  <options>         <dump>  <pass>
  LABEL=DISK1      /mnt/disk1     xfs     defaults,noatime  0       2
  LABEL=DISK2      /mnt/disk2     xfs     defaults,noatime  0       2
  LABEL=DISK3      /mnt/disk3     xfs     defaults,noatime  0       2
  LABEL=DISK4      /mnt/disk4     xfs     defaults,noatime  0       2

docker run -p 9000:9000 -p 9001:9001 --name minio \
  -v /mnt/disk1:/disk1 \
  -v /mnt/disk2:/disk2 \
  -v /mnt/disk3:/disk3 \
  -v /mnt/disk4:/disk4 \
  minio/minio server /disk1 /disk2 /disk3 /disk4 --console-address ":9001" --address ":9090"

Binary 方式部署

描述: 由于 minio 基于 go 语言开发,所以我们可以快速在 Linux 或者 Windows 平台上安装 minio 服务端。

Windows

powershell(new-object System.Net.WebClient).DownloadFile('https://dl.min.io/server/minio/release/windows-amd64/minio.exe','D:\minio.exe')
minio.exe server D:\

Linux

方式1.使用shell终端直接临时启动。

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data /data --console-address ":9001"

方式2.通过系统systemd守护进程启动。

# 配置文件
mkdir -vp /etc/minio/
tee /etc/minio/minio.conf <<'EOF'
# 数据存放目录
MINIO_VOLUMES="/usr/local/minio/data"
# 端口号设置
MINIO_OPTS="--console-address :9001 --address :9000"
# 用户名
MINIO_ROOT_USER="minioadmin"
# 密码
MINIO_ROOT_PASSWORD="blog.weiyigeek.top"
# minio 配置服务固定地址,ip可以更换为自己的ip,不使用下面的设置minio的图片总是默认127.0.0.1。
MINIO_SERVER_URL=http://minio.weiyigeek.top
EOF

# minio systemd 文件
tee /usr/lib/systemd/system/minio.service <<'EOF'
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local
User=root
Group=root
ProtectProc=invisible
EnvironmentFile=-/etc/mini/minio.conf
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
EOF

# 重新加载 systemd 并启动 minio 服务
systemctl daemon-reload && systemctl start minio

Kubernetes 部署

描述: 此处假如你已经安装了 Kubernetes 集群运行环境以及helm工具,若没有请参考作者公众号《全栈工程师修炼指南》中的k8s 入门学习系列文章。

我们知道 Minio 是高性能的并且是对Kubernetes友好的对象存储,所以说在K8S集群中使用Minio可谓是如鱼得水。

Kubectl 方式

Step 1.此处,我使用 kubectl 工具资源清单方式部署 minio (推荐)。

# 创建资源清单存储目录,便于后期恢复。
mkdir -vp /storage/app/monitoring/minio/minio-prometheus/data
tee /storage/app/monitoring/minio/minio-prometheus-deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio-prometheus
  namespace: monitoring
  labels:
    app: minio-prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minio-prometheus
  template:
    metadata:
      labels:
        app: minio-prometheus
    spec:
      imagePullSecrets: 
      - name: harbor-cloud
      nodeSelector:
        node: app
      containers:
      - image: quay.io/minio/minio:RELEASE.2023-10-07T15-07-38Z
        name: mimir
        command:
        - /bin/bash
        - -c
        args: 
        - minio server /minio/data --console-address :9090 --address :9000
        env:
        - name: MINIO_BROWSER_REDIRECT_URL
          value: https://minio.weiyigeek.top/admin/
        - name: MINIO_BROWSER_SESSION_DURATION
          value: 30m
        - name: MINIO_SERVER_URL
          value: https://minio.weiyigeek.top
        ports:
        - containerPort: 9000
          protocol: TCP
          name: http
        - containerPort: 9090
          protocol: TCP
          name: console
        volumeMounts:
        - name: data
          mountPath: "/minio/data"
        resources:
          requests:
            cpu: 2
            memory: 1Gi
          limits:
            cpu: 6
            memory: 4Gi
      volumes:
      - name: data
        hostPath: 
          type: DirectoryOrCreate
          path:  /storage/app/monitoring/minio/minio-prometheus/data
---
apiVersion: v1
kind: Service
metadata:
  name: minio-prometheus
  namespace: monitoring
  labels:
    app: minio-prometheus
spec:
  selector:
    app: minio-prometheus
  type: ClusterIP
  ports:
  - name: http
    port: 9000
    targetPort: http
  - name: console
    port: 9090
    targetPort: console
EOF

# 部署 minio 资源清单
kubectl apply -f /storage/app/monitoring/minio/minio-prometheus-deployment.yaml  
  # deployment.apps/minio-prometheus created
  # service/minio-prometheus created

Step 2.验证 minio server 相关资源部署情况.

$ kubectl get deployments.apps,svc,pod -n monitoring -l app=minio-prometheus
  # NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
  # deployment.apps/minio-prometheus   1/1     1            1           6s
  
  # NAME                       TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)              AGE
  # service/minio-prometheus   ClusterIP   10.96.172.22   <none>        9000/TCP,9090/TCP   18m
  
  # NAME                                    READY   STATUS    RESTARTS   AGE
  # pod/minio-prometheus-5f4b49bf65-pbvlb   1/1     Running   0          6s

Step 3.创建 ingress 访问入口,若未安装的Ingress的同学请参考《从零开始:新手快速在国产操作系统中搭建高可用K8S(V1.28)集群落地实践》,此处为了通过 minio.weiyigeek.top 域名访问minio存储的文件,以及管理minio而设置。

# 使用for关键字为多个名称空间,创建 tls 类型的 secret 以供 ingress 控制器设置 tls 使用
for i in "ingress-nginx" "logging" "monitoring";do
  echo $i
  kubectl create secret tls ssl-weiyigeek-top --key=2023.weiyigeek.top.key --cert=2023.weiyigeek.top.pem --namespace $i
  echo .
done

# 根域名
kubectl create ingress minio-prometheus-bucket-weiyigeek --class=nginx --rule="minio.weiyigeek.top/*=minio-prometheus:9000,tls=ssl-weiyigeek-top" --namespace monitoring
ingress.networking.k8s.io/minio-prometheus-bucket-weiyigeek created

# 根域名/子目录 来访问 minio 的管理后台
echo '
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minio-prometheus-weiyigeek
  namespace: monitoring
  annotations:
    nginn.ingress.kubernetes.io/proxy-body-size: 50m
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - host: minio.weiyigeek.top
    http:
      paths:
      - backend:
          service:
            name: minio-prometheus
            port:
              number: 9090
        path: /admin(/|$)(.*)
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - minio.weiyigeek.top
    secretName: ssl-weiyigeek-cn
' | kubectl apply -f -

  # ingress.networking.k8s.io/minio-prometheus-weiyigeek created


# 查看创建的 ingress 
kubectl get ingress -n monitoring minio-prometheus-weiyigeek
  NAME                    CLASS   HOSTS            ADDRESS   PORTS     AGE
  minio-prometheus-weiyigeek   nginx   minio.weiyigeek.top             80, 443   22s

知识扩展: Ingress-Nginx 是一个常用的 Ingress 控制器,它支持多种 pathType 类型来定义 Ingress 路径。以下是几种常见的 pathType 类型介绍:

  1. Exact(默认):使用 pathType: Exact 可以精确匹配 Ingress 路径。例如,如果 Ingress 定义了 /foo 的路径,则只有完全匹配 /foo 的请求才会被路由到该 Ingress。

  2. Prefix:使用 pathType: Prefix 可以前缀匹配 Ingress 路径。例如,如果 Ingress 定义了 /foo 的路径,则所有以 /foo 开头的请求都会被路由到该 Ingress。

  3. ImplementationSpecific:使用 pathType: ImplementationSpecific 可以根据不同的 Ingress 控制器进行不同的路径匹配方式,具体的实现方式由不同的控制器决定。


Step 4.设置企业内部DNS服务器,以及 Kubernetes集群中 kube-coredns 添加 hosts 插件。

# Post "https://minio.weiyigeek.top/": dial tcp 10.96.0.10: nslookup no record
kubernetes cluster.src in-addr.arpa ip6.arpa {
  pods insecure
  fallthrough in-addr.arpa ip6.arpa
  ttl 30
}
hosts {
  10.10.10.5 minio.weiyigeek.top
  10.10.10.4 minio.weiyigeek.top
  fallthrough in-addr.arpa ip6.arpa
}

# 重启集群 coredns pod
kubectl delete pod -n kube-system coredns-6554b8b87f-bmzgl
kubectl delete pod -n kube-system coredns-6554b8b87f-42c6m

温馨提示: 若需要在企业中快速搭建内部DNS服务器,请参考《Ops实践 | 国产化KylinOS系统中快速部署企业内部高性能DNS服务器、时间同步服务器 (精选)


Step 5.通过浏览器访问 ingress-nginx 控制器入口 [ https://minio.weiyigeek.top/admin/ ],即可登录 minio console 控制台, 其默认账号密码为minioadmin:minioadmin


Step 6.成功登陆 Minio Console 后点击【Monitoring】查看 minio 存储服务器相关资源信息,至此Minio Server 在 K8S 中安装完毕。


Helm 方式

描述:Helm 是一种工具,用于将应用程序自动部署到 Kubernetes 集群。 Helm图 是一组定义部署细节的 YAML 文件、模板和其他文件。

  • 方法1.使用 helm 工具快速部署 单节点 minio ,并且 minio 镜像版本过低 (不推荐)。
# 添加 minio 的 helm 源
$ helm repo add minio https://helm.min.io/

# 查询版本
helm search repo minio/minio -l

# 下载指定版本并解压
$ helm pull minio/minio --untar --version 8.0.10
$ cd minio

# 根据需求进行更改 values.yaml
$ vim values.yaml
resources:
  requests:
    memory: 512Mi

# 使用 helm 部署
$ helm install minio \
  --namespace minio --create-namespace \
  --set accessKey=minio,secretKey=blog.weiyigeek.top \
  --set mode=distributed \
  --set replicas=4 \
  --set service.type=NodePort \
  --set persistence.enabled=true \
  --set persistence.storageClass=nfs-storage \
  --set persistence.size=500Gi \
  -f values.yaml minio/minio

方法2.使用 Minio 官方推荐的 Deploy Operator With Helm 方式将 MinIO Kubernetes operator 安装到 Kubernetes 集群中。。

# 提前下载镜像
crictl pull quay.io/minio/operator:v5.0.9

# 下载 helm 资源清单
curl -O https://raw.githubusercontent.com/minio/operator/master/helm-releases/operator-5.0.9.tgz
tar -zxf operator-5.0.9.tgz

# 自定义修改 minio-operator 的 helm 安装参数 values.yaml 文件
vim ./operator/values.yaml

# 通过 helm 安装 minio-operator
helm install minio-operator  ./mimir-distributed/ --namespace monitoring --debug --set global.clusterDomain=cluster.sec,mimir.structuredConfig.limits.compactor_blocks_retention_period=14d,minio.persistence.size=256Gi
  # install.go:200: [debug] Original chart version: ""
  # install.go:217: [debug] CHART PATH: /root/k8s/soft/grafana/mimir/mimir-distributed

# 修改 Service 服务清单
kubectl get service console -n monitoring -o yaml > service.yaml
yq e -i '.spec.type="NodePort"' service.yaml
yq e -i '.spec.ports[0].nodePort = PORT_NUMBER' service.yaml


# 修改 minio-operator 副本数
kubectl get deployment minio-operator -n minio-operator -o yaml > operator.yaml
yq -i -e '.spec.replicas |= 1' operator.yaml


# 创建 JSON Web 令牌 (JWT) 令牌
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: console-sa-secret
  namespace: monitoring
  annotations:
    kubernetes.io/service-account.name: console-sa
type: kubernetes.io/service-account-token
EOF

kubectl apply -f service.yaml
kubectl apply -f operator.yaml
kubectl apply -f console-secret.yaml

  
# 查看部署情况
helm -n monitoring ls
  # NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
  # minio-operator  monitoring      1               2023-10-08 11:27:37.000764118 +0800 CST deployed        operator-5.0.9  v5.0.9
helm -n monitoring status minio-operator
  # NAME: minio-operator
  # LAST DEPLOYED: Sun Oct  8 11:27:37 2023
  # NAMESPACE: monitoring
  # STATUS: deployed
  # REVISION: 1
  # TEST SUITE: None

# 获取操作员控制台使用 JWT 进行身份验证和登录
kubectl -n monitoring  get secret console-sa-secret -o jsonpath="{.data.token}" | base64 --decode

此后,你便可以通过使用 操作员控制台 或 Helm 部署 MinIO 租户即(存储桶服务端)。


主机防火墙规则配置

描述: 在安装好Minio后可能由于防火墙限制的原因,我们不能正常的访问 Minio 此时可以通过以下命令将所有传入流量启用到范围从9000到9010的端口。

# ufw 命令
ufw allow 9000:9010/tcp

# firewall-cmd 命令
firewall-cmd --zone=public --add-port=9000-9010/tcp --permanent
firewall-cmd --reload

# iptables 命令
iptables -A INPUT -p tcp --dport 9000:9010 -j ACCEPT
service iptables restart


0x02 Minio Console 简单使用

描述: 在安装部署完 Minio Server 后,我们可通过设置的 console 端口 或者代理转发端口进行访问,此处由于作者是在K8S集群中安装 Minio 服务端,然后使用 ingress-nginx 入口控制器进行代理访问 Minio Console 管理端(配置看最上方),此处仍然通过浏览器访问 https://minio.weiyigeek.top/admin/ 使用默认账号密码登录。

温馨提示: minio 安装缺省认证密码为 'minioadmin:minioadmin', 如果想要改变此值请自行设置 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' 环境变量即可。

env:
- name: MINIO_ROOT_USER
  value: admin
- name: MINIO_ROOT_PASSWORD
  value: blog.weiyigeek.top

根据需要创建一个 Access Key ,此处为 Minio 随机生成 Access 与 Secret Key的我们不用去管他。

然后创建一个 Bucket (桶) ,此处我创建了一个 test 的桶,权限可读、可写。

我们可以直接通过后台上传文件到 test 桶中,在实践环境中我们通常是通过API接口进行相关资源的上传。

此处,我们分享上传的文件并设置分享时间,然后将此连接发送给需要的人即可,可以看到此处共享的连接是https://minio.weiyigeek.top 而非 127.0.0.1,这是由于我们在部署时设置了 MINIO_SERVER_URL 变量。

至此,Minio 安装与简单使用实践完毕!


0x03 MinIO Client (mc 命令) 入门指南

描述: MinIO Client (mc)是Minio提供访问和操作服务端的客户端工具。它可以使用 ls,cat,cp,mirror,diff,find 等UNIX命令提供了一种替代方案, 它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。

参考地址: https://min.io/docs/minio/linux/reference/minio-mc.html

安装 mc 工具

描述: 我们可根据运行平台选择使用多种方式来安装mc,此处作者推荐使用 docker 或者 二进制文件(GNU/Linux)来安装,当然你也可以选择其他方式,请自行官网此处不再累述。

# Docker 方式
$ docker pull minio/mc
$ docker run minio/mc ls play

# Binary 方式
curl https://dl.min.io/client/mc/release/linux-amd64/mc \
  --create-dirs \
  -o /usr/local/bin
chmod +x /usr/local/bin/mc 

# 补充: Windows 平台下获取安装
powershell(new-object System.Net.WebClient).DownloadFile('http://dl.minio.org.cn/client/mc/release/windows-amd64/mc.exe','D:\mc.exe')

使用 mc 命令

描述: MinIO (mc)客户端快速入门指南常用的子命令快速接介绍。

在命令行直接输入 mc 命令,查看 mc 命令的语法和帮助。命令如下:

alias      在配置文件中设置、删除和列出别名
ls         列出存储桶和对象
mb         创建一个存储桶
rb         删除一个存储桶
cp         复制对象
mirror     将对象同步到远程站点
cat        显示对象内容
head       显示对象的前 “n” 行
pipe       将 STDIN 流传输到对象
share      生成临时访问对象的 URL
find       搜索对象
sql        对对象运行 sql 查询
stat       显示对象元数据
mv         移动对象
tree       使用树形状的格式显示存储桶和对象
du         递归统计磁盘使用情况
retention  为对象设置持有
legalhold  管理对象的合法持有
diff       列出两个存储桶之间对象名称、大小和日期的差异
rm         删除对象
version    管理存储桶版本控制
ilm        管理存储桶生命周期
encrypt    管理存储桶加密配置
event      管理对象通知
watch      监听对象通知事件
undo       撤消 PUT/DELETE 操作
policy     管理对存储桶和对象的匿名访问
tag        管理存储桶和对象的标签
replicate  配置服务器端存储桶复制
admin      管理 MinIO 服务器
update     将 mc 更新到最新版本
ping       存活检测
od         测量单流上传和下载
batch      管理批处理作业

config - 管理mc配置文件

语法参数:

# 语法
mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> [--api API-SIGNATURE]

# 参数
ALIAS 别名就是给你的云存储服务起了一个短点的外号。
YOUR-S3-ENDPOINT 云存储的主机和端口,如:http://127.0.0.1:9000
YOUR-ACCESS-KEY 云存储服务的 Access Key
YOUR-SECRET-KEY 云存储服务的 Secret Key
API-SIGNATURE API签名是可选参数,默认情况下它被设置为 "S3v4"

示例演示:

  • 示例1.添加删除云存储服务配置
# 方式1.minio 是 minio server 给的名字,url 是 endpoint,minioadmin 是用户名,密码。
$ mc config host add minio http://127.0.0.1:9000 minioadmin minioadmin

# 方式2.使用 Access、SECRET Key 进行验证。
mc config host add minio http://minio.monitoring.svc.cluster.sec:9000 dBb7Qdq***tDCwLOwoiX X39nBC7bU***bzUPb3NQnrqaK --api s3v4
  # Added `minio` successfully.

# 删除名为 minio的 HOST 配置
mc config host remove minio
  # Removed `minio` successfully.

  • 示例2.查看云存储服务配置
# 查看本地的云存储服务器或者配置文件
$ mc config host list
$ grep -A 5 "minio" ~/.mc/config.json
  # "minio": {
  #   "url": "http://minio.monitoring.svc.cluster.sec:9000",
  #   "accessKey": "dBb7Qd***wLOwoiX",
  #   "secretKey": "X39nBC7b****Pb3NQnrqaK",
  #   "api": "s3v4",
  #   "path": "auto"
  # },

  • 示例3.获取 Minio Server 指定键值。
mc admin config get minio-prometheus/ compression
  # compression enable=off allow_encryption=off extensions=.txt,.log,.csv,.json,.tar,.xml,.bin mime_types=text/*,application/json,application/xml,binary/octet-stream

mb、rb - 创建/删除一个存储桶或一个文件夹

示例演示:

  • 示例1.在minio存储服务器中创建、删除一个新的桶bucket。
# minio/test 是在 minio 下创建一个叫做 test 的 bucket
$ mc mb minio/test
# 递归创建存储桶
$ mc mb minio/test
# 在区域 “zh-west” 的 MinIO 存储服务上创建一个新存储桶 test。
mc mb --region=zh-west minio/test

# 删除没有文件的bucket
$ mc rb minio/test
# 删除有文件的bucket
$ mc rb minio/test --force

ls - 查看存储桶中存储的文件有文件夹

示例演示:

# 查看创建的桶以及文件
mc ls minio/
  # [2023-10-09 11:45:58 CST]     0B test/
mc ls minio/test
  # [2023-10-09 12:05:06 CST]  13KiB STANDARD OIP-C.jfif

# 递归查看桶中目录中所有文件
mc ls --recursive minio/images

# 使用 --json 参数启用 JSON 格式的输出
mc --json ls minio

cat|head、rm、mv - 显示、删除、移动文件或目录

示例演示:

# 使用 mc cat 命令查看本地文件系统文件的内容(通常不会如此使用)。
mc cat ./students.csv
# 查看本地 MinIO 服务中 files 存储桶中的 students.csv 文件内容。
mc cat local/files/students.csv

# 将多个文件连接为一个文件
mc cat part.* > students.txt

# 查看本地文件或者Mino 存储桶前 3 行内容
mc head -n 3 ./students.csv
mc head -n 3 local/files/students.csv

# 将对象列表从本地文件系统移动到 Amazon S3 云存储。
mc mv Music/*.ogg s3/jukebox/
# 将多个本地文件夹递归移动到 MinIO 云存储。
mc mv --recursive backup/2022/ backup/2023/ play/archive/

# 删除文件
$ mc rm minio/test/OIP-C.jfif
# 删除目录
$ mc rm minio/test/dir --recursive --force

admin - 控制台配置与查询

示例演示:

  • 示例1.指定 minio 云存储服务查询
mc admin info minio/
  # ●  minio.monitoring.svc.cluster.sec:9000
  #    Uptime: 2 hours
  #    Version: 2023-10-07T15:07:38Z
  #    Network: 1/1 OK
  #    Drives: 1/1 OK
  #    Pool: 1
  # Pools:
  #    1st, Erasure sets: 1, Drives per erasure set: 1
  # 13 KiB Used, 1 Bucket, 1 Object
  # 1 drive online, 0 drives offline
  • 示例2.创建和管理 MinIO 用户, 在 mc admin user 命令提供了8中子命令对 MinIO 的用户信息进行管理,分别如下:
mc admin user add	添加一个新用户
mc admin user disable	禁用用户
mc admin user enable	启用用户
mc admin user remove	删除用户
mc admin user list	列出所有用户
mc admin user info	显示某一个用户信息
mc admin user policy	以 JSON 格式导出用户策略
mc admin user svcacct	管理服务帐户

cp - 文件拷贝与上传

示例演示:

# 上传文件 blog.weiyigeek.top.png 文件到 minio/test 桶的根目录中。
mc cp blog.weiyigeek.top.png minio/test

# 以递归方式将本地文件夹复制到本地 MinIO 服务的 images/test 存储桶
mc cp --recursive wallpaper /minio/images/test

# 递归复制多个本地文件夹到本地 MinIO 存储服务。
mc cp --recursive backup/2022/ backup/2023/ play/archive/

# 以递归方式将文件夹从 MinIO 云存储复制到 Amazon S3 云存储。
mc cp --recursive play/archive/2023/ s3/mybucket/

mirror - 同步对象
描述: 使用 mc mirror 命令将对象同步到远程站点。

示例演示:

# 递归地将本地文件夹同步到本地别名为 local 的 MinIO 服务的 images/wallpaper 存储桶中。
mc mirror wallpaper local/images/wallpaper

# 将 MinIO 的 photos/2022 存储桶同步到 Amazon S3 云存储的 backup-photos 存储桶
mc mirror play/photos/2022 s3/backup-photos

policy(anonymous) - 设置存储桶的访问策略

示例演示:

# 1.设置公共访问权限
mc anonymous set public data/tdsms

# 2.列举存储桶访问的权限
mc anonymous list data/tdsms

alias - 创建设置别名

示例演示:

# 创建对应于MinIO部署的新别名, 指定MinIO Server API块中的任何主机名或IP地址,例如 http://localhost:9000.
mc alias set minio-prometheus http://minio-prometheus.monitoring.svc.cluster.sec:9000  minioadmin minioadmin

0x0n Minio 实践应用指南

使用 S3 (Minio) 进行 Gitlab Runner 缓存配置 : https://docs.gitlab.com/runner/install/kubernetes.html#using-cache-with-configuration-template

"Minio 入门到进阶指南" : https://www.hxstrive.com/subject/minio/581.htm


首发地址: https://mp.weixin.qq.com/s/m7yC4S0uzJpaLuxpNCvBxw

原文地址: https://blog.weiyigeek.top/2020/3-22-644.html

本文至此完毕,更多技术文章,尽情期待下一章节!


专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注,转个发,留个言】(人间六大情),这将对我的肯定,谢谢!。

点击 👉 关注「 全栈工程师修炼指南」公众号
微信沟通交流: weiyigeeker (点击添加)
交流沟通群:629184198 或 关注公众号回复【学习交流群】

温馨提示: 由于作者水平有限,本章错漏缺点在所难免,希望读者批评指正,并请在文章末尾留下您宝贵的经验知识,联系邮箱地址 [email protected] 或者关注公众号 WeiyiGeek 联系我。