Traefik設定完全ガイド:基礎から応用まで


Traefik設定完全ガイド:基礎から応用まで

Traefikは、現代のクラウドネイティブなアプリケーション環境において、非常に強力なリバースプロキシおよびロードバランサーとして広く採用されています。その柔軟性と自動設定機能は、複雑なインフラストラクチャの管理を大幅に簡素化し、開発者や運用チームの生産性を向上させます。本記事では、Traefikの基礎から応用までを網羅的に解説し、読者の皆様がTraefikを最大限に活用できるようになることを目指します。

1. Traefikとは何か?

Traefikは、”edge router” とも呼ばれるリバースプロキシおよびロードバランサーです。コンテナオーケストレーションシステム(Kubernetes, Docker Swarmなど)、クラウドプロバイダー(AWS, GCP, Azureなど)、さらには従来のインフラストラクチャにも対応し、これらの環境を自動的に検出し、設定を動的に更新することができます。

1.1. Traefikの主な特徴

  • 動的設定: Traefikは、バックエンドサービスの状態変化をリアルタイムで検出し、設定を自動的に更新します。これにより、手動での設定変更や再起動の必要性が大幅に削減されます。
  • 自動設定検出: Traefikは、様々なプロバイダー(Kubernetes Ingress, Docker labels, Consul catalogなど)を監視し、新しいサービスがデプロイされると自動的にルーティングルールを作成します。
  • Let’s Encrypt統合: TraefikはLet’s Encryptと連携し、SSL/TLS証明書を自動的に取得および更新することができます。これにより、HTTPSの設定が非常に簡単になります。
  • 豊富なミドルウェア: Traefikは、リクエストのヘッダー操作、認証、リダイレクト、レートリミットなど、様々なミドルウェアを提供し、アプリケーションの機能を拡張することができます。
  • Web UI: Traefikは、設定やルーティングの状況を視覚的に確認できるWeb UIを提供します。
  • 柔軟なルーティング: Traefikは、ホスト名、パス、ヘッダー、クエリパラメータなど、様々な条件に基づいてルーティングルールを定義することができます。

1.2. Traefikのアーキテクチャ

Traefikのアーキテクチャは、以下の主要なコンポーネントで構成されています。

  • Entrypoints: 受信トラフィックを受け付けるポートを定義します(HTTPの80番ポート、HTTPSの443番ポートなど)。
  • Providers: バックエンドサービスの情報源です。Kubernetes Ingress, Docker labels, Consul catalogなどが該当します。
  • Routers: 受信リクエストを特定のサービスにルーティングするルールを定義します。ルールは、ホスト名、パス、ヘッダーなどに基づいて定義できます。
  • Services: 実際のリクエストを処理するバックエンドサービスを定義します。
  • Middlewares: リクエストを処理する前後に適用される処理を定義します。認証、リダイレクト、レートリミットなどが該当します。

1.3. Traefikのメリット

  • 運用コストの削減: 自動設定とLet’s Encrypt統合により、手動での設定変更や証明書管理の負担が軽減されます。
  • スケーラビリティの向上: 動的設定により、バックエンドサービスのスケールアウト/スケールインに自動的に対応できます。
  • セキュリティの強化: Let’s Encrypt統合により、HTTPSの設定が容易になり、セキュリティが向上します。
  • 開発効率の向上: 設定ファイルが簡潔になり、デプロイメントプロセスが効率化されます。

2. Traefikのインストールと設定

Traefikのインストール方法は、利用する環境によって異なります。ここでは、DockerとKubernetesでのインストール方法について解説します。

2.1. Dockerでのインストール

Docker Composeを使用すると、Traefikのインストールが非常に簡単になります。以下のdocker-compose.ymlファイルを作成します。

“`yaml
version: “3.7”

services:
traefik:
image: traefik:v2.9 # 最新のTraefik 2.x バージョンを使用
container_name: traefik
ports:
– “80:80”
– “443:443”
– “8080:8080” # Traefik Web UIへのアクセス
volumes:
– ./traefik.yml:/etc/traefik/traefik.yml
– traefik_certs:/etc/traefik/certs
networks:
– web
restart: unless-stopped
labels:
– “traefik.enable=true”
– “traefik.http.routers.api.rule=Host(traefik.localhost)”
– “traefik.http.routers.api.service=api@internal”
– “traefik.http.routers.api.entrypoints=websecure”
– “traefik.http.routers.api.tls.certresolver=myresolver” # Let’s Encryptの設定
– “traefik.http.routers.api.middlewares=auth”
– “traefik.http.middlewares.auth.basicauth.users=user:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrU0YAH0”

networks:
web:
external: true

volumes:
traefik_certs:
“`

次に、traefik.ymlファイルを作成します。

“`yaml
api:
dashboard: true
insecure: true # 本番環境ではfalseに設定

entryPoints:
web:
address: “:80”
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: “:443”

providers:
docker:
exposedByDefault: false

certificatesResolvers:
myresolver:
acme:
email: “[email protected]” # Let’s Encryptへの登録に使用するメールアドレス
storage: “/etc/traefik/certs/acme.json”
tlsChallenge: {}
“`

