blog.anqou.net
rss
author
tags

k3s の Traefik で HTTP から HTTPS へリダイレクト

k3s ではデフォルトで Traefik がインストールされ Ingress などのリソースが使用できます。この環境で Ingress を使ってサービスをインターネットに公開しているときに、 HTTP で接続してきたクライアントを HTTPS へリダイレクトさせる方法をまとめます。 k3s のバージョン 1.35.4+k3s1 で動作確認しています。以下のサイトを参考にしています:

まず Ingress を作りたい namespace と同じ namespace に以下のような Middleware リソースを作成します:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: your-system-redirect
  namespace: your-namespace
spec:
  redirectScheme:
    permanent: true
    scheme: https

次いで Ingress を 2 つ作ります。1 つ目は HTTP 用で、annotationstraefik.ingress.kubernetes.io/router.middlewares に先程作った Middleware リソースの名前と namespace を並べたものを指定します:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
    traefik.ingress.kubernetes.io/router.middlewares: your-namespace-your-system-redirect@kubernetescrd
  name: your-system-http
  namespace: your-namespace
spec:
  rules:
    - host: your-system.example.com
      http:
        paths:
          - backend:
              service:
                name: your-system-server
                port:
                  number: 80
            path: /
            pathType: Prefix

もう一つ、HTTPS 用の Ingress を作ります。cert-manager を使って TLS 証明書の発行を行う場合、こちらに cert-manager.io/cluster-issuer のアノテーションをつけます:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: your-cluster-issuer
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
  name: your-system-https
  namespace: your-namespace
spec:
  ingressClassName: traefik
  rules:
    - host: your-system.example.com
      http:
        paths:
          - backend:
              service:
                name: your-system-server
                port:
                  number: 80
            path: /
            pathType: Prefix
  tls:
    - hosts:
        - your-system.example.com
      secretName: your-system-example-com-tls # cert-manager を使うなら何でも良い