Ingress NginxからTraefik Gatewayへの移行ログ

Progress 10 / 18
目次

本記事は、Homelab KubernetesクラスターにおけるIngress NginxからTraefik v3への移行プロセスの記録です。

1. Motivation: 気分転換とMiddleware

今回の移行のきっかけの一つは、Ingress Nginxのサポート終了(EOL)というニュースです。AuthentikからPocket IDへの移行に際し、サポート終了の知らせを思い出し、ついでに対応しておこうと思った次第です。 Homelabなのでそこまで厳密にセキュリティを気にする必要はないのですが、せっかくの機会なので心機一転、新しい環境に移行してみることにしました。ちょうど「春の大掃除」みたいな感覚です。

もう一つの理由は、Traefikの「Middleware」機能への興味です。 Ingress Nginxでは、認証などの追加機能を実装する際に設定が少し複雑になりがちでしたが、TraefikならMiddlewareリソースを使って、もっと手軽に機能拡張ができそうだなと思いました。

本当はついでに認証基盤の「tinyauth」も入れてしまおうと意気込んでいたのですが、IngressRouteの設定やGateway APIへの移行で思いのほかカロリーを使ってしまったので、そっちは次回のお楽しみに取っておくことにします。

2. Installation & Configuration: Helmでサクッとデプロイ

Traefikのデプロイには公式Helm Chartを使いました。 ポイントはこんな感じです。

  • Gateway API Enabled: gatewaykubernetesGateway を有効にして、HTTPRouteリソースを使えるようにしました。
  • LoadBalancer: Traefikサービスに静的IPを固定。
  • Auto-Redirection: HTTPで来たらHTTPSへ飛ばす設定(web -> websecure)を強制的に入れています。

設定ファイル(apps/traefik/values.yaml)の一部はこんな感じです。

traefik:
gateway:
enabled: true
listeners:
websecure:
mode: Terminate
ports:
web:
http:
redirections:
entryPoint:
to: websecure

3. Resource Migration: IngressからHTTPRouteへ

これまで使っていたIngressリソースにお別れを告げ、Kubernetes Gateway API デビューしました。 例えばArgoCDの設定は、ingress.yaml から httproute.yaml にこんな感じで生まれ変わりました。

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: argocd-route
namespace: traefik
spec:
parentRefs:
- name: traefik-gateway
hostnames:
- "argocd.homelab.otama-playground.com"
rules:
- backendRefs:
- name: argocd-server
port: 80

4. Why Gateway API? いろいろあってこうなりました

IngressRouteでのちょっとした躓き

最初はTraefik独自の IngressRoute を使うつもりでした。 ただ、やってみるとLoadBalancerのIPがステータスに上手く反映されなくて、ExternalDNSとうまく連携できないという地味な問題に当たりました。 手動でAnnotationをつければ動くんですけど、毎回それはちょっと面倒だなーと。

Gateway APIへの乗り換え

それならいっそ、Kubernetesの新しい標準である Kubernetes Gateway API に乗っかってしまおう、と方針転換しました。 Ingressの後継と言われているだけあって、将来性もありそうですしね。

実際に使ってみると、書き味はIngressとそんなに変わらないので、すんなり移行できました。今はまだ普通のルーティングしかしていませんが、そのうち高度な機能も試してみたいですね。

IngressRouteで躓いたおかげで、結果的に最新の規格に触れることができたので、まあ結果オーライです。

5. Summary

そんなわけで、無事にIngress NginxからTraefikへの引越しが完了し、Gateway API環境が整いました。 これからは新しいアプリを追加するときも traefik-gateway に紐づけていくことになります。

古くなったシステムを入れ替えて、なんとなく気分もスッキリしました。次は、今回見送った認証周りの整備をのんびりやっていこうと思います。