docker-compose快速完成本机minio分布式集群布置,并运用traefik署理露出一致api端口

条件

  1. 装置 Docker:在运用 Docker Compose 之前,需求先装置 Docker。Docker 是一个开源的容器化渠道,用于构建、发布和运转应用程序。你需求在你的机器上装置 Docker,并保证 Docker 现已正确装备和运转。
  2. 装置 Docker Compose:Docker Compose 是一个独立于 Docker 的工具,用于界说和运转多个 Docker 容器的应用程序。你需求装置 Docker Compose,以便在本地或长途机器上创建和办理多个容器。

traefik

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

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端口

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

去services里边看看

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

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

可以发现我们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)
​
}
​

输出:

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

发现现已成功

在9003:

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

在9002:

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

搭建minio分布式集群,而且运用traefik署理完成了

感谢

创作不易,博主花了整整一天弄这个,最后还是参阅的nginx署理的minio集群布置,求求我们给个点赞关注吧!

参阅

(49条音讯) docker-compose布置MinIO分布式集群docker minio 集群西瓜蓬蓬的博客-CSDN博客

MinIO目标存储 — MinIO Object Storage for Kubernetes

Traefik Proxy Documentation – Traefik