Traefikとは?現代的なリバースプロキシの完全ガイド【Docker・Kubernetes対応】

Web

「Dockerコンテナを複数動かしていて、ルーティングが面倒…」
「SSL証明書の管理を自動化したい!」

現代のマイクロサービスやコンテナ環境では、Traefik(トラフィック)という革新的なリバースプロキシが注目を集めています。

従来のNginxやApacheと違い、Traefikは動的な設定変更や自動SSL証明書取得など、コンテナ時代に最適化された機能を持っているんです。設定ファイルをほとんど書かずに、ラベルやアノテーションだけでルーティングを設定できる手軽さが魅力になります。

この記事では、Traefikの基礎から実践的な使い方まで、初心者の方にも分かりやすく解説していきます!


スポンサーリンク
  1. Traefikとは?基本を理解しよう
    1. 一言で説明すると
    2. 従来のリバースプロキシとの違い
  2. Traefikの主な特徴
    1. 1. 動的設定(Auto Service Discovery)
    2. 2. 自動SSL/TLS証明書取得
    3. 3. 豊富なミドルウェア
    4. 4. 負荷分散
    5. 5. リアルタイムダッシュボード
  3. Traefikの基本構成要素
    1. エントリポイント(EntryPoints)
    2. ルーター(Routers)
    3. サービス(Services)
    4. ミドルウェア(Middlewares)
  4. Docker環境でのTraefik導入
    1. 基本的なDocker Composeの設定
    2. 複数サービスのルーティング
  5. Let’s Encryptでの自動SSL化
    1. 設定ファイル(traefik.yml)
    2. Docker Composeでの実装
  6. ミドルウェアの活用
    1. Basic認証の追加
    2. HTTPからHTTPSへのリダイレクト
    3. レート制限
    4. CORS設定
    5. IPホワイトリスト
  7. Kubernetes環境でのTraefik
    1. Helmでのインストール
    2. Ingressリソースの作成
    3. IngressRouteの利用(Traefik独自)
    4. ミドルウェアの定義
  8. 負荷分散の設定
    1. ラウンドロビン(デフォルト)
    2. 重み付けロードバランシング
    3. ヘルスチェック
  9. 実践的な使用例
    1. 例1:WordPress + MariaDB
    2. 例2:マイクロサービス構成
  10. Traefikのメリット
    1. 1. 設定が簡単
    2. 2. 自動化が充実
    3. 3. 最新技術への対応
    4. 4. Let’s Encrypt統合
    5. 5. 軽量で高速
  11. Traefikのデメリット
    1. 1. 学習曲線
    2. 2. ドキュメントの分散
    3. 3. 静的ファイル配信には不向き
    4. 4. 複雑な設定は難しい
  12. よくある質問
    1. Q1. TraefikとNginx、どちらを選ぶべき?
    2. Q2. 本番環境で使えますか?
    3. Q3. パフォーマンスはどうですか?
    4. Q4. バージョン1と2の違いは?
    5. Q5. ダッシュボードのセキュリティは?
  13. まとめ:Traefikで現代的なインフラを構築しよう

Traefikとは?基本を理解しよう

一言で説明すると

Traefikは、コンテナ環境に特化した、動的設定が可能な現代的なリバースプロキシ・ロードバランサーです。

Go言語で開発されており、軽量で高速、そしてクラウドネイティブなアプリケーションに最適な設計になっています。

従来のリバースプロキシとの違い

Nginx や Apache の場合:

# 設定ファイルを手動で編集
server {
    server_name app1.example.com;
    location / {
        proxy_pass http://backend1:8080;
    }
}

# 新しいサービスを追加するたびに編集&リロード

Traefik の場合:

# Dockerのラベルで設定(自動認識)
labels:
  - "traefik.http.routers.app1.rule=Host(`app1.example.com`)"

サービスが起動すると、Traefikが自動的に認識してルーティングを設定してくれるんです!


Traefikの主な特徴

1. 動的設定(Auto Service Discovery)

最大の特徴は、サービスディスカバリー機能です。

対応プラットフォーム:

  • Docker / Docker Swarm
  • Kubernetes
  • Consul
  • Etcd
  • Rancher
  • ECS(Amazon)

これらの環境で起動したサービスを、自動的に検出してルーティングを設定します。

