1.4. サービスメッシュと OpenShift Serverless の統合


1.4.1. インストールの前提条件の確認

Service Mesh と Serverless の統合をインストールして設定する前に、前提条件が満たされていることを確認してください。

手順

  1. 競合するゲートウェイを確認します。

    コマンドの例

    $ 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: 443hosts: ["*"] をバインドする Gateway を返してはなりません。

    注記

    Serverless が属するメッシュは個別である必要があり、できれば Serverless ワークロード専用に予約されている必要があります。これは、Gateways などの追加設定が Serverless ゲートウェイ knative-local-gateway および knative-ingress-gateway に干渉する可能性があるためです。Red Hat OpenShift Service Mesh では、1 つのゲートウェイのみが同じポート (port: 443) 上でワイルドカードホストバインディング (hosts: ["*"]) を要求できます。別のゲートウェイがすでにこの設定をバインドしている場合は、Serverless ワークロード用に別のメッシュを作成する必要があります。

  2. 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 または LoadBalancerService オブジェクトを返しません。

    注記

    クラスターの外部 Knative サービスは、OpenShift Route を使用して OpenShift Ingress 経由で呼び出されることが想定されています。NodePort または LoadBalancer タイプの Service オブジェクトを使用して istio-ingressgateway を公開するなど、Service Mesh に直接アクセスすることはサポートされていません。

1.4.2. Service Mesh のインストールと設定

Serverless を Service Mesh と統合するには、特定の設定で Service Mesh をインストールする必要があります。

手順

  1. 次の設定で 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 を使用して呼び出すことはできません。したがって、これらのポートはメッシュから除外されます。
  2. サービスメッシュと統合する必要のある 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 が含まれている必要があります。

  3. ServiceMeshMemberRoll リソースを適用します。

    $ oc apply -f servicemesh-member-roll.yaml
  4. サービスメッシュがトラフィックを受け入れることができるように、必要なゲートウェイを作成します。次の例では、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

    1
    ワイルドカード証明書を含むシークレットの名前。
    2 3
    knative-local-gateway オブジェクトは HTTPS トラフィックを処理し、すべてのクライアントが mTLS を使用してリクエストを送信することを期待します。これは、Service Mesh 内からのトラフィックのみが可能であることを意味します。Service Mesh の外部からのワークロードは、OpenShift Routing 経由で外部ドメインを使用する必要があります。
  5. Gateway リソースを適用します。

    $ oc apply -f istio-knative-gateways.yaml

1.4.3. Serverless のインストールと設定

Service Mesh をインストールした後、特定の設定で Serverless をインストールする必要があります。

手順

  1. 次の 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

    1
    Istio 統合を有効にします。
    2
    Knative Serving データプレーン Pod のサイドカーの挿入を有効にします。
    3
    istio が istio-system namespace で実行されていない場合は、これら 2 つのフラグを正しい namespace で設定する必要があります。
  2. KnativeServing リソースを適用します。

    $ oc apply -f knative-serving-config.yaml
  3. 次の 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"

    1
    Eventing Istio コントローラーが各 InMemoryChannel または KafkaChannel サービスの DestinationRule を作成できるようにします。
    2
    Knative Eventing Pod のサイドカーインジェクションを有効にします。
  4. KnativeEventing リソースを適用します。

    $ oc apply -f knative-eventing-config.yaml
  5. 次の 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"

    1 2
    Apache Kafka クラスター URL (例: my-cluster-kafka-bootstrap.kafka:9092)。
    3
    Knative Kafka Pod のサイドカーインジェクションを有効にします。
  6. KnativeEventing オブジェクトを適用します。

    $ oc apply -f knative-kafka-config.yaml
  7. 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

    1
    Apache Kafka クラスターホストのリスト (例: my-cluster Kafka -bootstrap.kafka)。
    2
    Apache Kafka クラスターリスナーポート。
    注記

    spec.ports にリストされているポートは、TPC ポートの例です。実際の値は、Apache Kafka クラスターの設定方法によって異なります。

  8. ServiceEntry リソースを適用します。

    $ oc apply -f kafka-cluster-serviceentry.yaml

1.4.4. 統合の検証

Istio を有効にして Service Mesh と Serverless をインストールした後、統合が機能することを確認できます。

手順

  1. サイドカー挿入が有効で、パススルールートを使用する 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>

    1
    サービスメッシュメンバーロールの一部である namespace。
    2
    生成した証明書が Ingress ゲートウェイ経由で直接提供されるように、パススルー対応ルートを生成するように Knative Serving に指示します。
    3
    Service Mesh サイドカーは Knative サービス Pod に挿入します。
    重要

    Service Mesh で動作するようにするには、この例のアノテーションをすべての Knative Service に必ず追加してください。

  2. Service リソースを適用します。

    $ oc apply -f knative-service.yaml
  3. CA によって信頼されるようになった安全な接続を使用して、Serverless アプリケーションにアクセスします。

    $ curl --cacert root.crt <service_url>

    たとえば、以下を実行します。

    コマンドの例

    $ curl --cacert root.crt https://hello-default.apps.openshift.example.com

    出力例

    Hello Openshift!

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.