Google マネージド SSL 証明書の使用

このページでは、Ingress を使用して、Google マネージド SSL 証明書を構成して外部ロードバランサを作成する方法を説明します。Google マネージド SSL 証明書は、ドメインに対してプロビジョニング、デプロイ、更新、管理されます。Google マネージド SSL 証明書の作成方法については、SSL 証明書の概要をご覧ください。

v1beta2 API の概要

マネージド証明書は、すべての GKE のバージョンで使用できるベータ版の機能です。クラスタのマスターが GKE 1.16.5-gke.1 より前のバージョンの Kubernetes を実行している場合、バージョン v1beta1 のマネージド証明書を利用できますが、証明書ごとの複数のサブジェクト代替名(SANs)はサポートしていません。

GKE 1.16.5-gke.1 以降ならバージョン v1beta2 のマネージド証明書を利用でき、証明書あたり最大 100 の SANs をサポートします。バージョン v1beta1 も利用可能です。

v1beta1 から v1beta2 API への移行

v1beta1 と v1beta2 の違いは、証明書あたりのドメイン名の検証数の違いのみです。バージョン番号がアップグレードされるのは、この違いを明確に示すためです。またこの措置により、検証ルールを無許可で変更したり、変更によって誤解が生じたりするといった状況も回避できます。

バージョンが更新されると v1beta1 のリソースは自動的にバージョン v1beta2 に移行し、リソースも自動的に更新されます。バージョン v1beta1 が削除されると、このバージョンで新しいリソースを作成できなくなります。

マネージド証明書を使用して Ingress を作成する

マネージド SSL 証明書を構成してそれを Ingress と関連付けるには、次の手順を実行します。

  • ManagedCertificate オブジェクトを作成する。
  • アノテーション networking.gke.io/managed-certificates を Ingress に追加して、ManagedCertificate オブジェクトを Ingress に関連付ける。この注釈は、ManagedCertificate リソースのカンマ区切りリストです(たとえば、cert1,cert2,cert3)。

制限事項

Google マネージド証明書は、自分で取得して管理する証明書と比べてあまり柔軟性がありません。マネージド証明書は最大 100 までの非ワイルドカード ドメインをサポートしますが、セルフ マネージド証明書はワイルドカード ドメインをサポートします。

セルフマネージド証明書が必要な場合、または Ingress で構成したい SSL 証明書がすでにある場合は、Ingress ドキュメントをご覧ください。

Ingress でサポートされている証明書の数と種類は、Google Cloud マネージド SSL 証明書の制限に応じて定義されます。

要件

  • ドメイン名を所有している必要があります。ドメイン名は 63 文字以下にする必要があります。Google Domains または他の登録事業者を使用できます。
  • 予約済み(静的)外部 IP アドレスを作成します。静的 IP アドレスを予約すると、Ingress を削除した場合でも、その IP アドレスが自身のものであることが保証されます。アドレスを予約しないと、アドレスが変わりドメインの DNS レコードを再構成することが必要となることがあります。gcloud コマンドライン ツールまたは Cloud Console を使用して、予約済み 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

    1. Cloud Console で [静的アドレスの予約] ページに移動します。

      [静的アドレスの予約] ページに移動

    2. この IP アドレスの名前を指定します(例: example-ip-address)。
    3. このアドレスが IPv4IPv6 のどちらであるかを指定します。次の例では、IPv4 アドレスを使用しています。
    4. アドレスのタイプとして [グローバル] オプションを選択します。
    5. [予約] をクリックして IP アドレスを予約します。
    6. IP アドレスが [外部アドレス] 列に表示されます。

    Config Connector

    注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順に従ってください。

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global
    このマニフェストをデプロイするには、マニフェストを compute-address.yaml というファイル名でマシンにダウンロードしてから、次のコマンドを実行します。
    kubectl apply -f compute-address.yaml

