Kubernetes 環境にて Let’s Encrypt + cert-manager + Ingress で web サイトを HTTPS 化する

Let’s Encrypt は無料の認証局で、 web サイトの HTTPS(SSL/TSL) 有効化に必要なデジタル証明書を発行してくれます。 Kubernetes 環境にて Let’s Encrypt を活用した、 Ingress の SSL/TSL の終端方法について紹介します。
必要なオブジェクトは cert-manager , Issuer , Ingress の3つです。 cert-manager は Helm もしくは公式サイトから用意された manifest をインストールしますので、手を加えるのは Issuer と Ingress の2つです。

Let’s Encrypt などの認証局から証明書を発行するには は issuer (発行者) が必要です。Issuer と ClusterIssuer の違いは 名前空間の属し方です。Issuer は単一名前空間に属しますが、 ClusterIssuer は異なる名前空間の証明書リソースから参照できます。

cert-manager のインストール

今回は公式サイトから最新の安定版を kubectl でインストールします。インストールする際は公式サイトを確認してください。
https://cert-manager.io/docs/installation/kubectl/

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml

Issuer もしくは Cluster Issuer を作成

今回は ClusterIssuer で作成しています。 また Let’s Encrypt には レート制限 があります。
https://letsencrypt.org/ja/docs/rate-limits/
制限1例ですが、検証に失敗した場合は1アカウント、1ホスト名、につき1時間毎に5回までといった制限があります。レート制限に引っかかった場合、制限をリセットする方法はなく最短で7日間待つ必要があります。気になる場合は spec/acme/server のコメントアウトしている staging 環境の api を利用し検証してください。
変更箇所は spec/acmes/email に EmailAdress を入力してください。 spec/acme/privateKeySecretRef に secret の名前を入れると cert-manager が secret を作成します。 spec/acme/solvers/http01 の ingress class は ingress contoroller の ingress class を入力してください。


apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: cluster-issuer
spec:
  acme:
    email: example@aimhighergg.com # your emailadress
    server: https://acme-v02.api.letsencrypt.org/directory
    #server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: www-aimhighergg-com-cluster-issuer-secret # # Managed by cert-manager. cert-manager create secret name.
    solvers:
    - http01:
        ingress:
          class: nginx # Ingress-Controller の ingress class を確認

Ingress TLS を作成

metadata/annotations に ingress.class 名と cluster-issuer のシークレット名前を記載します。あとは hosts や sevice 名を記載します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-tls
  namespace: www-aimhighergg-com
  annotations:
    cert-manager.io/cluster-issuer: cluster-issuer
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - www.aimhighergg.com # ドメイン記載
    secretName: www-aimhighergg-com-tls-secret # cert-managerはこのシークレットに作成した証明書を格納する
  rules:
  - host: www.aimhighergg.com # ドメイン記載
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: frontend # frontend の service name を記載
            port:
              number: 80

状態確認

以下のコマンドで対象の certificate を確認し、 READY ステータスが True となっていれば成功です。

kubectl get cert -A

ブラウザからドメインにアクセスすれば HTTPS が有効になっていることが確認できると思います。

以上で Let’s Encrypt + cert-manager + Ingress を活用した HTTPS の有効化 の紹介でした。
cert-manager をインストールすれば、 issuer と Ingress-TLS を用意するだけで 1分ほどで HTTPS 化されます。一番めんどくさい証明書の更新なども cert-manager が行ってくれるので非常に便利です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です