コロナでアドカレ完走ギリギリになりました。
日付過ぎて申し訳ないです...
記事の内容は保証するのであとは笑ってください()
みなさんこんにちは、 コロナでぶっ倒れた あかつきゆいとです。
おそらくK8sユーザーの中にはNext.jsを動かしている方もだいぶいるでしょう。
今回はNext.jsのコンテナを動かしてIngressで公開しようとしてハマったお話です。
IngressとCertmanagerとは
K8sユーザーの皆さんなら一度は耳にしたことがあるでしょう。
Ingressというのは、要はリバースプロキシみたいなことをしてくれるもので、これをサービスに紐つけておけば、一つのExternalIPで複数のサービスをドメイン振り分けで使うことができるものです。
そして、Certmanagerというのは、そのIngressを使用する上で、勝手にSSL化してくれるシステムです。
今回はそのCertmanagerの設定でつまづいた話です。
CertmanagerやIngressのインストールに関しては今回は紹介しませんのでご注意ください。
ことのあらまし
ぼく「よし、自分のプロフサイト、デプロイしちゃうよ〜!!」
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: yuito-work
labels:
name: yuito-work
annotations:
# http01でACME認証するClusterIssuer
cert-manager.io/cluster-issuer: le-http-prod
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: www.yuito.work
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: yuito-work
port:
number: 80
tls:
- hosts:
- yuito.work
- www.yuito.work
secretName: yuito-work-tls
Certmanager「ACME通りませんでした。」
ぼく「ha?」
原因を調査する
まずはログを調査してみることに...
“GET /.well-known/acme-challenge/WWVTqAHf89uqumxI02ti1I_GGhBE7B2QbfoZJIltZGI HTTP/1.1” 404 ...
何やら、ACMEの.well-known
に対して404が出ている模様...
Chromeでアクセスしてみたり、Curlでアクセスしてみると、Next.jsの404が出ていることが判明...
そう、原因は、 Next.jsの404ページもIngressのリバースプロキシ範囲に含まれてしまっている ことだ。
解決法
Ingressの設定項目について、いろいろ調べてみると、正規表現が使える模様...
正規表現を最大限に使って.well-known
を除外してみます。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: yuito-work
labels:
name: yuito-work
annotations:
# http01でACME認証するClusterIssuer
cert-manager.io/cluster-issuer: le-http-prod
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
+ nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- host: www.yuito.work
http:
paths:
- pathType: Prefix
+ path: /(?!\.well-known/.+)(.*)
- path: /
backend:
service:
name: yuito-work
port:
number: 80
tls:
- hosts:
- yuito.work
- www.yuito.work
secretName: yuito-work-tls
これで除外することができました。
現在は
そもそも、現在はCloudflareを通してClusterIssuerをCloudflareのdns-01にしているので今は使っていません。
Cloudflareの話に関しては以下をご覧ください。
最後に
これを治すのに2時間くらいぐるぐるしていたので、そういう方の助けになればなと思います。
ちなみに今回のサイトやマニュフェストファイルなどは、以下のものです。
よければアクセスしてみてください。