上記のdocker-compose.ymlファイルでは、以下の設定を行っています。

  • traefikサービスを定義し、Traefikのイメージを指定しています。
  • ポート80, 443, 8080をホストに公開しています。
  • traefik.ymlファイルをTraefikの設定ファイルとしてマウントしています。
  • traefik_certsボリュームをLet’s Encryptの証明書保存先としてマウントしています。
  • traefik.enable=trueラベルを設定することで、Traefikがこのコンテナを監視するように指示しています。
  • Traefik Web UIへのルーティングルールを設定しています。
  • Basic認証を設定

traefik.ymlファイルでは、以下の設定を行っています。

  • APIセクションで、ダッシュボードを有効にしています。
  • Entrypointsセクションで、HTTPとHTTPSのポートを定義しています。
  • Dockerプロバイダーを有効にし、exposedByDefault: falseを設定することで、デフォルトではすべてのコンテナを監視しないようにしています。
  • Let’s Encryptの設定を行っています。emailには、Let’s Encryptへの登録に使用するメールアドレスを入力してください。

これらのファイルを作成したら、以下のコマンドを実行してTraefikを起動します。

bash
docker-compose up -d

Traefik Web UIにアクセスするには、ブラウザでhttp://traefik.localhost:8080を開きます。

補足:Basic認証のパスワード生成

traefik.yml内のbasic認証設定で使用するパスワードを生成するには、htpasswdコマンドを使用します。

bash
docker run --rm -it alpine/htpasswd -b -n user password

このコマンドは、user:passwordのような形式の文字列を出力します。この文字列をtraefik.ymltraefik.http.middlewares.auth.basicauth.usersに設定してください。 上記の例では、すでに生成されたハッシュ値がプレースホルダーとして入っています。

2.2. Kubernetesでのインストール

KubernetesでTraefikをインストールするには、Helmを使用するのが一般的です。Helmは、Kubernetesアプリケーションのデプロイメントを管理するためのパッケージマネージャーです。

まず、Helmをインストールします。

bash
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod +x get_helm.sh
./get_helm.sh

次に、TraefikのHelm Chartをインストールします。

bash
helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm install traefik traefik/traefik

上記のコマンドを実行すると、traefikという名前のNamespaceにTraefikがインストールされます。

Traefikの設定を変更するには、values.yamlファイルを作成し、Helm Chartに適用します。例えば、Let’s Encryptの設定を行うには、以下のようなvalues.yamlファイルを作成します。

“`yaml
globalArguments:
– “–certificatesresolvers.myresolver.acme.email=your_email@example.com”
– “–certificatesresolvers.myresolver.acme.storage=/data/acme.json”
– “–certificatesresolvers.myresolver.acme.tlschallenge=true”

service:
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb # AWS NLBを使用する場合
“`

上記のvalues.yamlファイルでは、以下の設定を行っています。

  • globalArgumentsセクションで、Let’s Encryptの設定を行っています。emailには、Let’s Encryptへの登録に使用するメールアドレスを入力してください。
  • AWS NLBを使用する場合のアノテーションを設定しています。

values.yamlファイルを適用するには、以下のコマンドを実行します。

bash
helm upgrade traefik traefik/traefik -f values.yaml

3. Traefikの設定

Traefikの設定は、設定ファイルまたはコマンドライン引数で行うことができます。設定ファイルは、YAMLまたはTOML形式で記述できます。

3.1. 設定ファイルの例(traefik.yml)

“`yaml
api:
dashboard: true
insecure: true # 本番環境ではfalseに設定

entryPoints:
web:
address: “:80”
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: “:443”

providers:
docker:
exposedByDefault: false
file:
directory: /etc/traefik/config
watch: true

certificatesResolvers:
myresolver:
acme:
email: “[email protected]
storage: “/etc/traefik/certs/acme.json”
tlsChallenge: {}
“`

上記の例では、以下の設定を行っています。

  • APIセクションで、ダッシュボードを有効にしています。
  • Entrypointsセクションで、HTTPとHTTPSのポートを定義しています。
  • DockerプロバイダーとFileプロバイダーを有効にしています。
  • Let’s Encryptの設定を行っています。

3.2. 動的設定ファイル

ルーティングルールやミドルウェアの設定は、動的設定ファイルで行います。動的設定ファイルは、設定ファイルのproviders.file.directoryで指定されたディレクトリに配置します。

