Helm を使用した Traefik Kubernetes のインストール

🔔 お知らせ: この記事は、GoogleのAIモデルであるGeminiを通じて原文を翻訳し、技術的な内容に基づいてまとめたものです。

オリジナルソース: Traefik 公式ドキュメント (Kubernetes Setup) https://doc.traefik.io/traefik/setup/kubernetes/

このガイドでは、公式の Helm チャートを使用して Kubernetes クラスター内に Traefik Proxy をインストールおよび構成する方法について、詳細な手順を説明します。このガイドでは、以下の内容を扱います。

  • 標準の HTTP (web) および HTTPS (websecure) エントリポイントの構成
  • HTTP から HTTPS への自動リダイレクトの実装
  • 基本認証を使用した Traefik ダッシュボードのセキュリティ設定
  • 設定をテストするためのデモアプリケーションのデプロイ
  • その他の主要な構成オプションの探索

前提条件

  • Kubernetes クラスター
  • Helm v3
  • Kubectl

クラスターの作成

Kubernetes クラスターがまだない場合は、K3d を使用して作成できます。

k3d cluster create traefik 
  --port 80:80@loadbalancer 
  --port 443:443@loadbalancer 
  --port 8000:8000@loadbalancer 
  --k3s-arg "--disable=traefik@server:0"

ポート 80 および 443 はホストから Traefik にアクセスするために使用され、ポート 8000 は後のデモのために空けておきます。k3s に組み込まれている Traefik は、競合を避けるために無効にします。

コンテキストを確認します

kubectl cluster-info --context k3d-traefik

次のような結果が出力されるはずです。

Kubernetes control plane is running at CoreDNS is running at Metrics-server is running at

クラスターの問題をさらにデバッグおよび診断するには、kubectl cluster-info dump を使用してください。


チャートリポジトリとネームスペースの追加

Helm を使用すると、Kubernetes アプリケーションのデプロイを簡素化できます。Helm はアプリケーションを「チャート」としてパッケージ化します。これは、Kubernetes リソースを記述するテンプレートファイルの集まりです。管理とカスタマイズを容易にするために、公式の Traefik Helm チャートを使用します。

helm repo add traefik https://traefik.github.io/charts
helm repo update
kubectl create namespace traefik

最初のコマンドは、公式チャートの場所を指す traefik リポジトリのエイリアスを登録します。2 番目のコマンドはローカルキャッシュを更新し、構成されているすべてのリポジトリから最新のチャートリストとバージョンが利用可能であることを確認します。


ローカル自己署名 TLS シークレットの生成

Traefik のゲートウェイリスナーが HTTPS プロトコルを使用するたびに、証明書が必要です。ローカル開発のために、使い捨ての自己署名証明書を生成し、それを local-selfsigned-tls という名前の Kubernetes シークレットに保存します。ゲートウェイはこのシークレットを参照して、websecure リスナーで TLS を終端します。

# 1) *.docker.localhost に有効な自己署名証明書を生成
openssl req -x509 -nodes -days 365 -newkey rsa:2048 
  -keyout tls.key -out tls.crt 
  -subj "/CN=*.docker.localhost"

# 2) traefik ネームスペースに TLS シークレットを作成
kubectl create secret tls local-selfsigned-tls 
  --cert=tls.crt --key=tls.key 
  --namespace traefik

この作業が必要な理由 ゲートウェイの HTTPS リスナーは、certificateRefs を介してこのシークレットを参照します。これがないと、Helm チャートの検証が失敗し、HTTP→HTTPS リダイレクトチェーンが切断されます。

運用環境のヒント 上記の自己署名証明書は、ローカル開発用にのみ使用してください。運用環境では、組織の CA から発行された証明書をシークレットに保存するか、cert-manager や Traefik の ACME (Let’s Encrypt) などの自動発行ツールを使用して、必要に応じて証明書を生成してください。クライアントが信頼できる証明書を受け取り、ブラウザの警告が表示されないように、websecure リスナーの certificateRefs を更新するか、traefik.io/tls.certresolver を使用してください。


Helm チャート設定値 (Values) の準備

次の内容を含む values.yaml ファイルを作成します。

# ネットワークポートとエントリポイントの構成
# エントリポイントは、受信トラフィックのためのネットワークリスナーです。
ports:
  # 'web' という名前の HTTP エントリポイントを定義
  web:
    port: 80
    nodePort: 30000
    # このエントリポイントのすべてのトラフィックを 'websecure' エントリポイントにリダイレクトするよう指示
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true

  # 'websecure' という名前の HTTPS エントリポイントを定義
  websecure:
    port: 443
    nodePort: 30001

# セキュリティモードでダッシュボードを有効化
api:
  dashboard: true
  insecure: false

ingressRoute:
  dashboard:
    enabled: true
    matchRule: Host(`dashboard.docker.localhost`)
    entryPoints:
      - websecure
    middlewares:
      - name: dashboard-auth

# ダッシュボードセキュリティのための BasicAuth ミドルウェアとシークレットを作成
extraObjects:
  - apiVersion: v1
    kind: Secret
    metadata:
      name: dashboard-auth-secret
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: "P@ssw0rd" # 実際のパスワードに置き換えてください
  - apiVersion: traefik.io/v1alpha1
    kind: Middleware
    metadata:
      name: dashboard-auth
    spec:
      basicAuth:
        secret: dashboard-auth-secret

# 代わりに Gateway API でルーティングします。
ingressClass:
  enabled: false

