コンテンツへスキップ

外部ドメイン暗号化の設定

Knativeでは、カスタムTLS証明書を使用するか、自動生成されたTLS証明書を使用して、外部ドメイン(application.example.comなど)のKnativeサービスでセキュアなHTTPS接続を有効にできます。

始める前に

セキュアなHTTPS接続を有効にするには、次の要件を満たす必要があります。

  • Knative Servingがインストールされている必要があります。Servingコンポーネントのインストールについては、Knativeインストールガイドを参照してください。
  • カスタム外部ドメインを使用するようにKnativeクラスターを設定する必要があります。
  • DNSプロバイダーが設定され、ドメインに構成されている必要があります。
  • Kourier、Istio with SDS v1.3以降、またはContour v1.1以降などのネットワーク層。 ネットワーク層のインストールを参照してください。

証明書の自動取得と更新

cert-managerのインストールと設定および統合

情報

HTTP-01チャレンジを使用する場合は、カスタムドメインをIngressのIPにマッピングするように設定する必要があります。これは、DNSプロバイダーの指示に従って、ドメインをIPにマッピングするDNS Aレコードを追加することで実現できます。

まず、cert-managerとKnative cert-manager統合をインストールして設定する必要があります。詳細については、Knative cert-manager統合の設定を参照してください。

Knative Servingの設定

自動証明書プロビジョニングでは、次の2つの方法で証明書を要求できます。

  • 個々のKnativeサービスごとに1つの証明書
  • 名前空間ごとに1つのワイルドカード証明書

一度にアクティブにできるのは1つだけです!

各Knativeサービスに証明書を使用する

knative-serving名前空間のconfig-network ConfigMapを更新して、external-domain-tlsを有効にします

  1. 次のコマンドを実行して、config-network ConfigMapを編集します

    kubectl edit configmap config-network -n knative-serving
    
  2. dataセクションの下にexternal-domain-tls: Enabled属性を追加します

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-network
      namespace: knative-serving
    data:
       ...
       external-domain-tls: Enabled
       ...
    
  3. Knative Servingコントローラーを再起動して、Knative cert-manager統合を開始します

    kubectl rollout restart deploy/controller -n knative-serving
    

名前空間ごとに1つのワイルドカード証明書を使用する

警告

名前空間ごとのワイルドカード証明書のプロビジョニングは、DNS-01チャレンジでのみ機能します。この機能は、HTTP-01チャレンジでは使用できません。

名前空間ごとの構成では、名前空間ラベルを使用して、証明書を適用する名前空間を選択します。選択は、config-network ConfigMapのキーnamespace-wildcard-cert-selectorを使用して構成されます。たとえば、次の構成を使用できます。

  • namespace-wildcard-cert-selector"" = 空の値を使用して機能を無効にします(これがデフォルトです)。
  • namespace-wildcard-cert-selector{} = 空のオブジェクトを使用して、すべての名前空間で有効にします。

特定のラベルが名前空間にある場合にオプトアウトするようにセレクターを構成することもできます。

namespace-wildcard-cert-selector: |-
  matchExpressions:
  - key: "networking.knative.dev/disableWildcardCert"
    operator: "NotIn"
    values: ["true"] 
これにより、ラベル値がセット"true"にないすべての名前空間が選択されます。

または、既存のKubernetesラベルを使用して、名前空間に基づいて名前空間を選択します。

namespace-wildcard-cert-selector: |-
  matchExpressions:
    - key: "kubernetes.io/metadata.name"
      operator: "In"
      values: ["my-namespace", "my-other-namespace"] 

構成を適用するには、次のコマンドを使用できます(必要に応じてlabel-selectorを調整します)。

kubectl patch --namespace knative-serving configmap config-network -p '{"data": {"namespace-wildcard-cert-selector": "{\"matchExpressions\": [{\"key\":\"networking.knative.dev/disableWildcardCert\", \"operator\": \"NotIn\", \"values\":[\"true\"]}]}"}}'

名前空間セレクターの詳細については、Kubernetesドキュメントを参照してください。

Knative Servingコントローラーを再起動して、Knative cert-manager統合を開始します

kubectl rollout restart deploy/controller -n knative-serving

おめでとうございます! Knativeは、TLS証明書を取得および更新するように構成されました。TLS証明書が発行され、クラスターで利用可能になると、Knativeサービスは外部ドメインでHTTPSトラフィックを処理できるようになります。

証明書の手動取得と更新

証明書を手動で取得する方法はいくつかあります。 Certbotcert-managerなどのツールを使用するか、別のソースから証明書を手動で提供できます。一般に、証明書を取得したら、クラスターでその証明書を使用するためのKubernetesシークレットを作成する必要があります。手動で証明書を取得および構成する方法の詳細については、このトピックの後半の手順を参照してください。

ツールを使用して証明書を取得する

ツールの関連ドキュメントを参照してください

Knativeは、クラスターの外部ドメインのDNSドメイン用に署名されたワイルドカード証明書を期待しています。例:

*.yourdomain.com

証明書と秘密鍵を取得したら、Kubernetesシークレットを作成して、証明書とKnativeで使用するキーを作成します。

警告

Let's Encryptが発行する証明書の有効期限は90日のみです。したがって、証明書を手動で取得および構成する場合は、有効期限が切れる前に各証明書を更新する必要があります。

Kubernetesシークレットの作成

関連するタブで次の手順を使用して、Knativeクラスターに証明書を追加します

