独自の TLS 証明書の使用

独自の SSL/TLS 証明書を使用するように Knative serving を構成する方法を学びます。

あるいは、マネージド TLS 証明書機能を使用することもできます。この機能は、Let's Encrypt を通じて TLS 証明書を自動的に作成および更新します。

独自の証明書を使用するには、TLS 証明書を Kubernetes Secret に保存し、その Secret を使用するように Anthos Service Mesh の上り(内向き)ゲートウェイを構成します。

始める前に

  • 以下の手順は、TLS 証明書をすでに取得していることを前提としています。
  • カスタム ドメインを構成する必要があります。詳細については、カスタム ドメインのマッピングをご覧ください。
  • Ingress ゲートウェイを使用して外部トラフィックを処理する Knative serving 提供サービスをそれぞれ構成する必要があります。これらの外部向けサービスが TLS 証明書を使用するように構成されていない場合、サービスは HTTPS 接続を検証できないため、ready 状態に到達しません。

Kubernetes Secret に TLS 証明書を保存する

証明書を Secret に保存するには:

  1. ターミナルを開き、TLS 証明書が配置されているディレクトリに移動します。

  2. 次のコマンドを使用して、証明書を格納する Secret を作成します。

    kubectl create --namespace INGRESS_NAMESPACE secret tls SECRET_NAME \
      --key PRIVATE_KEY.pem \
      --cert FULL_CHAIN.pem
    

    以下のように置き換えます。

    • INGRESS_NAMESPACE は、Ingress サービスの名前空間 istio-ingressgateway に置き換えます。Anthos Service Mesh をデフォルトの構成を使用してインストールした場合は、istio-system 名前空間を指定します。
    • SECRET_NAME は、Kubernetes Secret に使用する名前に置き換えます。
    • PRIVATE_KEY.pem は、証明書の秘密鍵を保持するファイルの名前に置き換えます。
    • FULL_CHAIN.pem は、公開証明書を保持するファイルの名前に置き換えます。

TLS 証明書に作成した Secret を使用するように Ingress ゲートウェイを構成できます。

証明書を使用するように Ingress ゲートウェイを構成する

TLS 証明書用に作成した Secret を使用するように、Anthos Service Mesh の上り(内向き)ゲートウェイを変更します。

  1. 次のコマンドを実行して、編集ゲートウェイで Ingress ゲートウェイ YAML を開きます。

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving

    デフォルトの Ingress ゲートウェイ構成の例:

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      ...
      # other skipped configuration
      ...
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - '*'
        port:
          name: http
          number: 80
          protocol: HTTP
    
  2. 既存の YAML に hostsporttls の各属性を追加して、Secret を使用するように Ingress ゲートウェイを構成します。

    • 同じシークレットを使用するようにすべてのサービスを構成するには: YAML 構成に次を追加し、hosts 属性値として "*" を指定します。

      ...
      # other skipped configuration
      ...
      - hosts:
        - "*"
        port:
          name: https
          number: 443
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      SECRET_NAME は、作成した Secret の名前に置き換えます。

      例を表示

    • 各サービスを個別に構成するには: YAML 構成に次を追加し、サービスの名前と名前空間を使用して、hosts 属性の値を指定します。

      サービスごとに、hostsporttls 属性の値を指定します。

      ...
      # other skipped configuration
      ...
      - hosts:
        - SERVICE_NAME.SERVICE_NAMESPACE.CUSTOM_DOMAIN
        port:
          number: 443
          name: https-SERVICE_NAME
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

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

      • SERVICE_NAME は、Knative serving サービスの名前に置き換えます。上り(内向き)ゲートウェイを使用して外部トラフィックを処理するサービスはすべて個別に構成する必要があります。
      • SERVICE_NAMESPACE は、サービスが実行されている名前空間の名前に置き換えます。
      • CUSTOM_DOMAIN は、サービスを使用するように構成したカスタム ドメインに置き換えます。
      • SECRET_NAME は、サービスで使用するシークレットの名前に置き換えます。異なる TLS 証明書のセットに対して複数のシークレットを作成した場合、各サービスが使用するシークレットを指定できます。

      例を表示

  3. 変更を保存します。

これで、HTTPS プロトコルを使用して、デプロイ済みの Knative serving サービスにアクセスできるようになりました。

すべてのサービスを構成します。

次の例は、TLSsecret シークレットを使用するようにすべてのサービスを構成する方法を示しています。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
      - "*"
      port:
        name: http
        number: 80
        protocol: HTTP
    - hosts:
      - "*"
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: TLSsecret
個々のサービスを構成します。

この例では、インターネット トラフィックを処理する 3 つのサービスすべてを個別に構成する方法を示します。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - "*"
    port:
      name: http
      number: 80
      protocol: HTTP
  - hosts:
    - prodservice.prodnamespace.my-custom-domain.com
    port:
      number: 443
      name: https-prodservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - experiment.namespace.my-custom-domain.com
    port:
      number: 443
      name: https-experiment
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - fallbackservice.anothernamespace.my-custom-domain.com
    port:
      number: 443
      name: https-fallbackservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: anotherTLSsecret