独自の TLS 証明書の使用

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

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

独自の証明書を使用するには、TLS 証明書を Kubernetes Secret に保存し、対象の Secret を使用するように Cloud Service Mesh の Ingress ゲートウェイを構成します。

始める前に

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

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

証明書を 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 に置き換えます。デフォルト構成を使用して Cloud Service Mesh をインストールした場合は、istio-system 名前空間を指定します。
    • SECRET_NAME は、Kubernetes Secret で使用する名前に置き換えます。
    • PRIVATE_KEY.pem は、証明書の秘密鍵を含むファイルの名前に置き換えます。
    • FULL_CHAIN.pem は、公開証明書を含むファイルの名前に置き換えます。

これで、TLS 証明書に先ほど作成した Secret を使用するように Ingress ゲートウェイを構成できるようになりました。

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

TLS 証明書に作成した Secret を使用するように Cloud Service Mesh の Ingress ゲートウェイを変更します。

  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. hostsporttls の各属性を既存の YAML に追加して、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 は、サービスが使用する Secret の名前に置き換えます。一連の異なる TLS 証明書用に複数の Secret を作成した場合は、各サービスが使用する Secret を指定できます。

      例をご覧ください

  3. 変更を保存します。

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

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

この例では、TLSsecret Secret を使用するようにすべてのサービスを構成する方法を説明します。

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