マネージド証明書の設定

  1. ManagedCertificate リソースを作成します。このリソースは、SSL 証明書が作成される対象のドメインを指定します。ワイルドカード ドメインはサポートされません。

    これは、ManagedCertificate マニフェストのサンプルです。

    apiVersion: networking.gke.io/v1beta2
    kind: ManagedCertificate
    metadata:
      name: certificate-name
    spec:
      domains:
        - domain-name1
        - domain-name2
    

    ここで

    • certificate-nameManagedCertificate リソースの名前です。
    • domain-name1domain-name2 はドメイン名です。

    マニフェストを certificate-name.yaml という名前のファイルとして保存し、次のコマンドでリソースを作成します。

    kubectl apply -f certificate-name.yaml
    
  2. アプリケーションをインターネットに公開するための NodePort Service を作成します。

    次に示したのは、Service マニフェスト ファイルの例です。

    apiVersion: v1
    kind: Service
    metadata:
      name: service-name
    spec:
      selector:
        key: value
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    

    この例では、selector を使用して Service を含む Pod を選択しています。Service の構成方法の詳細については、NodePort のドキュメントをご覧ください。

    マニフェストを service-name.yaml という名前のファイルとして保存し、次のコマンドで Service を作成します。

    kubectl apply -f service-name.yaml
    
  3. Ingress を作成し、以前に作成した ManagedCertificate にリンクします。

    次に、Ingress マニフェストのサンプルを示します。

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-name
      annotations:
        kubernetes.io/ingress.global-static-ip-name: address-name
        networking.gke.io/managed-certificates: certificate-name
    spec:
      backend:
        serviceName: service-name
        servicePort: service-port
    

    ここで

    • ingress-name は Ingress オブジェクトの名前です。
    • address-name は、予約済み IP アドレスの名前です。
    • certificate-name は証明書の名前です。
    • service-name は、前の手順で作成した Service の名前です。
    • service-port は、Service マニフェストで指定したポートです。

    マニフェストを ingress-name.yaml という名前のファイルとして保存し、次のコマンドで Ingress を作成します。

    kubectl apply -f ingress-name.yaml
    
  4. 前の手順で作成したロードバランサの IP アドレスを検索します。ロードバランサの IP アドレスを取得するには、次のコマンドを使用します。

    kubectl get ingress
    

    出力は次のようになります。

    NAME              HOSTS     ADDRESS         PORTS     AGE
    example-ingress   *         203.0.113.32     80        54s
    

    ロードバランサの IP アドレスが ADDRESS 列に表示されます。予約済みの静的 IP アドレスを使用している場合、その IP アドレスがロードバランサのアドレスになります。

    アドレスが表示されない場合は、Ingress の設定が完了するのを待ちます。

  5. ロードバランサの IP アドレスを指すように、ドメインの DNS レコードを構成します。Cloud DNS を使用している場合の詳細についてはレコードの管理ガイドをご覧ください。

  6. マネージド証明書がプロビジョニングされるのを待ちます。最大で 15 分ほどかかることがあります。次のコマンドで証明書のステータスを確認できます。

    kubectl describe managedcertificate certificate-name
    

    証明書が正常にプロビジョニングされると、Status.CertificateStatus フィールドの値は Active になります。次の例は、証明書が正常にプロビジョニングされた後の kubectl describe の出力を示しています。

    Name:         certificate-name
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1beta1
    Kind:         ManagedCertificate
    (...)
    Spec:
      Domains:
        domain-name1
        domain-name2
    Status:
      CertificateStatus: Active
    (...)
    
  7. https:// 接尾辞を使用してドメインにアクセスし、SSL が機能していることを確認します。ブラウザ上で接続が安全であることが示され、証明書の詳細を確認できます。

セルフ マネージド証明書から Google マネージド SSL 証明書への移行

セルフ マネージド SSL 証明書から Google マネージド SSL 証明書に Ingress を移行する場合、Google マネージド SSL 証明書が有効になるまではセルフ マネージド SSL 証明書を削除しないでください。Google マネージド SSL 証明書は正常にプロビジョニングされると自動的に有効になります。 Google マネージド SSL 証明書が有効になったら、セルフ マネージド SSL 証明書を削除できます。

以下の手順でセルフ マネージド SSL 証明書から Google マネージド SSL 証明書に移行します。

  1. マネージド証明書の設定セクションの説明に従って、新しいマネージド証明書を Ingress に追加します。
  2. Google マネージド証明書リソースのステータスがアクティブになるまで待ちます。次のコマンドを使用して、証明書のステータスを確認します。

    kubectl describe managedcertificate certificate-name
    
  3. ステータスがアクティブになったら、Ingress を更新してセルフマネージド証明書への参照を削除します。

