外部ドメイン暗号化の設定¶
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
を有効にします
-
次のコマンドを実行して、
config-network
ConfigMapを編集しますkubectl edit configmap config-network -n knative-serving
-
data
セクションの下にexternal-domain-tls: Enabled
属性を追加しますapiVersion: v1 kind: ConfigMap metadata: name: config-network namespace: knative-serving data: ... external-domain-tls: Enabled ...
-
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トラフィックを処理できるようになります。
証明書の手動取得と更新¶
証明書を手動で取得する方法はいくつかあります。 Certbotやcert-managerなどのツールを使用するか、別のソースから証明書を手動で提供できます。一般に、証明書を取得したら、クラスターでその証明書を使用するためのKubernetesシークレットを作成する必要があります。手動で証明書を取得および構成する方法の詳細については、このトピックの後半の手順を参照してください。
ツールを使用して証明書を取得する¶
ツールの関連ドキュメントを参照してください
Knativeは、クラスターの外部ドメインのDNSドメイン用に署名されたワイルドカード証明書を期待しています。例:
*.yourdomain.com
証明書と秘密鍵を取得したら、Kubernetesシークレットを作成して、証明書とKnativeで使用するキーを作成します。
警告
Let's Encryptが発行する証明書の有効期限は90日のみです。したがって、証明書を手動で取得および構成する場合は、有効期限が切れる前に各証明書を更新する必要があります。
Kubernetesシークレットの作成¶
関連するタブで次の手順を使用して、Knativeクラスターに証明書を追加します
TLS証明書をKnativeクラスターに追加するには、Kubernetesシークレットを作成し、Knative Contourプラグインを構成する必要があります。
-
次のコマンドを実行して、TLS証明書
cert.pem
と秘密鍵key.pem
を保持するKubernetesシークレットを作成します。kubectl create -n contour-external secret tls default-cert \ --key key.pem \ --cert cert.pem
注
名前空間とシークレット名をメモしてください。後のステップで必要になります。
-
この証明書とプライベートキーを異なる名前空間で使用するには、委任を作成する必要があります。そのためには、次のテンプレートを使用してYAMLファイルを作成します。
apiVersion: projectcontour.io/v1 kind: TLSCertificateDelegation metadata: name: default-delegation namespace: contour-external spec: delegations: - secretName: default-cert targetNamespaces: - "*"
-
次のコマンドを実行してYAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は前のステップで作成したファイルの名前です。 -
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
を構成します。
- 次のコマンドを入力して、TLS証明書
cert.pem
とプライベートキーkey.pem
を保持するKubernetesシークレットを作成します。
kubectl create --namespace istio-system secret tls tls-cert \
--key key.pem \
--cert cert.pem
-
HTTPS接続用に作成した新しいシークレットを使用するようにKnativeを構成します。
-
次のコマンドを実行して、編集モードでKnative共有
gateway
を開きます。kubectl edit gateway knative-ingress-gateway --namespace knative-serving
-
次の
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のドキュメントを参照してください。
検証¶
-
Knativeサービスをデプロイします。
-
kubectl get ksvc -n <your-namespace>
でURLを確認します。 -
サービス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トラフィックを自動的にリダイレクトできます。これを構成するには
-
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
の例を使用する
-
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" ...
-
サービス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