# Gateway API プロバイダーを有効にし、KubernetesIngress プロバイダーを無効にする
# プロバイダーは、Traefik にルーティング設定を見つける場所を伝えます。
providers:
  kubernetesIngress:
    enabled: false
  kubernetesGateway:
    enabled: true

## 게이트웨이 리스너
gateway:
  listeners:
    web: # エントリポイント `web` に一致する HTTP リスナー
      port: 80
      protocol: HTTP
      namespacePolicy:
        from: All
    websecure: # エントリポイント `websecure` に一致する HTTPS リスナー
      port: 443
      protocol: HTTPS # TLS は Traefik 内部で終端されます
      namespacePolicy:
        from: All
      mode: Terminate
      certificateRefs:
        - kind: Secret
          name: local-selfsigned-tls # インストール前に作成したシークレット
          group: ""

# 可観測性を有効化
logs:
  general:
    level: INFO
  # アクセスログを有効にし、デフォルトで Traefik の標準出力にエクスポートします。
  access:
    enabled: true

# メトリクス用の Prometheus を有効化
metrics:
  prometheus:
    enabled: true

Helm 設定を使用した Traefik のインストール

次に、Helm クライアントを使用して構成を適用します。

# 'traefik' ネームスペースにチャートをインストール
helm install traefik traefik/traefik 
  --namespace traefik 
  --values values.yaml

コマンドの説明:

  • helm install traefik: Helm に traefik という名前の新しいリリースをインストールするよう指示します。
  • traefik/traefik: 使用するチャートを指定します (以前に追加した traefik リポジトリの traefik チャート)。
  • –namespace traefik: インストールする Kubernetes ネームスペースを指定します。専用のネームスペースを使用することをお勧めします。
  • –values values.yaml: values.yaml ファイルのカスタム構成を適用します。

ダッシュボードへのアクセス

Traefik がデプロイされたので、 でダッシュボードにアクセスできます。このリンクにアクセスすると、ブラウザでユーザー名とパスワードの入力を求められます。values.yaml ファイルで設定した認証情報を使用してログインしてください。ログインに成功すると、ダッシュボードが表示されます。


デモアプリケーションのデプロイ

設定をテストするために、Kubernetes クラスターに Traefik whoami アプリケーションをデプロイします。whoami.yaml ファイルを作成し、次の内容を貼り付けます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: traefik
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: traefik
spec:
  selector:
    app: whoami
  ports:
    - port: 80

マニフェストを適用します。

kubectl apply -f whoami.yaml

アプリケーションのデプロイ後、Gateway API HTTPRoute を作成してアプリケーションを外部に公開できます。whoami-route.yaml ファイルを作成し、次の内容を貼り付けます。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami
  namespace: traefik
spec:
  parentRefs:
    - name: traefik-gateway # Gateway API プロバイダーが有効な場合に Traefik が作成する Gateway の名前
  hostnames:
    - "whoami.docker.localhost"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: whoami
          port: 80

マニフェストを適用します。

kubectl apply -f whoami-route.yaml

マニフェスト適用後、Traefik ダッシュボードの Routes セクションに移動すると、 ルートが作成されていることを確認できます。

curl を使用してアプリケーションをテストできます。

curl -k https://whoami.docker.localhost/

ブラウザで にアクセスして、サービスの JSON ダンプを確認することもできます。


その他の主要な構成領域

上記の設定は安全な基盤を提供しますが、Traefik はさらに多くの機能を提供します。以下は、Helm values.yaml のオーバーライドを使用したいくつかの重要な構成の概要です。

TLS 証明書管理 (Let’s Encrypt)

websecure エントリポイントでは TLS がデフォルトで有効になっていますが、現在有効な証明書はありません。Traefik は ACME プロトコルを使用して、Let’s Encrypt から TLS 証明書を自動的に取得および更新できます。

values.yaml の追加例:

additionalArguments:
  - "--certificatesresolvers.le.acme.email=your-email@example.com"
  - "--certificatesresolvers.le.acme.storage=/data/acme.json"
  - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"

persistence:
  enabled: true
  name: data
  size: 1Gi
  storageClass: ""

####

運用環境での Let’s Encrypt

Let’s Encrypt は、ポート 80 (HTTP-01) または DNS プロバイダーの API (DNS-01) を介してアクセス可能なパブリック IP アドレスを指すホスト名に対してのみ証明書を発行できます。*.docker.localhost の例を実際に所有するドメインに置き換え、DNS レコードを作成してください。

Gateway API と ACME

Traefik の組み込み ACME 統合は IngressRoute および Ingress リソースで機能しますが、Gateway API リスナーに対しては証明書を発行しません。Gateway API を使用する場合は、cert-manager をインストールし、gateway.listeners.websecure.certificateRefs で生成されたシークレットを参照してください。

####

メトリクス (Prometheus)

Traefik は、パフォーマンスとトラフィックの監視に不可欠な Prometheus 形式の詳細なメトリクスを公開できます。

values.yaml の追加例:

metrics:
  prometheus:
    entryPoint: metrics
    addRoutersLabels: true
    addServicesLabels: true

####

トレース (OTel)

分散トレースは、Traefik 自体を含むシステムを通過するリクエストのレイテンシとフローを理解するのに役立ちます。

values.yaml の追加例:

additionalArguments:
  - "--tracing.otel=true"
  - "--tracing.otel.grpcendpoint=otel-collector.observability:4317"

###

結論

この構成により、安全なダッシュボードアクセス、HTTPS リダイレクト、および可観測性と TLS 有効化のための基盤を備えた Traefik が設定されました。


Comments

コメントを残す

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