1.3. Service Mesh 3.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 with Service Mesh の統合では、1 つのサービスメッシュのみをターゲットにできます。クラスター内には複数のメッシュが存在できますが、OpenShift Serverless はそのうちの 1 つでのみ使用できます。
1.3.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
- クラスター管理者アクセス権を持つ Red Hat OpenShift Serverless アカウントにアクセスできる。
-
OpenShift CLI (
oc) がインストールされている。 - Serverless Operator がインストールされている。
- Red Hat OpenShift Service Mesh 3.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 クラスタードメインのサブドメインではないものを含むドメイン名を使用する必要がある場合は、これらのドメインのドメインマッピングを設定する必要があります。詳細は、Creating a custom domain mapping OpenShift Serverless を参照してください。
1.3.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-serving-ingressnamespace にアクセスできる。この namespace は、インストール時に OpenShift Serverless Operator が自動的に作成されます。 - アプリケーションおよび他のワークロードを作成するために、プロジェクトを作成しているか、適切なロールおよびパーミッションが割り当てられたプロジェクトにアクセスできる。
手順
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 -nodes -newkey rsa:2048 \ -subj "/CN=*.apps.openshift.example.com/O=Example Inc." \ -keyout wildcard.key \ -out wildcard.csrワイルドカード証明書を署名します。
$ openssl x509 -req -days 365 -set_serial 0 \ -CA root.crt \ -CAkey root.key \ -in wildcard.csr \ -out wildcard.crtService Mesh のバージョンに応じて、次のコマンドのいずれかを入力して、ワイルドカード証明書を含むシークレットを作成します。
オプション A: Service Mesh 2.x の場合は、folloing コマンドを入力して
istio-systemnamespace にシークレットを作成します。$ oc create -n istio-system secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crtオプション B: Service Mesh 3.x の場合は、folloing コマンドを入力して、
knative-serving-ingressnamespace にシークレットを作成します。$ oc create -n knative-serving-ingress secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crtシークレットに使用される namespace はサービスメッシュのバージョンによって異なります。サービスメッシュ 2.x は
istio-systemnamespace の証明書を想定します。Service Mesh 3.x は、OpenShift Serverless Ingress ゲートウェイが実行される専用のknative-serving-ingressnamespace を使用します。
1.3.3. Service Mesh 3.x と OpenShift Serverless の統合の設定および検証 リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh 3.x を OpenShift Serverless と統合して、サーバーレスアプリケーションの高度なトラフィック管理、セキュリティー、および可観測性を有効にできます。このセクションでは、前提条件を確認し、両方のコンポーネントをインストールして設定し、統合が期待どおりに機能していることを確認する手順を説明します。
1.3.3.1. インストールの前提条件の確認 リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh と Serverless の統合をインストールして設定する前に、前提条件が満たされていることを確認してください。
手順
競合するゲートウェイを確認します。
コマンドの例
$ oc get gateway -A -o jsonpath='{range .items[*]}{@.metadata.namespace}{"/"}{@.metadata.name}{" "}{@.spec.servers}{"\n"}{end}' | column -t出力例
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内の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 ワークロード用に別のメッシュを作成する必要があります。
1.3.3.2. Service Mesh 3.x のインストールおよび設定 リンクのコピーリンクがクリップボードにコピーされました!
必要な Istio コンポーネント、ゲートウェイ、および Knative Serving リソースをインストールおよび設定することで、Service Mesh 3.x を Serverless と統合できます。これらのリソースが設定されると、Istio で Knative Serving インスタンスをデプロイし、サーバーレスワークロードが Service Mesh 環境内で実行されるようにできます。
手順
次の設定で、
istio-systemnamespace にIstioリソースを作成します。apiVersion: sailoperator.io/v1 kind: Istio metadata: name: default spec: values: meshConfig: defaultConfig: terminationDrainDuration: 35s updateStrategy: inactiveRevisionDeletionGracePeriodSeconds: 30 type: InPlace namespace: istio-system version: v1.26-latest次のコマンドを実行して、
istio-systemというプロジェクトを作成します。$ oc new-project istio-system次のコマンドを実行して、
Istioカスタムリソース (CR) を適用します。$ oc apply -f istio.yaml次の設定で、
istio-cninamespace にIstioCNIリソースを作成します。apiVersion: sailoperator.io/v1 kind: IstioCNI metadata: name: default spec: namespace: istio-cni version: v1.26-latest以下のコマンドを実行して
istio-cniというプロジェクトを作成します。$ oc new-project istio-cni次のコマンドを実行して、
IstioCNICR を適用します。$ oc apply -f istio-cni.yaml次の設定で、
gateway-deploy.yamlという名前のファイルを作成します。apiVersion: apps/v1 kind: Deployment metadata: name: knative-istio-ingressgateway namespace: knative-serving-ingress spec: selector: matchLabels: knative: ingressgateway template: metadata: annotations: inject.istio.io/templates: gateway labels: knative: ingressgateway sidecar.istio.io/inject: "true" spec: containers: - name: istio-proxy image: auto --- # Set up roles to allow reading credentials for TLS apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: istio-ingressgateway-sds namespace: knative-serving-ingress rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: istio-ingressgateway-sds namespace: knative-serving-ingress roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: istio-ingressgateway-sds subjects: - kind: ServiceAccount name: default-
spec.template.metadata.annotations.inject.istio.io/templatesは、デフォルトのサイドカーテンプレートではなく、ゲートウェイインジェクションテンプレートを指定します。 -
spec.template.metadata.labels.knativeは、ゲートウェイの一意のラベルを定義します。これは、ゲートウェイがこのワークロードを選択できるようにするために必要です。 -
spec.template.metadata.labels.sidecar.istio.io/injectは、ゲートウェイの挿入を有効にします。 -
spec.template.spec.containers.imageは、Pod が起動するたびにイメージが自動的に更新されるようにします。
-
次のコマンドを実行して、リソースを適用します。
$ oc apply -f gateway-deploy.yaml次の設定で
serving-gateways.yamlという名前のファイルを作成し、Knative Serving コンポーネントのゲートウェイリソースを作成します。########################################################### # cluster external ########################################################### apiVersion: v1 kind: Service metadata: name: knative-istio-ingressgateway namespace: knative-serving-ingress spec: type: ClusterIP selector: knative: ingressgateway ports: - name: http2 port: 80 targetPort: 8080 - name: https port: 443 targetPort: 8443 --- apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: knative-ingress-gateway namespace: knative-serving spec: selector: knative: ingressgateway servers: - hosts: - '*' port: name: https number: 443 protocol: HTTPS tls: credentialName: wildcard-certs mode: SIMPLE --- ########################################################### # cluster local ########################################################### apiVersion: v1 kind: Service metadata: labels: experimental.istio.io/disable-gateway-port-translation: "true" name: knative-local-gateway namespace: knative-serving-ingress spec: ports: - name: http2 port: 80 protocol: TCP targetPort: 8081 selector: knative: ingressgateway type: ClusterIP --- apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: knative-local-gateway namespace: knative-serving spec: selector: knative: ingressgateway servers: - hosts: - '*' port: name: http number: 8081 protocol: HTTP次のコマンドを実行して、リソースを適用します。
$ oc apply -f serving-gateways.yaml次の設定で、
istio-systemnamespace にPeerAuthenticationリソースを作成し、メッシュ全体で mTLS を適用します。apiVersion: security.istio.io/v1 kind: PeerAuthentication metadata: name: mesh-mtls namespace: istio-system spec: mtls: mode: STRICT次のコマンドを実行して、リソースを適用します。
$ oc apply -f peerauth.yaml
1.3.3.3. Serverless のインストールと設定 リンクのコピーリンクがクリップボードにコピーされました!
Service Mesh をインストールした後、特定の設定で Serverless をインストールする必要があります。
手順
次の
KnativeServingカスタムリソースを使用して Knative Serving をインストールします。これにより、Istio 統合が有効になります。knative-serving-config.yaml設定ファイルの例apiVersion: operator.knative.dev/v1beta1 kind: KnativeServing metadata: name: knative-serving namespace: knative-serving annotations: serverless.openshift.io/disable-istio-net-policies-generation: "true" spec: ingress: istio: enabled: true1 deployments:2 - name: activator labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true" - name: autoscaler labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true" config: istio:3 gateway.knative-serving.knative-ingress-gateway: istio-ingressgateway.<your-istio-namespace>.svc.cluster.local local-gateway.knative-serving.knative-local-gateway: knative-local-gateway.<your-istio-namespace>.svc.cluster.localKnativeServingリソースを適用します。$ oc apply -f knative-serving-config.yaml次の
KnativeEventingオブジェクトを使用して Knative Eventing をインストールします。これにより、Istio 統合が有効になります。knative-eventing-config.yaml設定ファイルの例apiVersion: operator.knative.dev/v1beta1 kind: KnativeEventing metadata: name: knative-eventing namespace: knative-eventing annotations: serverless.openshift.io/disable-istio-net-policies-generation: "true" spec: config: features: istio: enabled workloads: - name: pingsource-mt-adapter labels: sidecar.istio.io/inject: "true" annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true" - name: imc-dispatcher labels: sidecar.istio.io/inject: "true" annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true" - name: mt-broker-ingress labels: sidecar.istio.io/inject: "true" annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true" - name: mt-broker-filter labels: sidecar.istio.io/inject: "true" annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true" - name: job-sink labels: sidecar.istio.io/inject: "true" annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true"-
spec.config.features.istioは、Eventing Istio コントローラーが、InMemoryChannelまたはKafkaChannelサービスごとにDestinationRuleを作成できるようにします。 -
spec.workloadは、Knative Eventing Pod のサイドカー挿入を有効にします。
-
KnativeEventingリソースを適用します。$ oc apply -f knative-eventing-config.yaml次の
KnativeKafkaカスタムリソースを使用して Knative Kafka をインストールします。これにより、Istio 統合が有効になります。knative-kafka-config.yaml設定ファイルの例apiVersion: operator.serverless.openshift.io/v1alpha1 kind: KnativeKafka metadata: name: knative-kafka namespace: knative-eventing spec: channel: enabled: true bootstrapServers: <bootstrap_servers>1 source: enabled: true broker: enabled: true defaultConfig: bootstrapServers: <bootstrap_servers>2 numPartitions: <num_partitions> replicationFactor: <replication_factor> sink: enabled: true workloads:3 - name: kafka-controller labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true" - name: kafka-broker-receiver labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true" - name: kafka-broker-dispatcher labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true" - name: kafka-channel-receiver labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true" - name: kafka-channel-dispatcher labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true" - name: kafka-source-dispatcher labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true" - name: kafka-sink-receiver labels: "sidecar.istio.io/inject": "true" annotations: "sidecar.istio.io/rewriteAppHTTPProbers": "true"KnativeEventingオブジェクトを適用します。$ oc apply -f knative-kafka-config.yamlServiceEntryをインストールして、KnativeKafkaコンポーネントと Apache Kafka クラスターとの間の通信を Service Mesh に通知します。kafka-cluster-serviceentry.yaml設定ファイルの例apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: kafka-cluster namespace: knative-eventing spec: hosts:1 - <bootstrap_servers_without_port> exportTo: - "." ports:2 - number: 9092 name: tcp-plain protocol: TCP - number: 9093 name: tcp-tls protocol: TCP - number: 9094 name: tcp-sasl-tls protocol: TCP - number: 9095 name: tcp-sasl-tls protocol: TCP - number: 9096 name: tcp-tls protocol: TCP location: MESH_EXTERNAL resolution: NONE注記spec.portsにリストされているポートは、TPC ポートの例です。実際の値は、Apache Kafka クラスターの設定方法によって異なります。ServiceEntryリソースを適用します。$ oc apply -f kafka-cluster-serviceentry.yaml
1.3.3.4. Service Mesh 3.x の統合設定の確認 リンクのコピーリンクがクリップボードにコピーされました!
Serverless で Service Mesh 3.x をインストールして設定した後に、統合が正常に動作していることを確認できます。この検証により、Service Mesh コンポーネント、ゲートウェイ、および Knative Serving 設定が適切に設定され、サーバーレスワークロードがメッシュ内で安全に通信できるようになります。
folloiwng テストは、単純な Knative サービスをデプロイし、サイドカーインジェクション、相互トランスポート層セキュリティー(mTLS)の互換性、および Ingress ゲートウェイを介したパススルーを検証します。
手順
次のコマンドを入力して、Istio コンポーネントが実行されていることを確認します。
$ oc get pods -n istio-system次のコマンドを入力して、Istio CNI コンポーネントが実行されていることを確認します。
$ oc get pods -n istio-cni次のコマンドを入力して、Knative コンポーネントが実行されていることを確認します。
$ oc get pods -n knative-serving以下のコマンドを入力して、ゲートウェイサービスが存在することを確認します。
$ oc get svc -n knative-serving-ingress次のコマンドを入力して、テスト namespace を作成します。
$ oc new-project demoサンプル Knative サービスマニフェストを作成し、以下の設定で
hello-service.yamlとして保存します。apiVersion: serving.knative.dev/v1 kind: Service metadata: annotations: serving.knative.openshift.io/enablePassthrough: "true" name: hello-service namespace: demo spec: template: metadata: labels: sidecar.istio.io/inject: "true" annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true" spec: containers: - image: quay.io/openshift-knative/showcase-
serving.knative.openshift.io/enablePassthrough: "true"は、Istio ゲートウェイを介した TLS パススルーを許可するように Ingress を設定します。 -
sidecar.istio.io/inject: "true"により、Istio プロキシーが挿入されます。 -
sidecar.istio.io/rewriteAppHTTPProbers: "true"は、Knative ヘルスプローブを mTLS と連携させます。
-
以下のコマンドを入力して Knative サービスを適用します。
$ oc apply -f hello-service.yaml次のコマンドを入力して、サイドカーの挿入および Pod の準備状態を確認します。
$ oc get pods -n demo$ oc get pod -n demo -l serving.knative.dev/service=hello-service -o jsonpath='{.items[0].spec.containers[*].name}{"\n"}'次のコマンドを入力して、サービス URL を取得します。
$ oc get ksvc hello-service -n demo -o jsonpath='{.status.url}{"\n"}'以下のコマンドのいずれかを入力して、サービスを呼び出します。
オプション A: Ingress ドメインに信頼できる証明書が設定されている場合は、フロングリングコマンドを入力します。
$ curl https://$(oc get ksvc hello-service -n demo -o jsonpath='{.status.url}' | sed 's#https://##')オプション B: カスタム証明書または自己署名証明書を使用している場合は、次のコマンドを入力して、-k を使用するか、CA ファイルに --cacert <path> を指定します。
$ curl --cacert <path_to_your_CA_file> https://$(oc get ksvc hello-service -n demo -o jsonpath='{.status.url}' | sed 's#https://##')次の例のような出力が表示されます。
{"artifact":"knative-showcase","greeting":"Welcome"}JSON の正確な値が変わる可能性がありますが、応答では
knative-showcaseアプリケーションが正常に実行されていることを示すはずです。
1.3.4. デフォルトのネットワークポリシーを無効にする リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Serverless Operator はデフォルトでネットワークポリシーを生成します。デフォルトのネットワークポリシー生成を無効にするには、KnativeEventing および KnativeServing カスタムリソース (CR) に serverless.openshift.io/disable-istio-net-policies-generation アノテーションを追加します。
OpenShift Serverless Operator は、必要なネットワークポリシーをデフォルトで生成します。ただし、Service Mesh 3.x のサポートは現在テクノロジープレビューです。これらのデフォルトのネットワークポリシーには、Service Mesh 3.x のネットワークの要件は考慮されていません。その結果、これらのポリシーが適用されると、新しく作成された Knative サービス(ksvc)が Ready 状態にならない場合があります。
この問題を回避するには、KnativeServing および KnativeEventing カスタムリソースの両方で serverless.openshift.io/disable-istio-net-policies-generation アノテーションを true に設定して、Istio 関連のネットワークポリシーの自動生成を無効にする必要があります。
前提条件
クラスターにアクセスするための次のいずれかの権限がある。
- 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-eventingKnativeEventingCR の例apiVersion: operator.knative.dev/v1beta1 kind: KnativeEventing metadata: name: knative-eventing namespace: knative-eventing annotations: serverless.openshift.io/disable-istio-net-policies-generation: "true"次のコマンドを実行して、
KnativeServingCR にアノテーションを付けます。$ oc edit KnativeServing -n knative-servingKnativeServingCR の例apiVersion: operator.knative.dev/v1beta1 kind: KnativeServing metadata: name: knative-serving namespace: knative-serving annotations: serverless.openshift.io/disable-istio-net-policies-generation: "true"