2024年4月30日火曜日

Traefik 超入門

Traefik 超入門

概要

Traefik は Host ヘッダベースのリバースプロキシです
ルーティングのルールを細かく設定できたりパスベースのルーティングも実現できます
設定ファイルも YAML で記載できる他正規表現などのルールも作成できます
今回は docker 上で簡単に動かしてみました

環境

  • macOS 11.7.10
  • docker 24.0.2
  • traefik 3.0

まずは traefik を起動する

リバースプロキシのみ起動します
このあとでアプリをぶら下げて Host ヘッダベースでバランシングできているか確認します

  • vim docker-compose.yml
version: '3'

services:
  reverse-proxy:
    image: traefik:v3.0
    command: --api.insecure=true --providers.docker
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
  • docker-compose up -d

で localhost:8080 にアクセスすると traefik のダッシュボードを確認できます

この段階で localhost にアクセスしてもアプリがないので 404 が返ってきます

アプリをぶら下げる

traefik の下にアプリをぶら下げる設定を追加します

  • vim docker-compose.yml
version: '3'

services:
  reverse-proxy:
    image: traefik:v3.0
    command: --api.insecure=true --providers.docker
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
  whoami:
    # A container that exposes an API to show its IP address
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"

コンテナにラベルを振ることで Host ヘッダの値に応じてバランシングしてくれます
一度 down させて再度起動します
ちなみに traefik/whoami はただのデバッグ用のアプリになります

  • docker-compose down
  • docker-compose up -d
  • docker-compose ps
NAME                         IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
python-try-reverse-proxy-1   traefik:v3.0        "/entrypoint.sh --ap…"   reverse-proxy       25 seconds ago      Up 23 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp
python-try-whoami-1          traefik/whoami      "/whoami"                whoami              25 seconds ago      Up 23 seconds       80/tcp

これで今度は Host ヘッダを付与してアプリにアクセスしてみます
するとちゃんと whoami アプリにアクセスできていることが確認できます

  • curl -H "Host: whoami.docker.localhost" localhost
Hostname: 716c5a018b13
IP: 127.0.0.1
IP: 172.19.0.2
RemoteAddr: 172.19.0.3:57016
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.19.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: c8479f4b7c06
X-Real-Ip: 172.19.0.1

もう一台追加してバランシングされるか確認する

一台だと味気ないのでもう一台追加してちゃんと Host を変えたときに正しいアプリにバランシングされることを確認してみます
whoami アプリをもう一つ追加します

  • vim docker-compose.yml
version: '3'

services:
  reverse-proxy:
    image: traefik:v3.0
    command: --api.insecure=true --providers.docker
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
  whoami:
    # A container that exposes an API to show its IP address
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
  whoami2:
    # A container that exposes an API to show its IP address
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami2.rule=Host(`whoami2.docker.localhost`)"

ラベルも whoami2 にして追加します
これで再作成してみます

  • docker-compose down
  • docker-compose up -d
  • docker-compose ps
NAME                         IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
python-try-reverse-proxy-1   traefik:v3.0        "/entrypoint.sh --ap…"   reverse-proxy       55 seconds ago      Up 54 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp
python-try-whoami-1          traefik/whoami      "/whoami"                whoami              55 seconds ago      Up 54 seconds       80/tcp
python-try-whoami2-1         traefik/whoami      "/whoami"                whoami2             55 seconds ago      Up 54 seconds       80/tcp

そして再度 Host ヘッダを変更してアクセスすると別の whoami アプリにバランシングされていることが確認できます

  • curl -H "Host: whoami.docker.localhost" localhost
Hostname: 77c5ff6e72f4
IP: 127.0.0.1
IP: 172.21.0.4
RemoteAddr: 172.21.0.3:36418
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.21.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 60057b9154e0
X-Real-Ip: 172.21.0.1
  • curl -H "Host: whoami2.docker.localhost" localhost
Hostname: e6cef80986c8
IP: 127.0.0.1
IP: 172.21.0.2
RemoteAddr: 172.21.0.3:47060
GET / HTTP/1.1
Host: whoami2.docker.localhost
User-Agent: curl/8.4.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.21.0.1
X-Forwarded-Host: whoami2.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 60057b9154e0
X-Real-Ip: 172.21.0.1

最後に

Traefik を使って Host ベースのアプリバランシングをしてみました
nginx などのリバースプロキシでも Host ベースのバランシングはできますがラベルにルール付やデフォルトで管理用のダッシュボードなどは用意されていません
また定義を YAML で書けるのも便利です
違いについてはこのあたりが非常にまとまっているので興味があれば見てみてください

また今回は紹介しませんが k8s との連携も簡単にできるのも特徴です

参考サイト

0 件のコメント:

コメントを投稿