docker-compose一键实现本机minio分布式集群部署,并实现traekfix的代理

docker-compose快速实现本机minio分布式集群部署,并使用traefik代理暴露统一api端口

条件

  1. 安装 Docker:在使用 Docker Compose 之前,需要先安装 Docker。Docker 是一个开源的容器化平台,用于构建、发布和运行应用程序。你需要在你的机器上安装 Docker,并确保 Docker 已经正确配置和运行。
  2. 安装 Docker Compose:Docker Compose 是一个独立于 Docker 的工具,用于定义和运行多个 Docker 容器的应用程序。你需要安装 Docker Compose,以便在本地或远程机器上创建和管理多个容器。

traefik

Architecture

Traefik 是一种流行的开源反向代理和负载均衡器,广泛用于容器化环境。它提供了多种优势和功能,使其成为管理传入流量并将其路由到微服务或应用程序的热门选择。以下是常用Traefik的一些原因:

  1. 动态配置:Traefik 提供动态服务的配置和发现。它与 Docker、Kubernetes 和 Swarm 等容器编排器无缝集成,并且可以在部署或删除新服务时自动检测它们。这种动态配置消除了手动更新的需要,并使扩展和管理基础结构变得更加容易。
  2. 负载平衡:Traefik 提供内置的负载平衡功能。它将传入流量分布到应用程序或服务的多个实例之间,从而提高整体性能、可伸缩性和可靠性。Traefik 支持各种负载平衡算法,包括轮询、最少连接和 IP 哈希。
  3. **自动 SSL/TLS:**Traefik 简化了 SSL/TLS 证书的管理。它可以为您的服务自动获取和续订Let’s Encrypt SSL证书,确保客户端和服务器之间的安全通信,而无需手动证书管理。此功能可节省保护应用程序的时间和精力。
  4. 流量路由和中间件:Traefik 提供强大的流量路由功能,并支持基于主机、路径、标头等请求属性的各种路由规则。它还支持中间件,允许您向服务添加其他功能,如身份验证、速率限制、请求重写等。这种灵活性使您能够自定义和控制流量以满足您的特定要求。
  5. 监控和指标:Traefik 提供内置的监控和指标功能。它提供了一个基于 Web 的仪表板和一个 API,用于监视服务的运行状况和性能。此外,Traefik 可以与流行的监控系统(如 Prometheus、InfluxDB 和 Grafana)集成,使您能够收集和可视化有关基础架构的详细指标。
  6. 社区和生态系统:Traefik 拥有一个庞大而活跃的用户和贡献者社区。这是一个不断发展和改进的开源项目。社区提供支持、文档以及众多插件和扩展,以增强 Traefik 的功能并与其他工具集成。

快速开始

  1. 编写docker-compose.yaml文件
version: '3.7'

# Create the network
networks:
  traefik-network:

