1.4. サービスメッシュと OpenShift Serverless の統合
1.4.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 ワークロード用に別のメッシュを作成する必要があります。Red Hat OpenShift Service Mesh の
istio-ingressgateway
がタイプNodePort
またはLoadBalancer
として公開されているかどうかを確認します。コマンドの例
$ oc get svc -A | grep istio-ingressgateway
出力例
istio-system istio-ingressgateway ClusterIP 172.30.46.146 none> 15021/TCP,80/TCP,443/TCP 9m50s
このコマンドは、タイプ
NodePort
またはLoadBalancer
のService
オブジェクトを返しません。注記クラスターの外部 Knative サービスは、OpenShift Route を使用して OpenShift Ingress 経由で呼び出されることが想定されています。
NodePort
またはLoadBalancer
タイプのService
オブジェクトを使用してistio-ingressgateway
を公開するなど、Service Mesh に直接アクセスすることはサポートされていません。
1.4.2. Service Mesh のインストールと設定
Serverless を Service Mesh と統合するには、特定の設定で Service Mesh をインストールする必要があります。
手順
次の設定で
istio-system
namespace にServiceMeshControlPlane
リソースを作成します。重要既存の
ServiceMeshControlPlane
オブジェクトがある場合は、同じ設定が適用されていることを確認してください。apiVersion: maistra.io/v2 kind: ServiceMeshControlPlane metadata: name: basic namespace: istio-system spec: profiles: - default security: dataPlane: mtls: true 1 techPreview: meshConfig: defaultConfig: terminationDrainDuration: 35s 2 gateways: ingress: service: metadata: labels: knative: ingressgateway 3 proxy: networking: trafficControl: inbound: excludedPorts: 4 - 8444 # metrics - 8022 # serving: wait-for-drain k8s pre-stop hook
- 1
- メッシュ内で厳密な mTLS を強制します。有効なクライアント証明書を使用した呼び出しのみが許可されます。
- 2
- Serverless では、Knative サービスの正常な終了は 30 秒です。
istio-proxy
は、リクエストが破棄されないように、より長い終了時間を設定する必要があります。 - 3
- Knative ゲートウェイのみをターゲットとする Ingress ゲートウェイの特定のセレクターを定義します。
- 4
- これらのポートは、Kubernetes およびクラスター監視によって呼び出されます。これらはメッシュの一部ではないため、mTLS を使用して呼び出すことはできません。したがって、これらのポートはメッシュから除外されます。
サービスメッシュと統合する必要のある namespace をメンバーとして
ServiceMeshMemberRoll
オブジェクトに追加します。servicemesh-member-roll.yaml
設定ファイルの例apiVersion: maistra.io/v1 kind: ServiceMeshMemberRoll metadata: name: default namespace: istio-system spec: members: 1 - knative-serving - knative-eventing - your-OpenShift-projects
- 1
- サービスメッシュと統合する namespace の一覧。
重要この namespace のリストには、
knative-serving
namespace とknative-eventing
namespace が含まれている必要があります。ServiceMeshMemberRoll
リソースを適用します。$ oc apply -f servicemesh-member-roll.yaml
サービスメッシュがトラフィックを受け入れることができるように、必要なゲートウェイを作成します。次の例では、
ISTIO_MUTUAL
モード (mTLS) でknative-local-gateway
オブジェクトを使用します。istio-knative-gateways.yaml
設定ファイルの例apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: knative-ingress-gateway namespace: knative-serving spec: selector: knative: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS hosts: - "*" tls: mode: SIMPLE credentialName: <wildcard_certs> 1 --- apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: knative-local-gateway namespace: knative-serving spec: selector: knative: ingressgateway servers: - port: number: 8081 name: https protocol: HTTPS 2 tls: mode: ISTIO_MUTUAL 3 hosts: - "*" --- apiVersion: v1 kind: Service metadata: name: knative-local-gateway namespace: istio-system labels: experimental.istio.io/disable-gateway-port-translation: "true" spec: type: ClusterIP selector: istio: ingressgateway ports: - name: http2 port: 80 targetPort: 8081
Gateway
リソースを適用します。$ oc apply -f istio-knative-gateways.yaml
1.4.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 spec: ingress: istio: enabled: true 1 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.local
KnativeServing
リソースを適用します。$ 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 spec: config: features: istio: enabled 1 workloads: 2 - 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"
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.yaml
ServiceEntry
をインストールして、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.4.4. 統合の検証
Istio を有効にして Service Mesh と Serverless をインストールした後、統合が機能することを確認できます。
手順
サイドカー挿入が有効で、パススルールートを使用する Knative サービスを作成します。
knative-service.yaml
設定ファイルの例apiVersion: serving.knative.dev/v1 kind: Service metadata: name: <service_name> namespace: <namespace> 1 annotations: serving.knative.openshift.io/enablePassthrough: "true" 2 spec: template: metadata: annotations: sidecar.istio.io/inject: "true" 3 sidecar.istio.io/rewriteAppHTTPProbers: "true" spec: containers: - image: <image_url>
重要Service Mesh で動作するようにするには、この例のアノテーションをすべての Knative Service に必ず追加してください。
Service
リソースを適用します。$ oc apply -f knative-service.yaml
CA によって信頼されるようになった安全な接続を使用して、Serverless アプリケーションにアクセスします。
$ curl --cacert root.crt <service_url>
たとえば、以下を実行します。
コマンドの例
$ curl --cacert root.crt https://hello-default.apps.openshift.example.com
出力例
Hello Openshift!