動的設定ファイルの例(config/rules.yml

``yaml
http:
routers:
my-router:
rule: "Host(
example.com`)”
service: my-service
entryPoints:
– websecure
tls:
certResolver: myresolver

services:
my-service:
loadBalancer:
servers:
– url: “http://172.17.0.2:8080” # コンテナのIPアドレスとポート
“`

上記の例では、以下の設定を行っています。

  • my-routerという名前のルーターを定義し、example.comへのリクエストをmy-serviceにルーティングするように設定しています。
  • my-serviceという名前のサービスを定義し、http://172.17.0.2:8080にあるバックエンドサービスにリクエストを転送するように設定しています。
  • HTTPSを有効にし、Let’s Encryptを使用して証明書を取得するように設定しています。

3.3. Docker Labelsを使用した設定

Docker Labelsを使用すると、コンテナの起動時にルーティングルールを定義することができます。

“`yaml
version: “3.7”

services:
whoami:
image: traefik/whoami
labels:
– “traefik.enable=true”
– “traefik.http.routers.whoami.rule=Host(whoami.localhost)”
– “traefik.http.routers.whoami.service=whoami”
– “traefik.http.services.whoami.loadbalancer.server.port=80”
“`

上記の例では、以下の設定を行っています。

  • traefik.enable=trueラベルを設定することで、Traefikがこのコンテナを監視するように指示しています。
  • whoami.localhostへのリクエストをwhoamiサービスにルーティングするように設定しています。
  • whoamiサービスのポートを80に設定しています。

4. Traefikの応用的な機能

4.1. ミドルウェア

Traefikのミドルウェアを使用すると、リクエストを処理する前後に様々な処理を追加することができます。

  • リダイレクト: HTTPからHTTPSへのリダイレクトや、特定のURLへのリダイレクトを設定できます。
  • 認証: Basic認証、Digest認証、OAuth2認証などを設定できます。
  • ヘッダー操作: リクエストヘッダーやレスポンスヘッダーを追加、変更、削除できます。
  • レートリミット: リクエストのレートを制限できます。
  • IPホワイトリスト: 特定のIPアドレスからのリクエストのみを許可できます。

ミドルウェアの設定例

yaml
http:
middlewares:
redirect-to-https:
redirectScheme:
scheme: https
permanent: true
routers:
my-router:
rule: "Host(`example.com`)"
service: my-service
entryPoints:
- web
middlewares:
- redirect-to-https

上記の例では、HTTPからHTTPSへのリダイレクトを設定しています。

4.2. ヘルスチェック

Traefikは、バックエンドサービスのヘルスチェックを行い、正常なサービスにのみリクエストを転送することができます。

ヘルスチェックの設定例

yaml
http:
services:
my-service:
loadBalancer:
servers:
- url: "http://172.17.0.2:8080"
healthCheck:
path: /health
interval: "10s"
timeout: "3s"

上記の例では、10秒ごとに/healthエンドポイントにヘルスチェックを行い、3秒以内に応答がない場合はサービスをunhealthyとみなすように設定しています。

4.3. Canaryデプロイ

Traefikを使用すると、Canaryデプロイを簡単に実現することができます。Canaryデプロイとは、新しいバージョンのアプリケーションを一部のユーザーにのみ公開し、問題がないことを確認してからすべてのユーザーに公開する手法です。

Canaryデプロイの設定例

``yaml
http:
routers:
my-router:
rule: "Host(
example.com`)”
entryPoints:
– websecure
service: my-service

services:
my-service:
weighted:
services:
– name: my-service-v1
weight: 90
– name: my-service-v2
weight: 10

my-service-v1:
  loadBalancer:
    servers:
      - url: "http://172.17.0.2:8080"

my-service-v2:
  loadBalancer:
    servers:
      - url: "http://172.17.0.3:8080"

“`

上記の例では、my-service-v1に90%、my-service-v2に10%のリクエストを転送するように設定しています。

5. トラブルシューティング

Traefikの使用中に問題が発生した場合、以下の点を確認してください。

  • 設定ファイル: 設定ファイルに構文エラーがないか確認してください。
  • ログ: Traefikのログを確認して、エラーメッセージや警告メッセージがないか確認してください。
  • Web UI: Traefik Web UIを確認して、ルーティングルールやサービスが正しく設定されているか確認してください。
  • ネットワーク: バックエンドサービスへのネットワーク接続が正常に行われているか確認してください。
  • DNS: DNS設定が正しく、Traefikが適切な名前解決を行えているか確認してください。
  • 証明書: Let’s Encryptの証明書が正しく取得されているか、有効期限が切れていないか確認してください。

6. まとめ

Traefikは、現代のクラウドネイティブなアプリケーション環境において、非常に強力なリバースプロキシおよびロードバランサーです。本記事では、Traefikの基礎から応用までを網羅的に解説しました。Traefikを使いこなすことで、インフラストラクチャの管理を大幅に簡素化し、開発者や運用チームの生産性を向上させることができます。

この記事が、Traefikの理解と活用に役立つことを願っています。


補足:

  • 上記のコード例は、あくまで例です。実際の環境に合わせて設定を変更してください。
  • Traefikのバージョンによって、設定ファイルの構文が異なる場合があります。最新のドキュメントを参照してください。
  • 本番環境では、api.insecurefalseに設定し、Traefik Web UIへのアクセスを制限してください。
  • Basic認証は、最も基本的な認証方式です。よりセキュアな認証方式を使用することを推奨します。

この情報がお役に立てば幸いです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール