【ITニュース解説】Setting Up HTTPS on Kubernetes with cert-manager and Let's Encrypt
2025年09月17日に「Dev.to」が公開したITニュース「Setting Up HTTPS on Kubernetes with cert-manager and Let's Encrypt」について初心者にもわかりやすく解説しています。
ITニュース概要
Kubernetesクラスター上でウェブサイトのHTTPS化は必須だ。cert-managerとLet's Encryptを使い、SSL証明書の取得と更新を自動化してセキュアな通信を実現する設定手順を詳細に解説する。
ITニュース解説
現代のデジタル環境において、ウェブアプリケーションのセキュリティは非常に重要であり、HTTPSの利用は必須となっている。HTTPSは、ウェブサイトとユーザー間でやり取りされるデータを暗号化し、情報が盗まれたり改ざんされたりするのを防ぐことで、ユーザーのプライバシーを保護し、ウェブサイトへの信頼を築き、最新のセキュリティ基準に準拠することを可能にする。
コンテナ化されたアプリケーションを管理するKubernetesクラスタで、外部からのアクセスポイントであるIngressに対してHTTPSを有効にするには、SSL/TLS証明書が必要となる。この証明書は、ウェブサイトの身元を保証し、暗号化通信を可能にするデジタルな鍵のようなものだ。通常、この証明書の取得や更新は手間のかかる作業だが、Let's Encryptというサービスを使えば無料で証明書を取得できる。さらに、Kubernetes環境においてこの証明書の取得、更新、管理といった一連のプロセスを自動化するための強力なツールがcert-managerである。この記事では、cert-managerとLet's Encryptを組み合わせて、KubernetesクラスタのIngressでHTTPSを自動的に設定する方法について解説する。
この設定を行うには、いくつかの前提条件がある。まず、外部からのトラフィックをクラスタ内のサービスに振り分ける役割を持つNginx Ingress Controllerが既にデプロイされたKubernetesクラスタが用意されていること。次に、クラスタの外部IPアドレスに紐づけられた登録済みのドメイン名が必要となる。例えば「platform-dev.example.ai」のようなドメインが、クラスタが公開しているIPアドレスを指している必要がある。そして、Kubernetesクラスタにアクセスするためのコマンドラインツールであるkubectlが設定済みであることも重要だ。
これらの準備が整ったら、HTTPS設定の最初のステップとして、cert-managerがクラスタにインストールされているかを確認する。cert-managerは、Kubernetes環境で証明書の管理を効率化するKubernetesネイティブなツールだ。確認するには、特定のコマンドを実行し、もし「cert-manager」という名前空間に3つのPodが稼働していれば、インストールは完了している。もし見つからない場合は、提供されている設定ファイルを適用するコマンドを実行して、最新版のcert-managerをクラスタにデプロイする必要がある。インストール後、再度Podの状態を確認し、cert-managerが正しく動作していることを確認する。
次に、cert-managerがLet's Encryptから証明書を取得するための設定を行う。これは「ClusterIssuer」というKubernetesリソースを作成することで実現する。ClusterIssuerは、cert-managerがどの認証局からどのように証明書を取得するかを定義するものだ。今回は、Let's Encryptのプロダクション環境のACMEサーバーと通信するためのletsencrypt-prodという名前のClusterIssuerを設定する。ここで特に重要なのが、ACMEサーバーのURLをhttps://acme-v02.api.letsencrypt.org/directoryと正しく指定することだ。誤ったURLを使うと証明書が発行されないため、注意が必要である。また、Let's Encryptからの通知を受け取るためのメールアドレスも設定する。この設定をYAML形式で記述し、クラスタに適用する。設定が完了したら、特定のコマンドで、そのClusterIssuerがREADY: Trueという状態になっているかを確認する。これがTrueであれば、cert-managerがLet's Encryptと連携する準備ができたことになる。
ClusterIssuerが準備できたら、実際にHTTPSを有効にしたいIngressリソースの設定を変更する。Ingressは、外部からのアクセスをクラスタ内のサービスに振り分けるためのルールを定義する。このIngressに、cert-managerが証明書を自動で取得・適用するための特定の指示(アノテーション)と、HTTPS通信のためのTLS設定を追加する。アノテーションのcert-manager.io/cluster-issuer: letsencrypt-prodは、このIngressが使用する証明書をletsencrypt-prodという名前のClusterIssuerから取得するようcert-managerに伝えるものだ。また、tlsセクションでは、HTTPSを有効にしたいドメイン名と、取得したSSL証明書を保存するKubernetesのSecretの名前を指定する。このSecretは、証明書が発行されるとcert-managerによって自動的に作成・管理される。Ingressの設定をYAML形式で記述し、クラスタに適用すると、cert-managerはこの設定を検知し、Let's Encryptに対して証明書の発行リクエストを開始する。
Ingressを設定した後、cert-managerが実際に証明書を発行したかを確認する。これには、特定のコマンドを使用する。ここで、example-tlsという名前の証明書リソースのREADYステータスがTrueになっていれば、証明書がLet's Encryptから正常に発行され、対応するSecretに保存されたことを意味する。さらに詳細な情報が必要な場合は、別のコマンドで、証明書の発行プロセスや現在の状態を確認できる。
もし証明書が正常に発行されない場合、いくつかの一般的な問題とその解決策がある。まず、最もよくあるのがClusterIssuerがREADY: Trueになっていないケースだ。この場合、ClusterIssuerの詳細を確認し、イベントやステータスをチェックする。多くの場合、Let's EncryptのACMEサーバーURLが間違っていることが原因であるため、正しいURLが設定されているかを確認する必要がある。次に、証明書がPending(保留中)のままになる問題がある。これは、Let's Encryptがドメインの所有権を確認するACMEチャレンジというプロセスが失敗している可能性が高い。証明書の詳細を確認し、さらにcert-managerのログを調べてエラーメッセージを確認すると良い。また、DNSの設定に問題がないか確認することも重要だ。ドメイン名がKubernetesクラスタの外部IPアドレスに正しく解決されているかを、クラスタ内からコマンドなどでテストすると良いだろう。Let's EncryptのACMEサーバーへの接続性を確認することも有効な診断方法だ。
すべての設定が完了し、証明書が正常に発行されたことを確認できたら、実際にウェブサイトがHTTPSでアクセスできるかを確認する。特定のコマンドで、HTTPSのレスポンスヘッダを確認したり、別のコマンドで、取得したSSL証明書の詳細を確認したりできる。これらのテストでHTTPSが正しく機能していれば、設定は成功だ。
Let's Encryptから発行される証明書は90日間有効だが、cert-managerはこの証明書の有効期限が切れる約30日前に自動的に更新してくれるため、手動で更新作業を行う必要はない。証明書の更新状況は、証明書の詳細を確認するコマンドで確認できる。セキュリティをさらに強化するため、Let's Encryptからの重要な通知を見逃さないよう、ClusterIssuerに設定したメールアドレスは常に監視されているものを使用すると良い。また、cert-managerが管理するTLS Secretは自動で更新されるため、手動で変更することは避けるべきだ。さらに、HTTPでアクセスしてきたユーザーを自動的にHTTPSにリダイレクトさせるには、Ingressのアノテーションにnginx.ingress.kubernetes.io/ssl-redirect: "true"を追加することを推奨する。
この一連の手順を踏むことで、KubernetesクラスタのIngressにHTTPSを成功裏に設定し、Let's Encryptによって自動管理されるSSL証明書でドメインを保護できる。これにより、ウェブアプリケーションのセキュリティが確保され、ユーザーは安心してサービスを利用できるようになるだろう。cert-managerが証明書の更新を自動で処理してくれるため、開発者はアプリケーション開発に集中でき、堅牢なセキュリティ体制を維持できるのだ。