2. 自動SSL/TLS証明書取得

Let’s Encrypt と統合されており、SSL証明書を自動で取得・更新してくれます。

# たった1行の設定で自動HTTPS化
certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@example.com

証明書の更新を忘れて期限切れ…という心配がなくなります。

3. 豊富なミドルウェア

リクエスト処理をカスタマイズできる、様々なミドルウェアが用意されています。

主なミドルウェア:

  • 認証(Basic認証、OAuth、ForwardAuthなど)
  • レート制限
  • リダイレクト(HTTPからHTTPSなど)
  • ヘッダー追加・変更
  • CORS対応
  • 圧縮
  • IPホワイトリスト

4. 負荷分散

複数のバックエンドサーバーに、トラフィックを分散できます。

対応アルゴリズム:

  • ラウンドロビン
  • 重み付けラウンドロビン
  • IPハッシュ

5. リアルタイムダッシュボード

Webベースの管理画面で、現在のルーティング状況を視覚的に確認できます。


Traefikの基本構成要素

エントリポイント(EntryPoints)

外部からの接続を受け付ける「入口」です。

例:

entryPoints:
  web:
    address: ":80"      # HTTP用
  websecure:
    address: ":443"     # HTTPS用
  ssh:
    address: ":22"      # SSH用

ルーター(Routers)

リクエストをどのサービスに振り分けるか決定するルールです。

ルール例:

  • Host: ドメイン名による振り分け
  • Path: URLパスによる振り分け
  • Headers: HTTPヘッダーによる振り分け
# app1.example.com へのアクセスは service1 へ
routers:
  app1:
    rule: "Host(`app1.example.com`)"
    service: service1

サービス(Services)

実際のバックエンドサーバー(コンテナ)への接続設定です。

services:
  service1:
    loadBalancer:
      servers:
        - url: "http://backend1:8080"
        - url: "http://backend2:8080"

ミドルウェア(Middlewares)

リクエストやレスポンスを処理する中間層です。

middlewares:
  auth:
    basicAuth:
      users:
        - "user:$apr1$H6uskkkW$..."

Docker環境でのTraefik導入

基本的なDocker Composeの設定

最もシンプルな構成から始めましょう。

docker-compose.yml:

version: '3'

services:
  traefik:
    image: traefik:v2.10
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"  # ダッシュボード
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.routers.whoami.entrypoints=web"

起動:

docker-compose up -d

アクセス:

  • http://whoami.localhost → whoamiコンテナにアクセス
  • http://localhost:8080 → Traefikダッシュボード

複数サービスのルーティング

version: '3'

services:
  traefik:
    image: traefik:v2.10
    command:
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  app1:
    image: nginx:alpine
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app1.rule=Host(`app1.localhost`)"

  app2:
    image: nginx:alpine
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app2.rule=Host(`app2.localhost`)"

  app3:
    image: nginx:alpine
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app3.rule=PathPrefix(`/api`)"

アクセス:

  • http://app1.localhost → app1へ
  • http://app2.localhost → app2へ
  • http://localhost/api → app3へ

Let’s Encryptでの自動SSL化

本番環境で最も重要な設定です。

設定ファイル(traefik.yml)

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https

  websecure:
    address: ":443"
    http:
      tls:
        certResolver: letsencrypt

certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@example.com
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

Docker Composeでの実装

version: '3'

services:
  traefik:
    image: traefik:v2.10
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./traefik.yml:/traefik.yml:ro"
      - "./letsencrypt:/letsencrypt"

  myapp:
    image: nginx:alpine
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.myapp.rule=Host(`example.com`)"
      - "traefik.http.routers.myapp.entrypoints=websecure"
      - "traefik.http.routers.myapp.tls.certresolver=letsencrypt"

重要:

  • acme.json のパーミッションは 600 にする必要があります
  • HTTPチャレンジには80番ポートが必要です
touch letsencrypt/acme.json
chmod 600 letsencrypt/acme.json

ミドルウェアの活用

Basic認証の追加

services:
  traefik:
    # ... (省略)

  admin-panel:
    image: myapp/admin:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.admin.rule=Host(`admin.example.com`)"
      - "traefik.http.routers.admin.middlewares=admin-auth"
      - "traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$H6uskkkW$$..."

