第二章:安装部署

详细讲解 MinIO 的多种安装方式,包括二进制安装、Docker 部署和 Kubernetes 部署。

最后更新: 2024-01-15
页面目录

第二章:安装部署

2.1 系统要求

2.1.1 硬件要求

组件 最低配置 推荐配置
CPU 2 核 8 核以上
内存 4 GB 16 GB 以上
磁盘 100 GB 1 TB+ NVMe SSD
网络 千兆 万兆

2.1.2 软件要求

  • 操作系统:Linux (推荐)、macOS、Windows
  • 架构:x86_64, ARM64
  • 依赖:无(单二进制文件)

2.2 二进制安装

2.2.1 下载 MinIO

# 下载最新版本
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

# 下载 MinIO Client
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# 验证安装
minio --version
mc --version

2.2.2 启动 MinIO(单机)

# 创建数据目录
sudo mkdir -p /data/minio

# 启动 MinIO
minio server /data/minio --console-address ":9001"

# 后台运行
nohup minio server /data/minio --console-address ":9001" \
  > /var/log/minio.log 2>&1 &

# 使用 systemd 管理
sudo useradd -r minio-user -s /sbin/nologin
sudo chown -R minio-user:minio-user /data/minio

2.2.3 systemd 服务配置

# /etc/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target

[Service]
User=minio-user
Group=minio-user
ExecStart=/usr/local/bin/minio server /data/minio --console-address ":9001"
Restart=always
RestartSec=10

# 环境配置
Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=your-strong-password"

# 资源限制
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio
sudo systemctl status minio

2.3 Docker 部署

2.3.1 Docker 单机部署

# 拉取镜像
docker pull minio/minio:latest

# 启动 MinIO
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=password123" \
  -v /data/minio:/data \
  minio/minio server /data --console-address ":9001"

# 查看日志
docker logs -f minio

# 访问
# API: http://localhost:9000
# Console: http://localhost:9001

2.3.2 Docker Compose 单机部署

# docker-compose.yml
version: '3.8'

services:
  minio:
    image: minio/minio:latest
    container_name: minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: password123
    volumes:
      - minio-data:/data
    command: server /data --console-address ":9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    restart: unless-stopped

volumes:
  minio-data:
docker-compose up -d
docker-compose logs -f minio

2.4 分布式部署

2.4.1 分布式架构

┌─────────────────────────────────────────────────────────┐
│              MinIO Distributed Cluster                   │
│                    (8 节点, 纠删码模式)                   │
├─────────────────────────────────────────────────────────┤
│                                                          │
│  Node 1        Node 2        Node 3        Node 4       │
│  ┌────────┐    ┌────────┐    ┌────────┐    ┌────────┐   │
│  │Disk 1  │    │Disk 2  │    │Disk 3  │    │Disk 4  │   │
│  │Disk 2  │    │Disk 3  │    │Disk 4  │    │Disk 1  │   │
│  └────────┘    └────────┘    └────────┘    └────────┘   │
│                                                          │
│  Node 5        Node 6        Node 7        Node 8       │
│  ┌────────┐    ┌────────┐    ┌────────┐    ┌────────┐   │
│  │Disk 4  │    │Disk 1  │    │Disk 2  │    │Disk 3  │   │
│  └────────┘    └────────┘    └────────┘    └────────┘   │
│                                                          │
└─────────────────────────────────────────────────────────┘

2.4.2 分布式启动脚本

#!/bin/bash
# start-distributed-minio.sh

export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=password123

minio server \
  http://node{1...4}:9000/data/minio{1...2} \
  http://node{5...8}:9000/data/minio{1...2}

2.4.3 Docker Compose 分布式部署

# docker-compose-distributed.yml
version: '3.8'

services:
  minio1:
    image: minio/minio:latest
    container_name: minio1
    hostname: minio1
    ports:
      - "9001:9000"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: password123
    volumes:
      - minio1-data:/data/minio
    command: server http://minio{1...4}/data/minio --console-address ":9000"
    networks:
      minio-net:
        ipv4_address: 172.20.0.11

  minio2:
    image: minio/minio:latest
    container_name: minio2
    hostname: minio2
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: password123
    volumes:
      - minio2-data:/data/minio
    command: server http://minio{1...4}/data/minio --console-address ":9000"
    networks:
      minio-net:
        ipv4_address: 172.20.0.12

  minio3:
    image: minio/minio:latest
    container_name: minio3
    hostname: minio3
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: password123
    volumes:
      - minio3-data:/data/minio
    command: server http://minio{1...4}/data/minio --console-address ":9000"
    networks:
      minio-net:
        ipv4_address: 172.20.0.13

  minio4:
    image: minio/minio:latest
    container_name: minio4
    hostname: minio4
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: password123
    volumes:
      - minio4-data:/data/minio
    command: server http://minio{1...4}/data/minio --console-address ":9000"
    networks:
      minio-net:
        ipv4_address: 172.20.0.14

networks:
  minio-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24

volumes:
  minio1-data:
  minio2-data:
  minio3-data:
  minio4-data:

2.5 Kubernetes 部署

2.5.1 使用 Operator 部署

# 安装 MinIO Operator
kubectl apply -k https://github.com/minio/operator?ref=master

# 检查 Operator 状态
kubectl get pods -n minio-operator

2.5.2 创建 Tenant

# minio-tenant.yaml
apiVersion: minio.min.io/v4
kind: Tenant
metadata:
  name: minio-tenant
  namespace: minio-tenant-ns
spec:
  image: minio/minio:RELEASE.2024-01-16T16-07-38Z
  pools:
    - servers: 4
      volumesPerServer: 4
      volumeClaimTemplate:
        metadata:
          name: data
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 10Gi
  credsSecret:
    name: minio-creds
  exposeServices:
    console: true
    minio: true
  serviceAccountName: minio-sa
---
apiVersion: v1
kind: Namespace
metadata:
  name: minio-tenant-ns
---
apiVersion: v1
kind: Secret
metadata:
  name: minio-creds
  namespace: minio-tenant-ns
type: Opaque
stringData:
  rootUser: admin
  rootPassword: password123
kubectl apply -f minio-tenant.yaml
kubectl get tenant -n minio-tenant-ns

2.6 环境变量配置

变量 说明 示例
MINIO_ROOT_USER 访问密钥 admin
MINIO_ROOT_PASSWORD 秘密密钥 password
MINIO_REGION_NAME 区域名称 us-east-1
MINIO_CACHE_DRIVES 缓存盘 /mnt/cache1,/mnt/cache2
MINIO_CACHE_EXCLUDE 缓存排除 .pdf,mybucket/
MINIO_CACHE_QUOTA 缓存配额 80
MINIO_STORAGE_CLASS_STANDARD 存储类别 EC:2
MINIO_IDENTITY_OPENID OIDC 配置
MINIO_IDENTITY_LDAP LDAP 配置

2.7 常用运维命令

# 查看版本
minio --version

# 查看健康状态
curl http://localhost:9000/minio/health/live

# 查看集群信息
curl http://localhost:9000/minio/v2/info | jq

# 重启服务
sudo systemctl restart minio

# 查看日志
sudo journalctl -u minio -f

2.8 总结

本章介绍了 MinIO 的多种安装部署方式,包括二进制安装、Docker 部署和 Kubernetes 部署。生产环境推荐使用分布式部署以获得高可用性。下一章将学习 MinIO 的快速入门操作。