
KubernetesのIngressをHTTPS化する方法—シークレットの作成から設定まで
ウェブサイトを運営していると、「この接続は安全ではありません」と表示されることがありますよね。特に重要なデータを扱う場合、セキュリティ対策としてHTTPS対応は欠かせません。
Kubernetes環境でも同じようにHTTPSを設定する必要がありますが、最初は「TLS証明書?シークレット?どうすればいいの?」と戸惑うかもしれません。
この記事では、KubernetesのIngressにHTTPSを設定するための手順を具体的に見ていきます。TLS証明書の管理やIngressの設定が初めての方でも、順を追って理解できるようにまとめていきます。
1. 秘密鍵と証明書を準備する
まずはHTTPS通信に必要なTLS証明書と秘密鍵を用意します。これらは、サーバーとクライアント間の通信を暗号化し、安全性を高めるために使われます。
(1) 認証機関から証明書を取得する
Let's Encryptなどの認証機関から正式な証明書を取得するのが一般的です。たとえば、Certbotを使えば無料で証明書を発行できます。
sudo certbot certonly --standalone -d example.com
このコマンドで生成されるfullchain.pemとprivkey.pemを、それぞれtls.crtとtls.keyにリネームして使用します。
(2) 自己署名証明書を作成する
テスト用途や内部ネットワーク向けには、自己署名証明書を作る方法もあります。以下のコマンドを使えば、簡単に作成できます。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt
このとき、質問される項目には適切な値を入力してください。特にCommon Name (CN)はドメイン名(例: example.com)に設定する必要があります。
(3) ファイルの確認
作成したtls.crtとtls.keyは、Kubernetesのシークレット作成時に使います。
2. TLSシークレットの作成
準備した証明書と秘密鍵を使って、TLSシークレットをKubernetesに登録します。
(1) コマンドの概要
以下のコマンドでTLSシークレットを作成します。
kubectl -n <namespace> create secret tls <secret-name> --key <tls-key-file> --cert <tls-cert-file>
(2) 各項目の説明
<namespace>: シークレットを作成するネームスペース名を指定します。
<secret-name>: 作成するシークレットの名前を設定します。この名前は後でIngressリソースで参照するため、覚えやすいものにしましょう。
<tls-key-file>: サーバーの秘密鍵ファイルのパスを指定します。
<tls-cert-file>: サーバー証明書ファイルのパスを指定します。
(3) 実行例
たとえば、my-namespaceというネームスペースにmy-tls-secretという名前のシークレットを作成する場合は次のように実行します。
kubectl -n my-namespace create secret tls my-tls-secret --key tls.key --cert tls.crt
これで、TLSシークレットが作成されました。
3. Ingressの設定
次に、このシークレットを使ってIngressリソースをHTTPS化します。
(1) YAMLファイルの例
以下のようなIngressリソースを作成します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: my-namespace
spec:
tls:
- hosts:
- example.com
secretName: my-tls-secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
(2) ポイント解説
tlsセクション:
hosts: HTTPSでアクセスされるドメイン名を指定します。
secretName: 先ほど作成したシークレットの名前を指定します。
rulesセクション:
通常のHTTPルールを定義します。TLS設定と組み合わせることで、HTTPS経由でもリクエストを受け付けるようになります。
4. 設定を適用して動作確認
設定が完了したら、次のコマンドでIngressを適用します。
kubectl apply -f ingress.yaml
適用後、ブラウザでhttps://example.comにアクセスしてみましょう。証明書エラーが出なければ成功です!
5. トラブルシューティング
(1) HTTPSにアクセスできない場合
証明書の期限切れを確認
証明書の有効期限が切れていないか、以下のコマンドでチェックします。openssl x509 -in tls.crt -text -noout
Ingressコントローラーのログを確認
ログでエラーの原因を探ります。kubectl logs -n kube-system <ingress-controller-pod>
(2) 自己署名証明書を使用している場合
ブラウザによっては警告が表示されることがあります。内部用途の場合はそのままでも問題ありませんが、外部公開する場合は認証局から発行された証明書を使うようにしましょう。
まとめ
KubernetesのIngressをHTTPS化する流れを見てきました。
TLS証明書と秘密鍵を準備する
TLSシークレットを作成する
Ingressの設定ファイルでシークレットを参照する
適用後、動作を確認する
最初は証明書やシークレットの扱いに戸惑うかもしれませんが、一度設定すればセキュアな通信環境を簡単に作れます。
HTTPS対応は、訪問者やサービス利用者に「安心して使えるサイトだ」という信頼感を与える大切なステップです。手順を参考にしながら、セキュリティ対策を進めてみてください。