Traefik とは
Traefik は Go 言語で書かれたリバースプロキシです。設定を動的に変えられることが特徴で、従来のリバースプロキシで行っていたルーティングの登録などを予め設定ファイルで行っていなくてもアプリケーションサーバをリバースプロキシ配下に登録することができます。
試した環境
- CentOS 7
- Traefik 1.7.5
インストール
シングルバイナリを使用する方法とコンテナを使用する方法と 2 つあります。
シングルバイナリを使用する場合
GitHub からバイナリをダウンロードしてパスの通ったところに配置して下さい。
コンテナを使用する場合
traefik
イメージを pull すれば使用できます。
$ docker pull traefik
使い方
コンテナを使って Traefik を起動した後、コンテナで起動したサーバをバックエンドサーバとして Traefik に自動登録する処理をやってみたいと思います。
Traefik の起動
$ docker run --name traefik -d -p 80:80 -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock traefik --api --docker
traefik に渡している各オプションの説明は次のとおりです。
-
--api
- ステータスを確認できるダッシュボードを使用可能にする(8080 ポートでアクセス可) -
--docker
- Docker コンテナをバックエンドに登録できるようにする
バックエンドサーバへのルーティング
次にコンテナで動くサーバを Traefik のバックエンドサーバとして登録します。ここでは containous/whoami
イメージを使ってみます。
$ docker run --name whoami -d -l "traefik.frontend.rule=PathPrefixStrip:/whoami" containous/whoami
コンテナを起動するときに traefik.
から始まるラベルを付与すると Traefik はそのラベルが付いたコンテナが監視対象であることを認識します。さらにラベルを使用してルーティングの設定や HTTP ヘッダの追加などを行うことができます。
traefik.frontend.rule
というラベルは Traefik が受信したリクエストをバックエンドサーバに転送するときのルールを定義できるラベルです。
PathPrefixStrip:/whoami
というのはルーティングのルールを定義したもので、リクエストが /whoami
から始まるものはパスを /
に変えてバックエンドサーバに転送するという意味になります。 Traefik の面白いところはこのようなルーティングの設定は従来であればリバースプロキシ側で行っていたのですが、 Traefik はバックエンドサーバ側で設定が可能であるという点です。そのため、新規にバックエンドサーバを登録したいときにわざわざリバースプロキシの設定を変更して再起動するといった作業が不要になります。
バックエンドサーバが正しく Traefik に登録されているかどうかを確認するためにリクエストを投げてみます。
$ curl http://localhost/whoami
Hostname: 79affa961863
IP: 127.0.0.1
IP: 172.17.0.3
GET / HTTP/1.1
Host: localhost
User-Agent: curl/7.29.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.17.0.1
X-Forwarded-Host: localhost
X-Forwarded-Port: 80
X-Forwarded-Prefix: /whoami
X-Forwarded-Proto: http
X-Forwarded-Server: 23d2da1e2c95
X-Real-Ip: 172.17.0.1
ルーティングの設定はコンテナのラベルだけでなく TOML ファイルを用いた静的な設定や REST API を使用した設定変更なども可能です。
まとめ
ナビタイムでは Traefik をコンテナで動くサーバのリバースプロキシとして試験的に使用しています。まだ機能面では知らない部分も多いですが、バックエンドサーバへのルーティングはかなり楽になりますのでぜひご活用下さい。
参考
- Traefik - 公式