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

このページでは、Ingress オブジェクトを使用して、Google マネージド SSL 証明書を構成して外部ロードバランサを作成する方法を説明します。このような証明書は、ドメイン名に対して Google がプロビジョニング、更新、管理するドメイン認証(DV)証明書です。この証明書は個人 ID や組織 ID を示すものではありません。

Google Cloud で Google マネージド証明書を作成する方法については、Google マネージド証明書をご覧ください。

GKE の Google マネージド SSL 証明書は公開クラスタと限定公開クラスタをサポートしています。

API バージョン

Google マネージド SSL 証明書は ManagedCertificate カスタム リソースを使用して構成します。このカスタム リソースは、Google Kubernetes Engine(GKE)クラスタのバージョンに応じて異なる API バージョンで使用できます。

  • ManagedCertificate v1beta2 API は、GKE バージョン 1.15 以降で使用できます。
  • ManagedCertificate v1 API は、GKE バージョン 1.17.9-gke.6300 以降で使用できます。

GKE クラスタは現在 ManagedCertificate v1beta1 API をサポートしていますが、この API バージョンは非推奨で、今後の GKE バージョンで削除される予定です。新しい API バージョンの使用をおすすめします。

API バージョン間の移行

ManagedCertificate オブジェクトは、新しい API バージョンをサポートするクラスタで更新されると、自動的に新しいバージョンの API に更新されます。リソースは定期的に更新されるため、リソースを移行する必要はありません。

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 マネージド証明書の手動更新をご覧ください。

前提条件

  • ドメイン名を所有している必要があります。ドメイン名は 63 文字以下にする必要があります。Google Domains または他の登録事業者を使用できます。
  • "kubernetes.io/ingress.class""gce" にする必要があります。
  • Ingress リソースと ManagedCertificate リソースは、同じプロジェクトと名前空間に適用する必要があります。
  • 予約済み(静的)外部 IP アドレスを作成します。静的 IP アドレスを予約すると、Ingress を削除した場合でも、その IP アドレスが自身のものであることが保証されます。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

    予約済み IP アドレスを作成するには、次の手順を行います。

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

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

    2. IP アドレスの名前を指定します(例: example-ip-address)。

    3. IPv4 アドレスまたは IPv6 アドレスのどちらにするかを指定します。

    4. [タイプ] には、[グローバル] オプションを選択します。

    5. [予約] をクリックします。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
    

Google マネージド証明書の設定

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

    次のマニフェストでは、ManagedCertificate オブジェクトを記述します。マニフェストを managed-cert.yaml として保存します。

    apiVersion: networking.gke.io/v1
    kind: ManagedCertificate
    metadata:
      name: managed-cert
    spec:
      domains:
        - DOMAIN_NAME1
        - DOMAIN_NAME2
    

    次のように置き換えます。

    • DOMAIN_NAME1DOMAIN_NAME2: 所有しているドメイン名。たとえば、example.comwww.example.com です。
  2. マニフェストをクラスタに適用します。

    kubectl apply -f managed-cert.yaml
    
  3. アプリケーションをインターネットに公開するために、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
    
  4. マニフェストをクラスタに適用します。

    kubectl apply -f mc-service.yaml
    
  5. 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"
    spec:
      defaultBackend:
        service:
          name: mc-service
          port:
            number: SERVICE_PORT
    

    次のように置き換えます。

    • ADDRESS_NAME: 予約済み IP アドレスの名前。
    • SERVICE_PORT: Service マニフェストの ports.port の値。
  6. マニフェストをクラスタに適用します。

    kubectl apply -f managed-cert-ingress.yaml
    
  7. ロードバランサの IP アドレスを取得します。

    kubectl get ingress
    

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

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

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

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

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

  9. 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:
       DOMAIN_NAME1
       DOMAIN_NAME2
    Status:
     CertificateStatus: Active
    (...)
    

    Status.CertificateStatus フィールドの値は、証明書のプロビジョニング状態を示します。Status.CertificateStatusActive でない場合、証明書はまだプロビジョニングされていません。

  10. https:// 接尾辞を使用してドメインにアクセスし、SSL が機能していることを確認します。ブラウザ上に接続が安全であることが示され、証明書の詳細を確認できます。

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

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

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

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

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

Google マネージド証明書の削除

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

  1. ManagedCertificate オブジェクトを削除します。

    kubectl delete -f managed-cert.yaml
    

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

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

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

    コマンドの最後にマイナス記号(-)が付いていることに注意してください。

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

    予約済みの IP アドレスは、gcloud コマンドライン ツール、Cloud Console、または Config Connector を使用して解放できます。

    gcloud

    次のコマンドを使用して、予約済みの IP アドレスを解放します。

    gcloud compute addresses delete ADDRESS_NAME --global
    

    ADDRESS_NAME は、IP アドレスの名前に置き換えます。

    Console

    予約済みの IP アドレスを解放するには、次の手順を行います。

    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
    

トラブルシューティング

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

ManagedCertificate と Ingress リソースでイベントを確認する

許可されている証明書の数を超えると、TooManyCertificates の理由を含むイベントが ManagedCertificate に追加されます。ManagedCertificate オブジェクトのイベントは、次のコマンドを使用して確認できます。

kubectl describe managedcertificate CERTIFICATE_NAME

CERTIFICATE_NAME は、ManagedCertificate の名前で置き換えます。

存在しない ManagedCertificate v1 を 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 間の通信の中断

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

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

Google マネージド証明書と Ingress 間の通信が中断された場合、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 マネージド証明書の手動更新

新しいドメインの証明書がプロビジョニングされるまで古いドメインの証明書が引き続き機能するように、証明書を手動で更新する手順は次のとおりです。

  1. 新しいドメインに ManagedCertificate を作成します。
  2. カンマ区切りリストを使用して、ManagedCertificate の名前を Ingress の networking.gke.io/managed-certificates アノテーションに追加します。古い証明書名を削除しないでください。
  3. ManagedCertificate が Active になるまで待ちます。
  4. 古い証明書を Ingress から切断し、この証明書を削除します。

ManagedCertificate を作成すると、Google Cloud が Google マネージド SSL 証明書を作成します。この証明書は更新できません。ManagedCertificate を更新すると、Google Cloud は Google マネージド SSL 証明書を削除し、再作成します。

次のステップ