• 如何使用Træfɪk代理多个Minio服务
    • 1. 前提条件
    • 2. 步骤
      • 获取,配置和启动Træfɪk
      • 获取,配置和启动Minio
      • 测试启动的实例

    如何使用Træfɪk代理多个Minio服务

    Træfɪk是一个用Go语言写的先进(和流行技术结合的比较好)的反向代理。它支持多种配置方式,本文将介绍如何通过Docker设置多个Minio实例,并用Træfɪk可实现通过不同的子域名进行访问。

    1. 前提条件

    已经安装Docker并运行, 如果没有参考安装说明.

    2. 步骤

    获取,配置和启动Træfɪk

    首先你应该为Træfɪk创建一个配置文件来启用Let's Encrypt并配置Docker后端。通过HTTP获取请求自动重定向到HTTPS,证书通过集成的Let's Encrypt进行创建。

    1. cat << EOF > traefik.toml
    2. defaultEntryPoints = ["http", "https"]
    3. [entryPoints]
    4. [entryPoints.http]
    5. address = ":80"
    6. [entryPoints.http.redirect]
    7. entryPoint = "https"
    8. [entryPoints.https]
    9. address = ":443"
    10. [entryPoints.https.tls]
    11. [acme]
    12. email = "your@email.com"
    13. storageFile = "/etc/traefik/acme.json"
    14. entryPoint = "https"
    15. onDemand = true
    16. [docker]
    17. endpoint = "unix:///var/run/docker.sock"
    18. domain = "example.com"
    19. watch = true
    20. EOF

    除了上面的配置之外,我们还需要touch一下acme.json,这个文件存了生成的证书,同时也存着私钥,所以你需要设置好权限,别让所有人都能访问这个文件。

    1. touch acme.json
    2. chmod 640 acme.json

    经过上述步骤,我们已经准备好了一个可以代理请求的Træfɪk容器。

    1. docker run -d \
    2. --restart always \
    3. --name traefik \
    4. --publish 80:80 \
    5. --publish 443:443 \
    6. --volume $(pwd)/traefik.toml:/etc/traefik/traefik.toml \
    7. --volume $(pwd)/acme.json:/etc/traefik/adme.json \
    8. --volume /var/run/docker.sock:/var/run/docker.sock \
    9. traefik

    获取,配置和启动Minio

    现在咱们可以准备多个Minio的实例,来演示一个多租户场景的解决方案。你可以启动多个Minio实例,让Træfɪk基于不同的凭据信息来进行路由。

    我们将从宿主机上启动多个带有挂载卷的Minio实例。如果你更喜欢data containers,请参考Minio Docker 快速入门.

    1. for i in $(seq 1 5); do
    2. mkdir -p $(pwd)/minio${i}/{export,config}
    3. docker run -d \
    4. --restart always \
    5. --name minio-${i} \
    6. --volume $(pwd)/minio${i}/config:/root/.minio \
    7. --volume $(pwd)/minio${i}/export:/export \
    8. minio/minio
    9. done

    测试启动的实例

    你可以用curl来测试启动的实例,这样你就可以确认实例是否启动正确。

    1. curl -H Host:minio-1.example.com http://127.0.0.1

    这个请求会获得下面的输出信息,因为没有认证,不过你可以看到确实是正确启动了。

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Error><Code>AccessDenied</Code><Message>Access Denied.</Message><Key></Key><BucketName></BucketName><Resource>/</Resource><RequestId>3L137</RequestId><HostId>3L137</HostId></Error>

    现在你可以通过https://minio-{1,2,3,4,5}.example.com来访问所有的Minio实例。

    最后我想多说一句,你应该用你操作系统的init system来启支Minio的Docker容器。做为示例,你可以看到我是如何使用systemd service来启动新的Minio实例。就是把这个文件存成/etc/systemd/system/minio@.service,并且用systemctl start minio@server1来启动新的实例,然后这个实例就可以通过server1.example.com来访问了,诸如此类。

    1. [Unit]
    2. Description=Minio: %i
    3. Requires=docker.service
    4. After=docker.service
    5. [Service]
    6. Restart=always
    7. ExecStop=/bin/sh -c '/usr/bin/docker ps | /usr/bin/grep %p-%i 1> /dev/null && /usr/bin/docker stop %p-%i || true'
    8. ExecStartPre=/bin/sh -c '/usr/bin/docker ps | /usr/bin/grep %p-%i 1> /dev/null && /usr/bin/docker kill %p-%i || true'
    9. ExecStartPre=/bin/sh -c '/usr/bin/docker ps -a | /usr/bin/grep %p-%i 1> /dev/null && /usr/bin/docker rm %p-%i || true'
    10. ExecStartPre=/usr/bin/docker pull minio/minio:latest
    11. ExecStart=/usr/bin/docker run --rm \
    12. --name %p-%i \
    13. --volume /storage/%p/%i/files:/export \
    14. --volume /storage/%p/%i/config:/root/.minio \
    15. --label traefik.frontend.rule=Host:%i.example.com \
    16. --label traefik.frontend.passHostHeader=true \
    17. minio/minio:latest
    18. [Install]
    19. WantedBy=multi-user.target

    原文: https://docs.minio.io/cn/how-to-run-multiple-minio-servers-with-traef-k.html