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

概要

Google Kubernetes Engine では、Ingresses を使用して、自動的に構成された SSL 証明書で HTTPS ロードバランサを作成できます。Google マネージド SSL 証明書は、ドメインに対してプロビジョニング、デプロイ、更新、管理されます。Google マネージド SSL 証明書の詳細については、こちらをご覧ください。

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

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

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

ManagedCertificate リソースは、Ingress と同じ名前空間に作成する必要があります。

制限事項

Google マネージド証明書は、自分で取得して管理する証明書と比べてあまり柔軟性がありません。マネージド証明書は、ワイルドカードを使用していない単一のドメインをサポートします。セルフ マネージド証明書は、ワイルドカードと複数のサブジェクト代替名(SAN)をサポートできます。

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

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

要件

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

    gcloud

    gcloud compute addresses create example-ip-address --global
    

    作成した静的 IP アドレスを見つけるには、次のコマンドを実行します。

    $ gcloud compute addresses describe example-ip-address --global
    address: 203.0.113.32
    ...
    

    Console

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

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

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

マネージド証明書の設定

  1. ManagedCertificate リソースを作成します。このリソースは、SSL 証明書が作成されるドメインを指定します。ワイルドカード ドメインはサポートされません。spec.domains リストに含めるドメインは 1 つだけにする必要があります。

    次の例の ManagedCertificate マニフェストを example-certificate.yaml という名前のファイルに保存します。example.com はドメイン名で置き換えます。

    apiVersion: networking.gke.io/v1beta1
    kind: ManagedCertificate
    metadata:
      name: example-certificate
    spec:
      domains:
        - example.com
    

    kubectl はリソースを使用します。

    kubectl apply -f example-certificate.yaml
    
  2. アプリケーションをインターネットに公開するための NodePort Service を作成します。次に、Service マニフェスト ファイル example-service.yaml の例を示します。

    apiVersion: v1
    kind: Service
    metadata:
      name: example-nodeport-service
    spec:
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    

    この例では、Service に含めるポッドを選択していませんが、マネージド証明書の構成方法を示すにはこれで十分です。ただし実際に使用する際は、Service での指定にセレクタを含める必要があります。

    Service の構成方法の詳細については、NodePort のドキュメントをご覧ください。

    kubectl を使用して、Service を作成します。

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

    • networking.gke.io/managed-certificates アノテーションに証明書の名前を設定します。
    • spec.backend.serviceName フィールドで、前の手順で作成したサービスの名前を使用します。
    • Service マニフェストで指定したポートに spec.backend.servicePort フィールドを設定します。
    • kubernetes.io/ingress.global-static-ip-name アノテーションを予約済み IP アドレスの名前に設定します。

    Ingress マニフェスト example-ingress.yaml の例を次に示します。

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

    kubectl を使用して Ingress を作成します。

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

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

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

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

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

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

    kubectl describe managedcertificate
    

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

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

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

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

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

  1. マネージド証明書の設定セクションの説明に従って、新しいマネージド証明書を Ingress に追加します。
  2. Google マネージド証明書リソースのステータスがアクティブになるまで待ちます。 kubectl describe managedcertificate で証明書のステータスを確認します。
  3. ステータスがアクティブになったら、Ingress を更新してセルフ マネージド証明書への参照を削除します。

マネージド証明書の削除

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

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

    kubectl delete -f example-certificate.yaml
    

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

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

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

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

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

gcloud

gcloud コマンドライン ツールの使用

gcloud compute addresses delete [ADDRESS_NAME] --global

ここで、[ADDRESS_NAME] は IP アドレスの名前です。

Console

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

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

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

トラブルシューティング

ManagedCertificate リソースを作成する前に ManagedCertificate 定義を検証します。検証に失敗した場合、ManagedCertificate リソースは作成されず、エラー メッセージが表示されます。失敗の原因については以下で説明します。

spec.domains in body should have at most 1 items

ManagedCertificate マニフェストの spec.domains フィールドに複数のドメインが含まれている場合。マネージド証明書は 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 文字までのドメイン名をサポートします。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント