3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

N高グループ・N中等部Advent Calendar 2024

Day 24

【K8s】Next.jsをK8sのIngressで動かしてSSLでハマった話

Last updated at Posted at 2024-12-25

コロナでアドカレ完走ギリギリになりました。
日付過ぎて申し訳ないです...
記事の内容は保証するのであとは笑ってください()

みなさんこんにちは、 コロナでぶっ倒れた あかつきゆいとです。
おそらくK8sユーザーの中にはNext.jsを動かしている方もだいぶいるでしょう。
今回はNext.jsのコンテナを動かしてIngressで公開しようとしてハマったお話です。

IngressとCertmanagerとは

K8sユーザーの皆さんなら一度は耳にしたことがあるでしょう。
Ingressというのは、要はリバースプロキシみたいなことをしてくれるもので、これをサービスに紐つけておけば、一つのExternalIPで複数のサービスをドメイン振り分けで使うことができるものです。
そして、Certmanagerというのは、そのIngressを使用する上で、勝手にSSL化してくれるシステムです。

今回はそのCertmanagerの設定でつまづいた話です。

CertmanagerやIngressのインストールに関しては今回は紹介しませんのでご注意ください。

ことのあらまし

ぼく「よし、自分のプロフサイト、デプロイしちゃうよ〜!!」

ingress.yaml
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を除外してみます。

ingress.yaml
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時間くらいぐるぐるしていたので、そういう方の助けになればなと思います。

ちなみに今回のサイトやマニュフェストファイルなどは、以下のものです。
よければアクセスしてみてください。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?