# Configure Traefik
services:
  traefik:
    image: traefik:v2.4
    command:
      - "--providers.docker=true"
      - "--entrypoints.http.address=:80"
      - "--entrypoints.minio-api.address=:7878"
      - "--api=true"  # 启用Traefik的API
      - "--api.insecure=true"# 启用Traefik的Web UI
      - "--providers.docker"
    ports:
      - "8080:8080"  # Traefik dashboard
      - "80:80"
      - "7878:7878"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    networks:
      - traefik-network

  # Minio services
  minio1:
    image: minio/minio
    command: server --console-address ":9001" http://minio{1...4}/data
    ports:
      - "9001:9001"

    volumes:
      - ./data/minio/data1:/data
    networks:
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minio.rule=Host(`localhost`)"
      - "traefik.http.routers.minio.entrypoints=minio-api" # 修改 entrypoint 为 api
      - "traefik.http.services.minio.loadbalancer.server.port=9000" # 修改端口号为 MinIO 的 S3 API 端口号
      - "traefik.http.services.minio.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio.loadbalancer.passhostheader=true"

  minio2:
    image: minio/minio
    command: server --console-address ":9001" http://minio{1...4}/data

    ports:
      - "9002:9001"

    volumes:
      - ./data/minio/data2:/data
    networks:
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minio.rule=Host(`localhost`)"
      - "traefik.http.routers.minio.entrypoints=minio-api"
      - "traefik.http.services.minio.loadbalancer.server.port=9000"
      - "traefik.http.services.minio.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio.loadbalancer.passhostheader=true"

  minio3:
    image: minio/minio
    command: server --console-address ":9001" http://minio{1...4}/data
    ports:
      - "9003:9001"

    volumes:
      - ./data/minio/data3:/data
    networks:
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minio.rule=Host(`localhost`)"
      - "traefik.http.routers.minio.entrypoints=minio-api"
      - "traefik.http.services.minio.loadbalancer.server.port=9000"
      - "traefik.http.services.minio.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio.loadbalancer.passhostheader=true"


  minio4:
    image: minio/minio
    command: server --console-address ":9001" http://minio{1...4}/data
    ports:
      - "9004:9001"

    volumes:
      - ./data/minio/data4:/data
    networks:
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minio.rule=Host(`localhost`)"
      - "traefik.http.routers.minio.entrypoints=minio-api"
      - "traefik.http.services.minio.loadbalancer.server.port=9000"
      - "traefik.http.services.minio.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio.loadbalancer.passhostheader=true"




  1. 下面我将一一讲解这个yaml内容:
networks:
  traefik-network:

定义一个调用的网络,该网络将用于连接服务。traefik-network

services:
  traefik:
    image: traefik:v2.4
    command:
      - "--providers.docker=true"
      - "--entrypoints.http.address=:80"
      - "--entrypoints.minio-api.address=:7878"
      - "--api=true"  # 启用Traefik的API
      - "--api.insecure=true"# 启用Traefik的Web UI
      - "--providers.docker"
    ports:
      - "8080:8080"  # Traefik dashboard
      - "80:80"
      - "7878:7878"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    networks:
      - traefik-network

指定 Traefik 的命令行参数。它将 Traefik 配置为在端口 7878上侦听 API,并为 API 和 Web UI 启用不安全模式。7878端口就是minio统一api的调用端口,8080是traefik的web UI 端口。这里的7878端口你想换成什么都行,如何你还需要其他的, 可以参考下面配置:

services:
  traefik:
    image: traefik:v2.4
    command:
      - "--providers.docker=true"
      - "--entrypoints.http.address=:80"
      - "--entrypoints.minio-api.address=:7878"
      - "--entrypoints.{启个名字}.address=:{你想暴露的端口}"
      - "--api=true"  # 启用Traefik的API
      - "--api.insecure=true"# 启用Traefik的Web UI
      - "--providers.docker"
    ports:
      - "8080:8080"  # Traefik dashboard
      - "80:80"
      - "7878:7878"
      - "{你想暴露的端口}:{你想暴露的端口}
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    networks:
      - traefik-network

  # Minio services
  minio1:
    image: minio/minio
    command: server --console-address ":9001" http://minio{1...4}/data
    ports:
      - "9001:9001"

    volumes:
      - ./data/minio/data1:/data
    networks:
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minio.rule=Host(`localhost`)"
      - "traefik.http.routers.minio.entrypoints=minio-api" # 修改 entrypoint 为 api
      - "traefik.http.services.minio.loadbalancer.server.port=9000" # 修改端口号为 MinIO 的 S3 API 端口号
      - "traefik.http.services.minio.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio.loadbalancer.passhostheader=true"

command:该命令启动 Minio 服务器并将控制台地址设置为端口 9001。

ports:该部分将容器的端口 9001 映射到主机的端口 9001,9001是minio的web UI

volumes``/data``/data:该节将主机上的目录挂载到容器内的目录。每个 Minio 服务都有一个映射到容器目录的不同主机目录。

networks``traefik-network:该部分将 Minio 服务连接到 .

