Traefik 是一种流行的开源反向代理和负载均衡器,广泛用于容器化环境。它提供了多种优势和功能,使其成为管理传入流量并将其路由到微服务或应用程序的热门选择。以下是常用Traefik的一些原因:
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"
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就可以了
然后我们docker-compose启动,访问8080 traefik的ui端口
去services里面看看
可以发现我们minio服务已经实现负载均衡了,会自动转发到四个minio实例上面去
的统一暴露的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)
}
输出:
发现已经成功
在9003:
在9002:
搭建minio分布式集群,并且使用traekfix代理完成了
创作不易,博主花了整整一天弄这个,最后还是参考的nginx代理的minio集群部署,求求大家给个点赞关注吧!
(49条消息) docker-compose部署MinIO分布式集群_docker minio 集群_西瓜蓬蓬的博客-CSDN博客
MinIO对象存储 — MinIO Object Storage for Kubernetes
Traefik Proxy Documentation - Traefik