パスワードの生成:

# htpasswdコマンドを使用
htpasswd -nb admin secretpassword

# または、オンラインツールを使用
# https://hostingcanada.org/htpasswd-generator/

HTTPからHTTPSへのリダイレクト

labels:
  - "traefik.http.routers.myapp-http.rule=Host(`example.com`)"
  - "traefik.http.routers.myapp-http.entrypoints=web"
  - "traefik.http.routers.myapp-http.middlewares=redirect-to-https"
  - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

レート制限

DDoS対策として、アクセス制限を設定できます。

labels:
  - "traefik.http.middlewares.rate-limit.ratelimit.average=100"
  - "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
  - "traefik.http.routers.myapp.middlewares=rate-limit"

CORS設定

labels:
  - "traefik.http.middlewares.cors.headers.accesscontrolallowmethods=GET,OPTIONS,PUT,POST,DELETE"
  - "traefik.http.middlewares.cors.headers.accesscontrolalloworigin=*"
  - "traefik.http.middlewares.cors.headers.accesscontrolmaxage=100"
  - "traefik.http.middlewares.cors.headers.addvaryheader=true"

IPホワイトリスト

特定のIPアドレスからのみアクセスを許可します。

labels:
  - "traefik.http.middlewares.ip-whitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.0/8"
  - "traefik.http.routers.internal.middlewares=ip-whitelist"

Kubernetes環境でのTraefik

Helmでのインストール

Kubernetesでは、Helmチャートを使って簡単にインストールできます。

# Helmリポジトリの追加
helm repo add traefik https://traefik.github.io/charts
helm repo update

# Traefikのインストール
helm install traefik traefik/traefik

Ingressリソースの作成

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: myapp-service
                port:
                  number: 80
  tls:
    - secretName: myapp-tls
      hosts:
        - myapp.example.com

IngressRouteの利用(Traefik独自)

より高度な設定が可能な、Traefik専用のリソースです。

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: myapp-ingressroute
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`myapp.example.com`)
      kind: Rule
      services:
        - name: myapp-service
          port: 80
      middlewares:
        - name: auth-middleware
  tls:
    certResolver: letsencrypt

ミドルウェアの定義

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: auth-middleware
spec:
  basicAuth:
    secret: auth-secret

負荷分散の設定

ラウンドロビン(デフォルト)

複数のコンテナに均等に振り分けます。

services:
  app:
    image: myapp:latest
    deploy:
      replicas: 3
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`example.com`)"
      - "traefik.http.services.app.loadbalancer.server.port=8080"

Docker Swarmやレプリカを使うと、自動的に負荷分散されます。

重み付けロードバランシング

services:
  app:
    labels:
      - "traefik.http.services.app.loadbalancer.server.port=8080"
      - "traefik.http.services.app.loadbalancer.servers.0.url=http://backend1:8080"
      - "traefik.http.services.app.loadbalancer.servers.0.weight=3"
      - "traefik.http.services.app.loadbalancer.servers.1.url=http://backend2:8080"
      - "traefik.http.services.app.loadbalancer.servers.1.weight=1"

backend1が3/4、backend2が1/4のトラフィックを受け取ります。

ヘルスチェック

バックエンドの健全性を監視します。

labels:
  - "traefik.http.services.app.loadbalancer.healthcheck.path=/health"
  - "traefik.http.services.app.loadbalancer.healthcheck.interval=10s"
  - "traefik.http.services.app.loadbalancer.healthcheck.timeout=3s"

実践的な使用例

例1:WordPress + MariaDB

version: '3'

services:
  traefik:
    image: traefik:v2.10
    command:
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.email=admin@example.com"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"

  wordpress:
    image: wordpress:latest
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: secret
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wordpress.rule=Host(`blog.example.com`)"
      - "traefik.http.routers.wordpress.entrypoints=websecure"
      - "traefik.http.routers.wordpress.tls.certresolver=letsencrypt"

  db:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

例2:マイクロサービス構成

version: '3'