マネージド証明書の削除

クラスタからマネージド証明書を削除するには、ManagedCertificate リソースを削除するとともに、そのリソースを参照する Ingress アノテーションも削除する必要があります。

  1. kubectl で ManagedCertificate リソースを削除します。

    kubectl delete -f certificate-name.yaml
    

    出力は次のようになります。

    managedcertificate.networking.gke.io "certificate-name" deleted
    
  2. Ingress からアノテーションを削除します。

    kubectl annotate ingress ingress-name networking.gke.io/managed-certificates-
    

    コマンドの最後にマイナス記号「-」があることにご注意ください。

  3. ロードバランサ用に予約した静的 IP アドレスを解放します。

    gcloud

    gcloud コマンドライン ツールを使用して、次のコマンドを実行します。

    gcloud compute addresses delete address-name --global
    

    ここで、address-name は IP アドレスの名前です。

    Console

    1. Cloud Console の [外部 IP アドレス] ページに移動します。

      [外部 IP アドレス] ページに移動

    2. 解放する IP アドレスの横のチェックボックスをオンにします。
    3. [IP アドレスを解放] をクリックします。

    Config Connector

    注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順に従ってください。

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global

    このマニフェストをデプロイするには、マニフェストを compute-address.yaml というファイル名でマシンにダウンロードしてから、次のコマンドを実行します。

    kubectl delete -f compute-address.yaml

トラブルシューティング

このセクションでは、マネージド証明書の問題を解決する方法について説明します。

ドメインが複数のロードバランサの IP アドレスに解決される場合、マネージド証明書がプロビジョニングされない

ドメインが複数のロードバランサ(複数の Ingress)の IP アドレスに解決される場合、ManagedCertificate リソースを 1 つ作成し、すべての Ingress にアタッチする必要があります。Ingress の数だけ ManagedCertificate リソースを作成してそれぞれにアタッチした場合、認証局がドメインの所有権を確認できないために、一部の証明書がプロビジョニングされないことがあります。所有権の確認を成功させるには、ドメイン解決されるすべての IP アドレスの下に証明書が表示されている必要があります。

具体的には、ドメインが IPv4 アドレスと IPv6 アドレスに解決され、それぞれが異なる Ingress リソースで構成されている場合、ManagedCertificate リソースを 1 つ作成し、両方の Ingress にアタッチします。

マネージド証明書と Ingress 間の通信の中断

マネージド証明書は、kubernetes.io/pre-shared-cert アノテーションを使用して Ingress と通信します。この通信が中断するのは、たとえば次のような場合です。

  • kubernetes.io/pre-shared-cert アノテーションを消去する自動プロセスを実行する。
  • Ingress のスナップショットを保存し、その Ingress を破棄して、スナップショットから Ingress を復元する。この間に、Ingress の pre-shared-cert アノテーションにリストされていた SslCertificate リソースが削除される可能性があります。Ingress は絶対的な動作を行うため、添付された証明書がない場合は機能しません。

マネージド証明書の作成時の検証エラー

ManagedCertificate リソースを作成する前に ManagedCertificate 定義を検証します。検証に失敗した場合、ManagedCertificate リソースは作成されず、エラー メッセージが表示されます。エラー メッセージとその理由の説明は次のとおりです。

spec.domains in body should have at most 100 items

ManagedCertificate マニフェストで、spec.domains フィールドに 100 を超えるドメインがリストされています。マネージド証明書でサポートされるドメインは 100 までです。1.16.5-gke.1 より古いクラスタのマネージド証明書がサポートするドメインは、1 つのみです。

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 フィールドに無効なドメイン名またはワイルドカード ドメイン名が指定されています。マネージド証明書では、*.example.com のようなワイルドカード ドメインをサポートしていません。

spec.domains in body should be at most 63 chars long

指定したドメイン名が長すぎます。マネージド証明書は最長 63 文字までのドメイン名をサポートします。

次のステップ