monolithic kernel

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 のドキュメントを併用して頑張るしかなさそうかなという印象。ネット上の情報を適当に切り貼りして生きている身にはなかなか厳しかった。

以下に実際に使っている設定をほぼそのまま貼っておく。設定方法の雰囲気を掴むのに役立てば幸いである。

traefik-config.yaml
# https://docs.k3s.io/helm#customizing-packaged-components-with-helmchartconfig
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  # 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
cloudflare-ip-whitelist.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: cloudflare-ip-whitelist
  namespace: kube-system
spec:
  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

Related articles