k3s ではデフォルトで Traefik がインストールされ Ingress などのリソースが使用できます。この環境で Ingress を使ってサービスをインターネットに公開しているときに、
HTTP で接続してきたクライアントを HTTPS へリダイレクトさせる方法をまとめます。
k3s のバージョン 1.35.4+k3s1 で動作確認しています。以下のサイトを参考にしています:
- https://blog.differentpla.net/blog/2023/01/06/traefik-https-redirect/
- https://github.com/jbdoumenjou/ingress-redirect/blob/33ee92e2ba2b1b7bed67623fe812914785267de8/conf/ingresses.yml
まず 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 用で、annotations の traefik.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 を使うなら何でも良い