TLS証明書をKnativeクラスターに追加するには、Kubernetesシークレットを作成し、Knative Contourプラグインを構成する必要があります。

  1. 次のコマンドを実行して、TLS証明書cert.pemと秘密鍵key.pemを保持するKubernetesシークレットを作成します。

    kubectl create -n contour-external secret tls default-cert \
      --key key.pem \
      --cert cert.pem
    

    名前空間とシークレット名をメモしてください。後のステップで必要になります。

  2. この証明書とプライベートキーを異なる名前空間で使用するには、委任を作成する必要があります。そのためには、次のテンプレートを使用してYAMLファイルを作成します。

    apiVersion: projectcontour.io/v1
    kind: TLSCertificateDelegation
    metadata:
      name: default-delegation
      namespace: contour-external
    spec:
      delegations:
        - secretName: default-cert
          targetNamespaces:
          - "*"
    
  3. 次のコマンドを実行してYAMLファイルを適用します。

    kubectl apply -f <filename>.yaml
    
    ここで、<filename>は前のステップで作成したファイルの名前です。

  4. external-domain-tlsが無効になっている場合に証明書をフォールバックとして使用するようにKnative Contourプラグインを更新するには、次のコマンドを実行します。

    kubectl patch configmap config-contour -n knative-serving \
      -p '{"data":{"default-tls-secret":"contour-external/default-cert"}}'
    

KnativeクラスターにTLS証明書を追加するには、Kubernetesシークレットを作成してから、knative-ingress-gatewayを構成します。

  1. 次のコマンドを入力して、TLS証明書cert.pemとプライベートキーkey.pemを保持するKubernetesシークレットを作成します。
kubectl create --namespace istio-system secret tls tls-cert \
  --key key.pem \
  --cert cert.pem
  1. HTTPS接続用に作成した新しいシークレットを使用するようにKnativeを構成します。

  2. 次のコマンドを実行して、編集モードでKnative共有gatewayを開きます。

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving
    
  3. 次のtls:セクションと構成を含めるようにgatewayを更新します。

    tls:
      mode: SIMPLE
      credentialName: tls-cert
    

    # Edit the following object. Lines beginning with a '#' will be ignored.
    # An empty file will abort the edit. If an error occurs while saving this
    # file will be reopened with the relevant failures.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      # ... skipped ...
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - "*"
          port:
            name: http
            number: 80
            protocol: HTTP
        - hosts:
            - TLS_HOSTS
          port:
            name: https
            number: 443
            protocol: HTTPS
          tls:
            mode: SIMPLE
            credentialName: tls-cert
    
    この例では、TLS_HOSTSはTLS証明書のホストを表します。単一のホスト、複数のホスト、またはワイルドカードホストにすることができます。詳細な手順については、Istioのドキュメントを参照してください。

検証

  1. Knativeサービスをデプロイします。

  2. kubectl get ksvc -n <your-namespace>でURLを確認します。

  3. サービスURLはhttpsになるはずです。

    NAME           URL                                          LATEST               AGE     CONDITIONS   READY   REASON
    autoscale-go   https://autoscale-go.default.1.example.com   autoscale-go-dd42t   8m17s   3 OK / 3     True
    

信頼

信頼に関する簡単な注意点として、Knativeサービスの外部ドメインを呼び出すすべてのクライアントは、証明書に署名した認証局を信頼する必要があります。これはKnativeの範囲外ですが、システムが正常に動作するように対処する必要があります。特に、認証局がCAまたは中間証明書のローテーションを実行する場合は注意が必要です。詳細については、Knative cert-manager統合の構成を参照してください。

追加の構成

HTTPリダイレクトの構成

Knative Servingでは、外部ドメインでHTTPSが有効になっている場合に、HTTPトラフィックを自動的にリダイレクトできます。これを構成するには

  1. http-protocol属性を使用して、HTTPおよびHTTPSリクエストがどのように処理されるかを構成します。

    デフォルトでは、Knative ingressはHTTPトラフィックを処理するように構成されています(http-protocol: Enabled)。クラスターがTLS証明書を使用し、外部ドメインでHTTPSトラフィックを処理するように構成されたので、HTTPトラフィックを許可するかどうかを指定できます。

    サポートされているhttp-protocolの値

    • Enabled: HTTPトラフィックを処理します。
    • Redirected: HTTPリクエストに応答して、クライアントにHTTPSを使用するように求める302リダイレクトを返します。
    data:
      http-protocol: Redirected
    

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-network
      namespace: knative-serving
    data:
      ...
      external-domain-tls: Enabled
      http-protocol: Redirected
      ...
    

サービスまたはルートごとの自動TLS証明書プロビジョニングの無効化

クラスターで自動TLS証明書プロビジョニングが有効になっている場合、アノテーションnetworking.knative.dev/disable-external-domain-tls: trueを追加することで、個々のKnativeサービスまたはルートに対してこの機能を無効にすることができます。

autoscale-goの例を使用する

  1. kubectl edit service.serving.knative.dev/autoscale-go -n defaultを使用してサービスを編集し、アノテーションを追加します。

     apiVersion: serving.knative.dev/v1
     kind: Service
     metadata:
       annotations:
        ...
         networking.knative.dev/disable-external-domain-tls: "true"
        ...
    
  2. サービスURLはhttpになり、自動TLS証明書プロビジョニングが無効になっていることを示します。

    NAME           URL                                          LATEST               AGE     CONDITIONS   READY   REASON
    autoscale-go   http://autoscale-go.default.1.example.com    autoscale-go-dd42t   8m17s   3 OK / 3     True
    

当サイトでは、サイトトラフィックを把握するために分析とCookieを使用しています。当サイトの使用に関する情報は、その目的のためにGoogleと共有されます。詳細