Contents
Traefik の概要と選定理由
Kubernetes クラスタで Ingress を導入する際、軽量かつ動的に設定できることが重要です。Traefik は Go 製のプロキシであり、Pod のリソースフットプリントが小さく、CRD によるリアルタイムな構成変更が可能です。このセクションでは、他の Ingress コントローラと比較した際の優位性を具体的に解説します。
軽量かつ高速なプロキシ
Traefik は同規模クラスタで NGINX Ingress Controller と比べてメモリ使用量が抑えられることが公式ベンチマークで報告されています(Traefik Benchmarks, 2024‑03)。
- NGINX: 約 200 MiB のメモリ使用量(ベンチマーク対象)
- Traefik: 約 120 MiB のメモリ使用量(同条件下)
CPU 使用率も低く、リクエストあたりのレイテンシが 10 % 程度改善されることが実測されています。これにより、大規模環境でもノード数削減やコスト削減が期待できます。
動的設定と CRD の活用
Traefik は IngressRoute や Middleware といったカスタムリソース(CRD)を提供し、構成変更を即時に反映します。Kubernetes 1.27 以降では従来の v1beta1 系は削除され、Traefik の CRD は apiVersion: traefik.io/v1alpha1(Stable)として利用できます。これによりバージョン互換性が確保され、古い API を使用した場合のエラーを回避できます。
ネイティブ Let’s Encrypt 対応
Traefik には ACME クライアントが組み込まれており、certificatesResolvers の設定だけで証明書取得・自動更新が完結します。HTTP‑01 と DNS‑01(Cloudflare、Route53 等)を選択でき、外部ツール不要で TLS 終端を実現できます。
前提環境の確認と準備
このガイドは kubectl と Helm がインストール済み の Kubernetes クラスタを対象とします。まずはバージョンが要件を満たしているか確認し、必要に応じて最新版へ更新してください。
kubectl と Helm のバージョンチェック
Kubernetes 本体は v1.27 以上、Helm は v3.14 以上 が推奨されます。以下のコマンドで実際のバージョンを確認します。
|
1 2 3 4 5 6 |
# kubectl バージョン確認 kubectl version --client -o yaml | grep gitVersion # helm バージョン確認 helm version --short |
期待される出力例
|
1 2 3 |
Client Version: v1.28.2 Helm v3.15.0 |
古いバージョンが表示された場合は、公式サイトから最新バイナリをダウンロードし、PATH を更新してください。
推奨インストール方法(公式スクリプト)
- kubectl
bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/ - Helm
bash
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
公式 Helm チャートで Traefik をインストール
現在の安定版は Traefik v3.1.5(2024‑06 リリース) です。Helm リポジトリ名は正しく traefik です。
Helm リポジトリの追加と更新
まず公式リポジトリを登録し、インデックス情報を取得します。
|
1 2 3 |
helm repo add traefik https://traefik.github.io/charts helm repo update |
リポジトリが正しく追加されたことは helm search repo traefik で確認できます。
values.yaml の主要パラメータ
以下の表はデプロイ時に必ず設定すべき項目と推奨値を示しています。各項目は IngressClass と CRD の有効化、Service の公開方法に関わります。
| パラメータ | 説明 | 推奨設定 |
|---|---|---|
service.type |
Traefik が外部へ露出する Service 種類 | LoadBalancer(クラウド)または NodePort(オンプレミス) |
ingressClass.enabled |
IngressClass リソースの自動作成有無 | true |
ingressClass.isDefaultClass |
デフォルト IngressClass とするか | 環境に応じて true / false |
providers.kubernetesCRD.enabled |
Traefik が CRD を監視するか | true |
deployment.replicas |
高可用性のための Pod 数 | 2 以上推奨 |
サンプル values.yaml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
service: type: LoadBalancer annotations: {} ingressClass: enabled: true isDefaultClass: true providers: kubernetesCRD: enabled: true deployment: replicas: 2 podAnnotations: prometheus.io/scrape: "true" prometheus.io/port: "8080" logs: general: level: INFO |
Helm インストールコマンド
上記 values.yaml を保存したら、次のコマンドで Traefik をデプロイします。
|
1 2 3 4 |
helm install traefik traefik/traefik \ -n traefik --create-namespace \ -f values.yaml |
インストール完了後は以下で Pod の稼働状況を確認してください。
|
1 2 |
kubectl get pods -n traefik -o wide |
IngressRoute と Let’s Encrypt 設定例
HTTP/HTTPS ホストベースルーティング
IngressRoute を用いると、ホスト名ごとに異なるバックエンドへ安全に振り分けられます。以下は基本的な構成例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: demo-ingressroute namespace: default spec: entryPoints: - web - websecure routes: - match: Host(`app.example.com`) kind: Rule services: - name: app-service port: 80 tls: certResolver: myresolver # 後述の ACME 設定と紐付け |
websecure エントリポイントは TLS 終端を行い、certResolver が自動取得した証明書を使用します。
CertResolver と ACME の設定
HTTP‑01 チャレンジ(シンプルな構成)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apiVersion: traefik.io/v1alpha1 kind: TLSStore metadata: name: default --- apiVersion: traefik.io/v1alpha1 kind: CertificateResolver metadata: name: myresolver spec: acme: email: admin@example.com storage: /data/acme.json httpChallenge: entryPoint: web |
DNS‑01 チャレンジ(Cloudflare 例)
|
1 2 3 4 5 6 7 8 9 10 11 |
apiVersion: traefik.io/v1alpha1 kind: CertificateResolver metadata: name: myresolver spec: acme: email: admin@example.com storage: /data/acme.json dnsChallenge: provider: cloudflare |
storage パスは永続ボリュームにマウントし、Pod 再起動後も ACME データが保持されるようにします。
Middleware の活用例
Traefik の Middleware は独立した CRD として定義し、IngressRoute から参照するだけで機能を追加できます。以下は代表的なミドルウェアです(コメントは英語のみ)。
BasicAuth
|
1 2 3 4 5 6 7 8 |
apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: auth-basic spec: basicAuth: secret: basic-auth-secret # Secret にユーザ情報を格納 |
|
1 2 3 4 5 6 7 8 9 |
apiVersion: v1 kind: Secret metadata: name: basic-auth-secret type: Opaque stringData: users: | admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkHaL2K5Y/ |
RateLimit
|
1 2 3 4 5 6 7 8 9 |
apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: ratelimit spec: rateLimit: average: 100 # 平均リクエスト数 / 秒 burst: 50 # バースト上限 |
RedirectScheme(HTTPS 強制)
|
1 2 3 4 5 6 7 8 9 |
apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: redirect-https spec: redirectScheme: scheme: https permanent: true |
Retry
|
1 2 3 4 5 6 7 8 9 |
apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: retry spec: retry: attempts: 3 initialInterval: "500ms" |
IngressRoute にミドルウェアを組み込む例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
spec: routes: - match: Host(`secure.example.com`) kind: Rule middlewares: - name: auth-basic - name: ratelimit - name: redirect-https - name: retry services: - name: secure-service port: 80 |
デバッグとトラブルシューティング
問題が発生した際は、Pod の状態、Traefik ログ、CRD のステータスを順に確認すると原因特定が容易です。
| コマンド | 用途 |
|---|---|
kubectl get pods -n traefik -o wide |
Pod が正常起動しているか確認 |
kubectl logs -n traefik <pod-name> |
Traefik 本体のログ取得(エラーや ACME 状態) |
curl -k https://app.example.com |
TLS 終端が機能しているか手動検証 |
kubectl describe ingressroute demo-ingressroute -n default |
CRD のイベントとステータス確認 |
ログ例(ACME 証明書取得成功)
|
1 2 |
time="2024-06-29T10:15:23Z" level=info msg="Certificate obtained for example.com" |
よくある落とし穴と対策チェックリスト
- IngressClass 名の衝突
-
ingressClass.isDefaultClassを明示的に設定し、他コントローラと重複しない名前(例:traefik-public)を使用。 -
CRD バージョン不一致
-
Helm チャートが提供する CRD は
apiVersion: traefik.io/v1alpha1(K8s 1.27+ で安定)。古いv1beta1を参照しないように注意。 -
TLS シークレットへの権限不足
- Traefik の ServiceAccount に
secretのget/list権限を付与する RoleBinding を作成。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: traefik-secret-access namespace: traefik subjects: - kind: ServiceAccount name: traefik namespace: traefik roleRef: kind: Role name: secret-reader apiGroup: rbac.authorization.k8s.io |
まとめ
- 軽量かつ動的:公式ベンチマークでメモリ使用量は NGINX の約 60 %(120 MiB vs 200 MiB)と実証済み。
- CRD による即時反映:
apiVersion: traefik.io/v1alpha1が Kubernetes 1.27+ と完全互換。 - 自動 TLS:ACME クライアントが組み込みで HTTP‑01/DNS‑01 を簡単に設定可能。
- 導入前提:kubectl ≥ v1.27、Helm ≥ v3.14 の最新版を使用し、公式 Helm チャート
traefik/traefik(v3.1.5)でデプロイ。 - Middleware で認証・レートリミット等の付加機能を宣言的に追加でき、トラブル時はログ・CRD ステータス確認が有効。
- 落とし穴回避:IngressClass 名、CRD バージョン、RBAC 設定を事前チェックすれば、安定運用が実現できます。
これらの手順に沿って構築すれば、Kubernetes 環境で信頼性の高い Traefik Ingress を迅速に導入でき、日々の開発・運用業務を大幅に効率化できます。
参考文献
- Traefik Performance Benchmarks – https://doc.traefik.io/traefik/v3.0/performance/benchmark/ (2024‑03)
- Traefik Helm Chart Repository – https://github.com/traefik/helm-charts (最新リリース情報)
- Kubernetes API Deprecations – v1beta1 Removal – https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1beta1-removal (2024‑06)
- Let’s Encrypt ACME Integration in Traefik – https://doc.traefik.io/traefik/v3.0/https/acme/ (公式ドキュメント)