第1章 Service Mesh の統合
1.1. Service Mesh 2.x と OpenShift Serverless の統合 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Serverless Operator は、Knative のデフォルト Ingress として Kourier を提供します。ただし、Kourier が有効であるかどうかにかかわらず、OpenShift Serverless でサービスメッシュを使用できます。Kourier を無効にして統合すると、mTLS 機能など、Kourier イングレスがサポートしない追加のネットワークおよびルーティングオプションを設定できます。
次の前提条件と制限事項に注意してください。
- すべての Knative 内部コンポーネントと Knative Services は Service Mesh の一部であり、サイドカーインジェクションが有効になっています。これは、メッシュ全体で厳密な mTLS が適用されることを意味します。Knative Services へのすべてのリクエストには mTLS 接続が必要で、OpenShift Routing からの呼び出しを除き、クライアントは証明書を送信する必要があります。
- OpenShift Serverless と Service Mesh の統合では、1 つ のサービスメッシュのみをターゲットにできます。クラスター内には複数のメッシュが存在できますが、OpenShift Serverless はそのうちの 1 つでのみ使用できます。
-
OpenShift Serverless が含まれているターゲット
ServiceMeshMemberRollの変更、つまり OpenShift Serverless を別のメッシュに移動することはサポートされていません。ターゲットの Service Mesh を変更する唯一の方法は、OpenShift Serverless をアンインストールして再インストールすることです。
1.1.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
- クラスター管理者アクセス権を持つ Red Hat OpenShift Serverless アカウントにアクセスできる。
-
OpenShift CLI (
oc) がインストールされている。 - Serverless Operator がインストールされている。
- Red Hat OpenShift Service Mesh 2.x Operator がインストールされている。
以下の手順の例では、ドメイン
example.comを使用します。このドメインの証明書のサンプルは、サブドメイン証明書に署名する認証局 (CA) として使用されます。お使いのデプロイメントでこの手順を完了し、検証するには、一般に信頼されているパブリック CA によって署名された証明書、または組織が提供する CA のいずれかが必要です。コマンドの例は、ドメイン、サブドメイン、および CA に合わせて調整する必要があります。
-
ワイルドカード証明書を OpenShift Container Platform クラスターのドメインに一致するように設定する必要があります。たとえば、OpenShift Container Platform コンソールアドレスが
https://console-openshift-console.apps.openshift.example.comの場合は、ドメインが*.apps.openshift.example.comになるようにワイルドカード証明書を設定する必要があります。ワイルドカード証明書の設定に関する詳細は、着信外部トラフィックを暗号化する証明書の作成 のトピックを参照してください。 - デフォルトの OpenShift Container Platform クラスタードメインのサブドメインではないものを含むドメイン名を使用する必要がある場合は、これらのドメインのドメインマッピングを設定する必要があります。詳細は、OpenShift Serverless ドキュメントの カスタムドメインマッピングの作成 を参照してください。
OpenShift Serverless は、このドキュメントで明示的に文書化されている Red Hat OpenShift Service Mesh 機能の使用のみをサポートし、文書化されていない他の機能はサポートしません。
Service Mesh での Serverless 1.31 の使用は、Service Mesh バージョン 2.2 以降でのみサポートされます。1.31 以外のバージョンの詳細と情報は、「Red Hat OpenShift Serverless でサポートされる構成」ページを参照してください。
1.1.2. 着信外部トラフィックを暗号化する証明書の作成 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、サービスメッシュ mTLS 機能は、Ingress ゲートウェイとサイドカーを持つ個々の Pod 間で、サービスメッシュ自体内のトラフィックのみを保護します。OpenShift Container Platform クラスターに流入するトラフィックを暗号化するには、OpenShift Serverless とサービスメッシュの統合を有効にする前に証明書を生成する必要があります。
前提条件
- OpenShift Container Platform に対するクラスター管理者権限があるか、Red Hat OpenShift Service on AWS または OpenShift Dedicated に対するクラスターまたは専用管理者権限がある。
- OpenShift Serverless Operator および Knative Serving がインストールされている。
-
OpenShift CLI (
oc) がインストールされている。 - アプリケーションおよび他のワークロードを作成するために、プロジェクトを作成しているか、適切なロールおよびパーミッションが割り当てられたプロジェクトにアクセスできる。
手順
Knative サービスの証明書に署名する root 証明書と秘密鍵を作成します。
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=Example Inc./CN=example.com' \ -keyout root.key \ -out root.crt$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=Example Inc./CN=example.com' \ -keyout root.key \ -out root.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow ワイルドカード証明書を作成します。
openssl req -nodes -newkey rsa:2048 \ -subj "/CN=*.apps.openshift.example.com/O=Example Inc." \ -keyout wildcard.key \ -out wildcard.csr$ openssl req -nodes -newkey rsa:2048 \ -subj "/CN=*.apps.openshift.example.com/O=Example Inc." \ -keyout wildcard.key \ -out wildcard.csrCopy to Clipboard Copied! Toggle word wrap Toggle overflow ワイルドカード証明書を署名します。
openssl x509 -req -days 365 -set_serial 0 \ -CA root.crt \ -CAkey root.key \ -in wildcard.csr \ -out wildcard.crt$ openssl x509 -req -days 365 -set_serial 0 \ -CA root.crt \ -CAkey root.key \ -in wildcard.csr \ -out wildcard.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow ワイルドカード証明書を使用してシークレットを作成します。
oc create -n istio-system secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crt$ oc create -n istio-system secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow この証明書は、OpenShift Serverless をサービスメッシュと統合する際に作成されるゲートウェイによって取得され、Ingress ゲートウェイはこの証明書でトラフィックを提供します。
1.1.3. サービスメッシュと OpenShift Serverless の統合 リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh 2.x を OpenShift Serverless と統合することで、サーバーレスアプリケーションに対して、高度なトラフィック管理、セキュリティー、およびオブザーバビリティーの機能を有効化できます。このセクションでは、前提条件を確認し、両方のコンポーネントをインストールして設定し、統合が期待どおりに機能していることを確認する手順を説明します。
1.1.3.1. インストールの前提条件の確認 リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh と Serverless の統合をインストールして設定する前に、前提条件が満たされていることを確認してください。
手順
競合するゲートウェイを確認します。
コマンドの例
oc get gateway -A -o jsonpath='{range .items[*]}{@.metadata.namespace}{"/"}{@.metadata.name}{" "}{@.spec.servers}{"\n"}{end}' | column -t$ oc get gateway -A -o jsonpath='{range .items[*]}{@.metadata.namespace}{"/"}{@.metadata.name}{" "}{@.spec.servers}{"\n"}{end}' | column -tCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
knative-serving/knative-ingress-gateway [{"hosts":["*"],"port":{"name":"https","number":443,"protocol":"HTTPS"},"tls":{"credentialName":"wildcard-certs","mode":"SIMPLE"}}] knative-serving/knative-local-gateway [{"hosts":["*"],"port":{"name":"http","number":8081,"protocol":"HTTP"}}]knative-serving/knative-ingress-gateway [{"hosts":["*"],"port":{"name":"https","number":443,"protocol":"HTTPS"},"tls":{"credentialName":"wildcard-certs","mode":"SIMPLE"}}] knative-serving/knative-local-gateway [{"hosts":["*"],"port":{"name":"http","number":8081,"protocol":"HTTP"}}]Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、
knative-serving内のGatewaysと別の Service Mesh インスタンスの一部であるGatewaysを除き、port: 443とhosts: ["*"]をバインドするGatewayを返してはなりません。注記Serverless が属するメッシュは個別である必要があり、できれば Serverless ワークロード専用に予約されている必要があります。これは、
Gatewaysなどの追加設定が Serverless ゲートウェイknative-local-gatewayおよびknative-ingress-gatewayに干渉する可能性があるためです。Red Hat OpenShift Service Mesh では、1 つのゲートウェイのみが同じポート (port: 443) 上でワイルドカードホストバインディング (hosts: ["*"]) を要求できます。別のゲートウェイがすでにこの設定をバインドしている場合は、Serverless ワークロード用に別のメッシュを作成する必要があります。Red Hat OpenShift Service Mesh の
istio-ingressgatewayがタイプNodePortまたはLoadBalancerとして公開されているかどうかを確認します。コマンドの例
oc get svc -A | grep istio-ingressgateway
$ oc get svc -A | grep istio-ingressgatewayCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
istio-system istio-ingressgateway ClusterIP 172.30.46.146 none> 15021/TCP,80/TCP,443/TCP 9m50s
istio-system istio-ingressgateway ClusterIP 172.30.46.146 none> 15021/TCP,80/TCP,443/TCP 9m50sCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、タイプ
NodePortまたはLoadBalancerのServiceオブジェクトを返しません。注記クラスターの外部 Knative サービスは、OpenShift Route を使用して OpenShift Ingress 経由で呼び出されることが想定されています。
NodePortまたはLoadBalancerタイプのServiceオブジェクトを使用してistio-ingressgatewayを公開するなど、Service Mesh に直接アクセスすることはサポートされていません。
1.1.3.2. Service Mesh のインストールと設定 リンクのコピーリンクがクリップボードにコピーされました!
Serverless を Service Mesh と統合するには、特定の設定で Service Mesh をインストールする必要があります。
手順
次の設定で
istio-systemnamespace にServiceMeshControlPlaneリソースを作成します。重要既存の
ServiceMeshControlPlaneオブジェクトがある場合は、同じ設定が適用されていることを確認してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- メッシュ内で厳密な mTLS を強制します。有効なクライアント証明書を使用した呼び出しのみが許可されます。
- 2
- Serverless では、Knative サービスのグレースフルな終了は 30 秒です。
istio-proxyは、リクエストが破棄されないように、より長い終了時間を設定する必要があります。 - 3
- Knative ゲートウェイのみをターゲットとする Ingress ゲートウェイの特定のセレクターを定義します。
- 4
- これらのポートは、Kubernetes およびクラスター監視によって呼び出されます。これらはメッシュの一部ではないため、mTLS を使用して呼び出すことはできません。したがって、これらのポートはメッシュから除外されます。
サービスメッシュと統合する必要のある namespace をメンバーとして
ServiceMeshMemberRollオブジェクトに追加します。servicemesh-member-roll.yaml設定ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- サービスメッシュと統合する namespace の一覧。
重要この namespace のリストには、
knative-servingnamespace とknative-eventingnamespace が含まれている必要があります。ServiceMeshMemberRollリソースを適用します。oc apply -f servicemesh-member-roll.yaml
$ oc apply -f servicemesh-member-roll.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow サービスメッシュがトラフィックを受け入れることができるように、必要なゲートウェイを作成します。次の例では、
ISTIO_MUTUALモード (mTLS) でknative-local-gatewayオブジェクトを使用します。istio-knative-gateways.yaml設定ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gatewayリソースを適用します。oc apply -f istio-knative-gateways.yaml
$ oc apply -f istio-knative-gateways.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.3.3. Serverless のインストールと設定 リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh をインストールした後、特定の設定で Serverless をインストールする必要があります。
手順
次の
KnativeServingカスタムリソースを使用して Knative Serving をインストールします。これにより、Istio 統合が有効になります。knative-serving-config.yaml設定ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow KnativeServingリソースを適用します。oc apply -f knative-serving-config.yaml
$ oc apply -f knative-serving-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
KnativeEventingオブジェクトを使用して Knative Eventing をインストールします。これにより、Istio 統合が有効になります。knative-eventing-config.yaml設定ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow KnativeEventingリソースを適用します。oc apply -f knative-eventing-config.yaml
$ oc apply -f knative-eventing-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
KnativeKafkaカスタムリソースを使用して Knative Kafka をインストールします。これにより、Istio 統合が有効になります。knative-kafka-config.yaml設定ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow KnativeEventingオブジェクトを適用します。oc apply -f knative-kafka-config.yaml
$ oc apply -f knative-kafka-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow ServiceEntryをインストールして、KnativeKafkaコンポーネントと Apache Kafka クラスターとの間の通信を Service Mesh に通知します。kafka-cluster-serviceentry.yaml設定ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記spec.portsにリストされているポートは、TPC ポートの例です。実際の値は、Apache Kafka クラスターの設定方法によって異なります。ServiceEntryリソースを適用します。oc apply -f kafka-cluster-serviceentry.yaml
$ oc apply -f kafka-cluster-serviceentry.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.3.4. 統合の検証 リンクのコピーリンクがクリップボードにコピーされました!
Istio を有効にして Service Mesh と Serverless をインストールした後、統合が機能することを確認できます。
手順
サイドカー注入が有効で、パススルールートを使用する Knative サービスを作成します。
knative-service.yaml設定ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要Service Mesh で動作するようにするには、この例のアノテーションをすべての Knative Service に必ず追加してください。
Serviceリソースを適用します。oc apply -f knative-service.yaml
$ oc apply -f knative-service.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow CA によって信頼されるようになったセキュアな接続を使用して、serverless アプリケーションにアクセスします。
curl --cacert root.crt <service_url>
$ curl --cacert root.crt <service_url>Copy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、以下を実行します。
コマンドの例
curl --cacert root.crt https://hello-default.apps.openshift.example.com
$ curl --cacert root.crt https://hello-default.apps.openshift.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Hello Openshift!
Hello Openshift!Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.4. mTLS で Service Mesh を使用するときに Knative Serving と Knative Eventing メトリクスを有効にする リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh が Mutual Transport Layer Security (mTLS) で有効になっている場合は、Prometheus によるメトリクスのスクレイピングが Service Mesh により防止されるため、Knative Serving と Knative Eventing のメトリクスはデフォルトで無効になります。Service Mesh と mTLS を使用する場合は、Knative Serving および Knative Eventing メトリクスを有効にできます。
前提条件
クラスターにアクセスするための次のいずれかの権限がある。
- OpenShift Container Platform のクラスター管理者パーミッション
- Red Hat OpenShift Service on AWS のクラスター管理者パーミッション
- OpenShift Dedicated の専用管理者権限
-
OpenShift CLI (
oc) がインストールされている。 - アプリケーションやその他のワークロードを作成するための適切なロールと権限を持つプロジェクトにアクセスできます。
- クラスターに OpenShift Serverless Operator、Knative Serving、および Knative Eventing をインストールしている。
- mTLS 機能を有効にして Red Hat OpenShift Service Mesh をインストールしている。
手順
prometheusを Knative Serving カスタムリソース (CR) のobservability仕様でmetrics.backend-destinationとして指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この手順により、メトリクスがデフォルトで無効になることを防ぎます。
注記ServiceMeshControlPlaneをmanageNetworkPolicy: falseで設定する場合は、適切なイベント配信を確実に行うために、KnativeEventing のアノテーションを使用する必要があります。Knative Eventing でも同じメカニズムが使用されます。Knative Eventing のメトリクスを有効にするには、次のように、Knative Eventing カスタムリソース (CR) の
observability仕様でmetrics.backend-destinationとしてprometheusを指定する必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow istio-systemnamespace のデフォルトのサービスメッシュコントロールプレーンを変更して再適用し、以下の仕様が含まれるようにします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.5. デフォルトのネットワークポリシーを無効にする リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Serverless Operator はデフォルトでネットワークポリシーを生成します。デフォルトのネットワークポリシー生成を無効にするには、KnativeEventing および KnativeServing カスタムリソース (CR) に serverless.openshift.io/disable-istio-net-policies-generation アノテーションを追加します。
前提条件
クラスターにアクセスするための次のいずれかの権限がある。
- OpenShift Container Platform のクラスター管理者パーミッション
- Red Hat OpenShift Service on AWS のクラスター管理者パーミッション
- OpenShift Dedicated の専用管理者権限
-
OpenShift CLI (
oc) がインストールされている。 - アプリケーションやその他のワークロードを作成するための適切なロールと権限を持つプロジェクトにアクセスできます。
- クラスターに OpenShift Serverless Operator、Knative Serving、および Knative Eventing をインストールしている。
- mTLS 機能を有効にして Red Hat OpenShift Service Mesh をインストールしている。
手順
Knative カスタムリソースに
serverless.openshift.io/disable-istio-net-policies-generation: "true"アノテーションを追加します。注記OpenShift Serverless Operator は、必要なネットワークポリシーをデフォルトで生成します。
ServiceMeshControlPlaneをmanageNetworkPolicy: falseで設定する場合は、適切なイベント配信を確保するために、デフォルトのネットワークポリシー生成を無効にする必要があります。デフォルトのネットワークポリシー生成を無効にするには、KnativeEventingおよびKnativeServingカスタムリソース (CR) にserverless.openshift.io/disable-istio-net-policies-generationアノテーションを追加します。次のコマンドを実行して、
KnativeEventingCR にアノテーションを付けます。oc edit KnativeEventing -n knative-eventing
$ oc edit KnativeEventing -n knative-eventingCopy to Clipboard Copied! Toggle word wrap Toggle overflow KnativeEventingCR の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
KnativeServingCR にアノテーションを付けます。oc edit KnativeServing -n knative-serving
$ oc edit KnativeServing -n knative-servingCopy to Clipboard Copied! Toggle word wrap Toggle overflow KnativeServingCR の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.6. Service Mesh のシークレットフィルタリングを使用した net-istio のメモリー使用量の改善 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Kubernetes client-go ライブラリーの informers の実装は、特定のタイプのすべてのリソースをフェッチします。これにより、多くのリソースが使用可能な場合にかなりのオーバーヘッドが発生する可能性があり、メモリーリークが原因で大規模なクラスターで Knative net-istio イングレスコントローラーが失敗する可能性があります。ただし、Knative net-istio Ingress コントローラーではフィルタリングメカニズムを使用できます。これにより、コントローラーは Knative 関連のシークレットのみを取得できます。
シークレットのフィルタリングは、OpenShift Serverless Operator 側でデフォルトで有効化されています。環境変数 ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID=true は、デフォルトで net-istio コントローラー Pod に追加されます。
シークレットフィルタリングを有効にする場合は、すべてのシークレットに networking.internal.knative.dev/certificate-uid: "<id>" というラベルを付ける必要があります。そうしないと、Knative Serving がシークレットを検出しないため、障害が発生します。新規および既存のシークレットの両方にラベルを付ける必要があります。
前提条件
- OpenShift Container Platform に対するクラスター管理者権限があるか、Red Hat OpenShift Service on AWS または OpenShift Dedicated に対するクラスターまたは専用管理者権限がある。
- アプリケーションおよび他のワークロードを作成するために、プロジェクトを作成しているか、適切なロールおよびパーミッションが割り当てられたプロジェクトにアクセスできる。
- Red Hat OpenShift Service Mesh をインストールしている。OpenShift Serverless with Service Mesh は、Red Hat OpenShift Service Mesh バージョン 2.0.5 以降での使用でのみサポートされます。
- OpenShift Serverless Operator および Knative Serving をインストールしている。
-
OpenShift CLI (
oc) がインストールされている。
KnativeServing カスタムリソース (CR) の workloads フィールドを使用して、ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID 変数を false に設定することで、シークレットフィルターを無効化できます。
KnativeServing CR の例