services:
  traefik:
    image: traefik:v2.10
    # ... (省略)

  frontend:
    image: myapp/frontend:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.frontend.rule=Host(`app.example.com`)"
      - "traefik.http.routers.frontend.entrypoints=websecure"
      - "traefik.http.routers.frontend.tls.certresolver=letsencrypt"

  api:
    image: myapp/api:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`app.example.com`) && PathPrefix(`/api`)"
      - "traefik.http.routers.api.entrypoints=websecure"
      - "traefik.http.routers.api.tls.certresolver=letsencrypt"
      - "traefik.http.routers.api.middlewares=api-stripprefix"
      - "traefik.http.middlewares.api-stripprefix.stripprefix.prefixes=/api"

  admin:
    image: myapp/admin:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.admin.rule=Host(`admin.example.com`)"
      - "traefik.http.routers.admin.entrypoints=websecure"
      - "traefik.http.routers.admin.tls.certresolver=letsencrypt"
      - "traefik.http.routers.admin.middlewares=admin-auth"
      - "traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$..."

Traefikのメリット

1. 設定が簡単

ラベルやアノテーションだけで、ほとんどの設定ができます。従来のような複雑な設定ファイルは不要です。

2. 自動化が充実

サービスの起動・停止を自動認識し、ルーティングを動的に更新してくれます。

3. 最新技術への対応

Docker、Kubernetes、gRPC、WebSocketなど、現代的な技術スタックに標準対応しています。

4. Let’s Encrypt統合

SSL証明書の取得・更新が完全自動化され、管理の手間がかかりません。

5. 軽量で高速

Go言語で書かれており、メモリ使用量が少なく、パフォーマンスが優れています。


Traefikのデメリット

1. 学習曲線

独自の概念(エントリポイント、ルーター、サービスなど)があり、最初は理解に時間がかかります。

2. ドキュメントの分散

v1からv2への大きな変更があり、古い情報と新しい情報が混在しています。

3. 静的ファイル配信には不向き

Nginxのような静的ファイルの高速配信には最適化されていません。あくまでリバースプロキシとして使うべきです。

4. 複雑な設定は難しい

非常に高度なカスタマイズをする場合、Nginxの方が柔軟性があることもあります。


よくある質問

Q1. TraefikとNginx、どちらを選ぶべき?

Traefikが向いている:

  • Docker/Kubernetesを使っている
  • マイクロサービスアーキテクチャ
  • 動的な環境変更が多い
  • SSL証明書の自動管理が欲しい

Nginxが向いている:

  • 静的ファイルの配信がメイン
  • 従来型のサーバー構成
  • 細かいチューニングが必要
  • 枯れた技術を使いたい

Q2. 本番環境で使えますか?

はい、多くの企業で本番運用されています。

GitLab、Cloudflare、Red Hatなど、大手企業でも採用実績があります。

Q3. パフォーマンスはどうですか?

Nginxと比較して、リバースプロキシとしての性能は同等レベルです。

ただし、静的ファイル配信の速度ではNginxの方が優れています。

Q4. バージョン1と2の違いは?

バージョン2で設計が大幅に変更されました。

現在はv2が推奨されており、v1は既に非推奨です。これから学ぶなら、必ずv2を選びましょう。

Q5. ダッシュボードのセキュリティは?

デフォルトでは認証なしでアクセスできてしまいます。

本番環境では、必ずBasic認証やIPホワイトリストを設定しましょう。

command:
  - "--api.dashboard=true"
labels:
  - "traefik.http.routers.dashboard.middlewares=auth"
  - "traefik.http.middlewares.auth.basicauth.users=admin:..."

まとめ:Traefikで現代的なインフラを構築しよう

Traefikについて、基礎から実践まで解説してきました。

重要ポイントのおさらい:

  1. 動的設定が最大の特徴
    サービスの自動検出で、手動設定が不要に
  2. Let’s Encrypt統合で自動HTTPS化
    SSL証明書の管理が完全自動化される
  3. Docker/Kubernetesに最適
    コンテナ環境での使用を前提とした設計
  4. ミドルウェアで柔軟なカスタマイズ
    認証、リダイレクト、レート制限など豊富な機能
  5. 学習コストはあるが、習得すれば強力
    独自の概念を理解すれば、非常に便利なツール

Traefikは、マイクロサービスやコンテナ環境でのインフラ構築を大幅に簡素化してくれる強力なツールです。この記事を参考に、ぜひあなたのプロジェクトでも活用してみてくださいね!

コメント

タイトルとURLをコピーしました