labels该部分包含 Traefik 配置的各种标签。这些标签使 Traefik 能够根据定义的规则和配置将传入请求路由到 Minio 服务。

  • traefik.enable=true: 表示启用 Traefik 反向代理。
  • traefik.http.routers.minio1.rule=Host('localhost'): 表示配置 minio1 服务的路由规则,当请求的 Host 为 localhost 时,将请求转发到该服务。minio 是指在定义的服务名,这个服务名很重要,你要实现负载均衡就得用同一个服务名
  • traefik.http.routers.minio.entrypoints=api: 表示配置路由的入口点为 minio-api,因为在 Traefik 的配置中,我们已经设置了 minio-api 的入口点地址为 :7878,所以将路由的入口点也设置为 minio-api
  • traefik.http.services.minio.loadbalancer.server.port=9000: 表示定义负载均衡器所使用的端口号,这里设置为 MinIO 的 S3 API 端口号,这里的端口号是在容器内的端口号,我要使用minio容器里面的9000 S3 API 端口号,就设置9000。
  • traefik.http.services.minio.loadbalancer.server.scheme=http: 表示设置负载均衡器使用的协议为 http。注:不填也可以,会默认
  • traefik.http.services.minio.loadbalancer.passhostheader=true: 表示在负载均衡时,将请求的 Host 头部信息一并转发给后端服务,以确保服务能够正确处理请求。

至于minio2,3,4模仿1就可以了

Traefik UI

然后我们docker-compose启动,访问8080 traefik的ui端口

image-20230613134432583

去services里面看看

image-20230613134555128

image-20230613134628577

可以发现我们minio服务已经实现负载均衡了,会自动转发到四个minio实例上面去

测试一下traekfix代理

的统一暴露的api 9000端口

新建一个minioupdata_test.go

package test

import (
	"context"
	"fmt"
	"github.com/minio/minio-go/v7"
	"github.com/minio/minio-go/v7/pkg/credentials"
	"log"
	"os"
	"testing"
)

func TestMinio(t *testing.T) {
	// 连接到 MinIO 集群
	endpoint := "localhost:7878"
	accessKey := "minioadmin"
	secretKey := "minioadmin"
	useSSL := false

	// 创建一个MinIO客户端对象
	minioClient, err := minio.New(endpoint, &minio.Options{
		Creds:  credentials.NewStaticV4(accessKey, secretKey, ""),
		Secure: useSSL,
	})
	if err != nil {
		log.Fatalln(err)
	}

	// 设置存储桶名称和文件名称
	bucketName := "hehe"
	objectName := "hello.txt"
	filePath := "/Users/liuxian/GoProjects/project/Gopan/hello.txt"

	// 创建存储桶(如果不存在)
	err = minioClient.MakeBucket(context.TODO(), bucketName, minio.MakeBucketOptions{})
	if err != nil {
		exists, errBucketExists := minioClient.BucketExists(context.TODO(), bucketName)
		if errBucketExists == nil && exists {
			log.Printf("Bucket '%s' already exists", bucketName)
		} else {
			log.Fatalln(err, 333)
		}
	} else {
		log.Printf("Bucket '%s' created successfully", bucketName)
	}

	// 打开本地文件
	file, err := os.Open(filePath)
	if err != nil {
		log.Fatalln(err)
	}
	defer file.Close()

	// 上传文件到 MinIO
	_, err = minioClient.PutObject(context.TODO(), bucketName, objectName, file, -1, minio.PutObjectOptions{})
	if err != nil {
		log.Fatalln(err)
	}

	fmt.Printf("File '%s' uploaded successfully to bucket '%s' as '%s'\n", filePath, bucketName, objectName)

}

输出:

image-20230613134821352

发现已经成功

在9003:

image-20230515002357687

在9002:

image-20230515002328726

搭建minio分布式集群,并且使用traekfix代理完成了😘

感谢

创作不易,博主花了整整一天弄这个😭😭😭😭😭😭,最后还是参考的nginx代理的minio集群部署,求求大家给个点赞关注吧!🥺

参考

(49条消息) docker-compose部署MinIO分布式集群_docker minio 集群_西瓜蓬蓬的博客-CSDN博客

MinIO对象存储 — MinIO Object Storage for Kubernetes

Traefik Proxy Documentation - Traefik

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值