k3s の Traefik Kubernetes Ingress をカスタマイズする
k3s には Traefik Kubernetes Ingress が最初から含まれていて、いきなり Ingress リソースを使える。それはよいのだが、Traefik の設定に関する情報がなかなか見当たらなくて、思ったようにカスタマイズするのに苦戦したのでメモしておく。
なお、この記事の内容は以下のバージョンで確認している。
k3s version v1.26.1+k3s1 (f10af367)go version go1.19.5
まず、そもそも設定を変更する方法がわからなかったのだが、これについてはちゃんとドキュメントに記載があった。
HelmChartConfig
リソースを作成することで、Traefik の HelmChart
のデフォルト値を上書きできる。ドキュメントでは /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
にファイルを作ると書かれているが、試した感じだと Argo CD で管理するようにしても特に問題なさそう。
次に、その HelmChartConfig
に何を書けばよいのかというところで更に躓いた。これについては、Helm Chart のソースコードを見に行くのと、Treafik のドキュメントを併用して頑張るしかなさそうかなという印象。ネット上の情報を適当に切り貼りして生きている身にはなかなか厳しかった。
- https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml
- Treafik Proxy Documentation
以下に実際に使っている設定をほぼそのまま貼っておく。設定方法の雰囲気を掴むのに役立てば幸いである。
# https://docs.k3s.io/helm#customizing-packaged-components-with-helmchartconfigapiVersion: helm.cattle.io/v1kind: HelmChartConfigmetadata: name: traefik namespace: kube-systemspec: # https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml valuesContent: |- logs: access: # アクセスログを有効にする enabled: true service: spec: # 送信元の IP アドレスを取得できるようにする # シングルノードなら何も考えずに有効にしちゃっても問題ないはず externalTrafficPolicy: "Local" ports: web: forwardedHeaders: # Cloudflare の IP アドレスからアクセスがあった場合に X-Forwarded-* ヘッダを信頼する # https://www.cloudflare.com/ips-v4 # https://www.cloudflare.com/ips-v6 trustedIPs: - 173.245.48.0/20 - 103.21.244.0/22 - 103.22.200.0/22 - 103.31.4.0/22 - 141.101.64.0/18 - 108.162.192.0/18 - 190.93.240.0/20 - 188.114.96.0/20 - 197.234.240.0/22 - 198.41.128.0/17 - 162.158.0.0/15 - 104.16.0.0/13 - 104.24.0.0/14 - 172.64.0.0/13 - 131.0.72.0/22 - 2400:cb00::/32 - 2606:4700::/32 - 2803:f800::/32 - 2405:b500::/32 - 2405:8100::/32 - 2a06:98c0::/29 - 2c0f:f248::/32 middlewares: # Cloudflare 以外からのアクセスをすべて遮断する Middleware を使う # (Middleware リソースは別途定義している) - kube-system-cloudflare-ip-whitelist@kubernetescrd websecure: forwardedHeaders: # https://www.cloudflare.com/ips-v4 # https://www.cloudflare.com/ips-v6 trustedIPs: - 173.245.48.0/20 - 103.21.244.0/22 - 103.22.200.0/22 - 103.31.4.0/22 - 141.101.64.0/18 - 108.162.192.0/18 - 190.93.240.0/20 - 188.114.96.0/20 - 197.234.240.0/22 - 198.41.128.0/17 - 162.158.0.0/15 - 104.16.0.0/13 - 104.24.0.0/14 - 172.64.0.0/13 - 131.0.72.0/22 - 2400:cb00::/32 - 2606:4700::/32 - 2803:f800::/32 - 2405:b500::/32 - 2405:8100::/32 - 2a06:98c0::/29 - 2c0f:f248::/32 middlewares: - kube-system-cloudflare-ip-whitelist@kubernetescrd
apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata: name: cloudflare-ip-whitelist namespace: kube-systemspec: ipWhiteList: # https://www.cloudflare.com/ips-v4 # https://www.cloudflare.com/ips-v6 sourceRange: - 173.245.48.0/20 - 103.21.244.0/22 - 103.22.200.0/22 - 103.31.4.0/22 - 141.101.64.0/18 - 108.162.192.0/18 - 190.93.240.0/20 - 188.114.96.0/20 - 197.234.240.0/22 - 198.41.128.0/17 - 162.158.0.0/15 - 104.16.0.0/13 - 104.24.0.0/14 - 172.64.0.0/13 - 131.0.72.0/22 - 2400:cb00::/32 - 2606:4700::/32 - 2803:f800::/32 - 2405:b500::/32 - 2405:8100::/32 - 2a06:98c0::/29 - 2c0f:f248::/32