このページでは、Ingress オブジェクトを使用して、Google マネージド SSL 証明書を構成して外部ロードバランサを作成する方法を説明します。このような証明書は、ドメイン名に対して Google がプロビジョニング、更新、管理するドメイン認証(DV)証明書です。この証明書は個人 ID や組織 ID を示すものではありません。
このページは、ネットワーク セキュリティの計画と実装、セキュリティ ポリシーの開発と維持を行うネットワーク スペシャリストとセキュリティ スペシャリストを対象としています。Google Cloud のコンテンツで参照する一般的なロールとタスク例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
Google Cloud で Google マネージド証明書を作成する方法については、Google マネージド証明書をご覧ください。
GKE の Google マネージド SSL 証明書は公開クラスタと限定公開クラスタをサポートしています。
Google マネージド証明書を使用した Ingress の作成
Google マネージド SSL 証明書を構成して Ingress と関連付けるには、次の操作を行う必要があります。
- Ingress と同じ Namespace に
ManagedCertificate
オブジェクトを作成します。 networking.gke.io/managed-certificates
アノテーションを Ingress に追加して、ManagedCertificate
オブジェクトを Ingress に関連付けます。このアノテーションは、ManagedCertificate
オブジェクトのカンマ区切りリストです。
制限事項
Google マネージド証明書は、自分で取得して管理する証明書と比べてあまり柔軟性がありません。Google マネージド証明書は、最大 100 個の非ワイルドカード ドメインをサポートします。セルフ マネージド証明書とは異なり、Google マネージド証明書はワイルドカード ドメインをサポートしません。
セルフマネージド証明書が必要な場合、または Ingress で構成する SSL 証明書がすでにある場合は、クライアントとロードバランサ間の HTTPS(TLS)の設定をご覧ください。
Ingress でサポートされている証明書の数と種類は、Google マネージド SSL 証明書の制限に応じて定義されます。
Google マネージド証明書に対する更新はサポートされていません。詳細については、Google マネージド証明書の手動更新をご覧ください。
証明書が認証局によって直接取り消された場合、Google は証明書を自動的にローテーションしません。ManagedCertificate を削除して、新しい証明書を作成する必要があります。
前提条件
- ドメイン名を所有している必要があります。ドメイン名は 63 文字以下にする必要があります。Google Domains または他の登録事業者を使用できます。
- GKE Standard クラスタを使用する場合は、
HttpLoadBalancing
アドオンを有効にする必要があります。 ingressClassName
は"gce"
にする必要があります。Ingress
リソースとManagedCertificate
リソースは、同じプロジェクトと Namespace に適用する必要があります。予約済み(静的)外部 IP アドレスを作成します。静的 IP アドレスを予約すると、Ingress を削除した場合でも、その IP アドレスが自身のものであることが保証されます。IP アドレスを予約しないと、アドレスが変わりドメインの DNS レコードを再構成することが必要となることがあります。Google Cloud CLI または Google Cloud コンソールを使用して、予約済み IP アドレスを作成します。
gcloud
予約済み IP アドレスを作成するには、次のコマンドを実行します。
gcloud compute addresses create ADDRESS_NAME --global
ADDRESS_NAME
は、作成する予約済み IP アドレスの名前に置き換えます。作成した静的 IP アドレスを見つけるには、次のコマンドを実行します。
gcloud compute addresses describe ADDRESS_NAME --global
出力は次のようになります。
address: 203.0.113.32 ...
Console
予約済み IP アドレスを作成するには、次の操作を行います。
Google Cloud コンソールで [外部 IP アドレス] ページに移動します。
IP アドレスの名前を指定します(例:
example-ip-address
)。IPv4 アドレスまたは IPv6 アドレスのどちらにするかを指定します。
[タイプ] には、[グローバル] オプションを選択します。
[予約] をクリックします。IP アドレスが [外部アドレス] 列に表示されます。
Config Connector
注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順を実施してください。
このマニフェストをデプロイするには、マニフェストをcompute-address.yaml
というファイル名でマシンにダウンロードしてから、次のコマンドを実行します。kubectl apply -f compute-address.yaml
Google マネージド証明書の設定
ManagedCertificate
オブジェクトを作成します。このリソースは、SSL 証明書のドメインを指定します。ワイルドカード ドメインはサポートされません。次のマニフェストでは、
ManagedCertificate
オブジェクトを記述します。マニフェストをmanaged-cert.yaml
として保存します。apiVersion: networking.gke.io/v1 kind: ManagedCertificate metadata: name: managed-cert spec: domains: - FQDN_1 - FQDN_2
次のように置き換えます。
FQDN_1
、FQDN_2
: 所有する完全修飾ドメイン名。たとえば、example.com
やwww.example.com
です。
マニフェストをクラスタに適用します。
kubectl apply -f managed-cert.yaml
アプリケーションをインターネットに公開するために、
NodePort
型の Service を作成します。次のマニフェストでは、
NodePort
タイプの Service を記述します。マニフェストをmc-service.yaml
として保存します。apiVersion: v1 kind: Service metadata: name: mc-service spec: selector: app: mc-service type: NodePort ports: - protocol: TCP port: 80 targetPort: 8080
マニフェストをクラスタに適用します。
kubectl apply -f mc-service.yaml
Ingress を作成します。
次のマニフェストでは、作成した
ManagedCertificate
を使用する Ingress を記述します。マニフェストをmanaged-cert-ingress.yaml
として保存します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: managed-cert-ingress annotations: kubernetes.io/ingress.global-static-ip-name: ADDRESS_NAME networking.gke.io/managed-certificates: managed-cert kubernetes.io/ingress.class: "gce" # Updated annotation spec: defaultBackend: service: name: mc-service port: number: SERVICE_PORT
次のように置き換えます。
ADDRESS_NAME
: 予約済み IP アドレスの名前。SERVICE_PORT
: Service マニフェストのports.port
の値。
マニフェストをクラスタに適用します。
kubectl apply -f managed-cert-ingress.yaml
ロードバランサの IP アドレスを取得します。
kubectl get ingress
出力は次のようになります。
NAME HOSTS ADDRESS PORTS AGE managed-cert-ingress * 203.0.113.32 80 54s
ロードバランサの IP アドレスが
ADDRESS
列に表示されます。予約済みの静的 IP アドレスを使用している場合、その IP アドレスがロードバランサのアドレスになります。アドレスが表示されない場合は、Ingress の設定が完了するのを待ちます。
ロードバランサの IP アドレスを指すように、ドメインの DNS レコードを構成します。Cloud DNS を使用している場合の詳細については、レコードの管理をご覧ください。
Google マネージド証明書のプロビジョニングが完了するまで待ちます。この処理には 60 分ほどかかる場合があります。次のコマンドを使用して、証明書のステータスを確認できます。
kubectl describe managedcertificate managed-cert
出力は次のようになります。
Name: managed-cert Namespace: default Labels: <none> Annotations: <none> API Version: networking.gke.io/v1 Kind: ManagedCertificate (...) Spec: Domains: FQDN_1 FQDN_2 Status: CertificateStatus: Active (...)
Status.CertificateStatus
フィールドの値は、証明書のプロビジョニング状態を示します。Status.CertificateStatus
がActive
でない場合、証明書はまだプロビジョニングされていません。次のコマンドを使用して、Ingress でイベントを確認できます。
kubectl describe ingress INGRESS_NAME
INGRESS_NAME
は実際の Ingress 名で置き換えます。https://
接尾辞を使用してドメインにアクセスし、SSL が機能していることを確認します。ブラウザ上に接続が安全であることが示され、証明書の詳細を確認できます。
セルフ マネージド証明書から Google マネージド証明書への移行
セルフ マネージド SSL 証明書から Google マネージド SSL 証明書に Ingress を移行する場合、Google マネージド SSL 証明書が有効になるまではセルフ マネージド SSL 証明書を削除しないでください。Google マネージド SSL 証明書は正常にプロビジョニングされると自動的に有効になります。Google マネージド SSL 証明書が有効になったら、セルフ マネージド SSL 証明書を削除できます。
以下の手順でセルフ マネージド SSL 証明書から Google マネージド SSL 証明書に移行します。
- Google マネージド証明書の設定の説明に従って、新しい Google マネージド証明書を Ingress に追加します。
Google マネージド証明書リソースのステータスがアクティブになるまで待ちます。次のコマンドを使用して、証明書のステータスを確認します。
kubectl describe managedcertificate managed-cert
ステータスが
Active
になったら、Ingress を更新してセルフマネージド証明書への参照を削除します。
Google マネージド証明書の削除
クラスタから Google マネージド証明書を削除するには、ManagedCertificate
オブジェクトを削除するとともに、そのリソースを参照する Ingress アノテーションも削除する必要があります。
ManagedCertificate
オブジェクトを削除します。kubectl delete -f managed-cert.yaml
出力は次のようになります。
managedcertificate.networking.gke.io "managed-cert" deleted
Ingress からアノテーションを削除します。
kubectl annotate ingress managed-cert-ingress networking.gke.io/managed-certificates-
コマンドの最後にマイナス記号(
-
)が付いていることに注意してください。ロードバランサ用に予約した静的 IP アドレスを解放します。
予約済み IP アドレスを解放するには、Google Cloud CLI、Google Cloud コンソール、または Config Connector を使用します。
gcloud
次のコマンドを使用して、予約済みの IP アドレスを解放します。
gcloud compute addresses delete ADDRESS_NAME --global
ADDRESS_NAME
は、IP アドレスの名前に置き換えます。Console
予約済みの IP アドレスを解放するには、次の操作を行います。
Google Cloud コンソールで [外部 IP アドレス] ページに移動します。
解放する IP アドレスの横にあるチェックボックスをオンにします。
[IP アドレスを解放] をクリックします。
Config Connector
注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順を実施してください。
このマニフェストをデプロイするには、マニフェストを
compute-address.yaml
というファイル名でマシンにダウンロードしてから、次のコマンドを実行します。kubectl delete -f compute-address.yaml
トラブルシューティング
このセクションでは、Google マネージド証明書の問題を解決する方法について説明します。
ManagedCertificate
と Ingress リソースでイベントを確認する
許可されている証明書の数を超えると、TooManyCertificates
の理由を含むイベントが ManagedCertificate
に追加されます。ManagedCertificate
オブジェクトのイベントは、次のコマンドを使用して確認できます。
kubectl describe managedcertificate CERTIFICATE_NAME
CERTIFICATE_NAME
は、ManagedCertificate
の名前で置き換えます。
存在しない ManagedCertificate
を Ingress に接続すると、MissingCertificate
の理由を含むイベントが Ingress に追加されます。次のコマンドを使用して、Ingress でイベントを確認できます。
kubectl describe ingress INGRESS_NAME
INGRESS_NAME
は実際の Ingress 名で置き換えます。
ドメインが複数のロードバランサの IP アドレスに解決される場合、マネージド証明書がプロビジョニングされない
ドメインが複数のロードバランサ(複数の Ingress オブジェクト)の IP アドレスに解決される場合は、ManagedCertificate
オブジェクトを 1 つ作成して、すべての Ingress オブジェクトに接続する必要があります。ManagedCertificate
オブジェクトを複数作成してそれぞれを個別の Ingress に接続すると、認証局がドメインの所有権を確認できず、一部の証明書がプロビジョニングされないことがあります。所有権の確認を成功させるには、ドメイン解決されるすべての IP アドレスの下に証明書が表示されている必要があります。
具体的には、ドメインが IPv4 アドレスと IPv6 アドレスに解決され、それぞれが異なる Ingress オブジェクトで構成されている場合、ManagedCertificate
オブジェクトを 1 つ作成し、両方の Ingress に接続します。
Google マネージド証明書と Ingress 間の通信の中断
マネージド証明書は、ingress.gcp.kubernetes.io/pre-shared-cert
アノテーションを使用して Ingress と通信します。この通信が中断するのは、たとえば次のような場合です。
ingress.gcp.kubernetes.io/pre-shared-cert
アノテーションを消去する自動プロセスを実行する場合。- Ingress のスナップショットを保存した後、スナップショットから Ingress を削除して復元する場合。その間に
ingress.gcp.kubernetes.io/pre-shared-cert
アノテーションのSslCertificate
リソースが削除された可能性があります。Ingress に接続された証明書がない場合、Ingress は動作しません。
Google マネージド証明書と Ingress 間の通信が中断された場合、ingress.gcp.kubernetes.io/pre-shared-cert
アノテーションの内容を削除し、システムによる調整が完了するまで待ちます。再発防止のため、アノテーションが誤って変更または削除されないようにしてください。
Google マネージド証明書の作成時の検証エラー
ManagedCertificate
オブジェクトを作成する前に ManagedCertificate
定義を検証します。検証で不合格になると、ManagedCertificate
オブジェクトは作成されず、エラー メッセージが出力されます。エラー メッセージとその理由の説明は次のとおりです。
spec.domains in body should have at most 100 items
ManagedCertificate
マニフェストで、spec.domains
フィールドに 100 を超えるドメインがリストされています。Google マネージド証明書でサポートされるドメインは 100 までです。
spec.domains in body should match '^(([a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)+[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\.?$'
spec.domains
フィールドに無効なドメイン名またはワイルドカード ドメイン名が指定されています。ManagedCertificate
オブジェクトは、ワイルドカード ドメイン(*.example.com
など)をサポートしません。
spec.domains in body should be at most 63 chars long
指定したドメイン名が長すぎます。Google マネージド証明書は最長 63 文字までのドメイン名をサポートします。
Google マネージド証明書の手動更新
新しいドメインの証明書がプロビジョニングされるまで古いドメインの証明書が引き続き機能するように、証明書を手動で更新する手順は次のとおりです。
- 新しいドメインに
ManagedCertificate
を作成します。 - カンマ区切りリストを使用して、
ManagedCertificate
の名前を Ingress のnetworking.gke.io/managed-certificates
アノテーションに追加します。古い証明書名を削除しないでください。 ManagedCertificate
が Active になるまで待ちます。- 古い証明書を Ingress から切断し、この証明書を削除します。
ManagedCertificate
を作成すると、Google Cloud が Google マネージド SSL 証明書を作成します。この証明書は更新できません。ManagedCertificate
を更新すると、Google Cloud は Google マネージド SSL 証明書を削除し、再作成します。
GKE クラスタに安全な HTTPS で暗号化された Ingress を提供するには、Ingress の保護の例をご覧ください。
次のステップ
- Google マネージド証明書について学ぶ。
- Ingress で外部アプリケーション ロードバランサを設定する方法を確認する。
- Ingress の外部アプリケーション ロードバランサで複数の SSL 証明書を使用する方法を確認する。
- 安全な Ingress を実装する。