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 が行ってくれるので非常に便利です。