1.4. OpenShift Serverless와 Service Mesh 통합


1.4.1. 설치 사전 요구 사항 확인

Serverless와 Service Mesh 통합을 설치하고 구성하기 전에 사전 요구 사항이 충족되었는지 확인합니다.

프로세스

  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"}}]

    이 명령은 다른 Service Mesh 인스턴스의 일부인 knative-servingGateway게이트웨이 를 제외하고 포트 443호스트: ["*"] 를 바인딩하는 게이트웨이 를 반환해서는 안 됩니다.

    참고

    Serverless에서 속하는 메시는 Serverless 워크로드에만 예약되어 있어야 합니다. 이는 게이트웨이와 같은 추가 구성이 Serverless 게이트웨이 knative-local-gatewayknative-ingress-gateway 를 방해할 수 있기 때문입니다. Red Hat OpenShift Service Mesh는 하나의 게이트웨이가 동일한 포트(포트:443)에서 와일드카드호스트 바인딩(호스트: ["*"])을 요청할 수 있도록 허용합니다. 다른 게이트웨이가 이미 이 구성을 바인딩하고 있는 경우 Serverless 워크로드에 대해 별도의 메시를 생성해야 합니다.

  2. Red Hat OpenShift Service Mesh istio-ingressgatewayNodePort 또는 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 경로를 사용하여 OpenShift Ingress를 통해 호출해야 합니다. NodePort 또는 LoadBalancer 유형의 Service 오브젝트를 사용하여 istio-ingressgateway 를 노출하는 것과 같이 서비스 메시에 직접 액세스하는 것은 지원되지 않습니다.

1.4.2. 서비스 메시 설치 및 구성

Serverless를 Service Mesh와 통합하려면 특정 구성으로 서비스 메시를 설치해야 합니다.

프로세스

  1. 다음 구성을 사용하여 istio-system 네임스페이스에서 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 게이트웨이만 대상으로 할 수신 게이트웨이의 특정 선택기를 정의합니다.
    4
    이러한 포트는 Kubernetes 및 클러스터 모니터링에 의해 호출되며 메시의 일부가 아니며 mTLS를 사용하여 호출할 수 없습니다. 따라서 이러한 포트는 메시에서 제외됩니다.
  2. Service Mesh와 통합할 네임스페이스를 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
    Service Mesh와 통합할 네임스페이스 목록입니다.
    중요

    이 네임스페이스 목록에 knative-servingknative-eventing 네임스페이스가 포함되어야 합니다.

  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 내에서 들어오는 트래픽만 가능합니다. 서비스 메시 외부의 워크로드는 OpenShift 라우팅을 통해 외부 도메인을 사용해야 합니다.
  5. Gateway 리소스를 적용합니다.

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

1.4.3. Serverless 설치 및 구성

Service Mesh를 설치한 후 특정 구성으로 Serverless를 설치해야 합니다.

프로세스

  1. Istio 통합을 활성화하는 다음 KnativeServing 사용자 정의 리소스를 사용하여 Knative Serving을 설치합니다.

    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
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: autoscaler
        annotations:
          "sidecar.istio.io/inject": "true"
          "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-system 네임스페이스가 istio-system 네임스페이스에서 실행되지 않는 경우 이 두 플래그를 올바른 네임스페이스로 설정해야 합니다.
  2. KnativeServing 리소스를 적용합니다.

    $ oc apply -f knative-serving-config.yaml
  3. Istio 통합을 활성화하는 다음 KnativeEventing 오브젝트를 사용하여 Knative Eventing을 설치합니다.

    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
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: imc-dispatcher
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: mt-broker-ingress
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: mt-broker-filter
        annotations:
          "sidecar.istio.io/inject": "true"
          "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. Istio 통합을 활성화하는 다음 KnativeKafka 사용자 정의 리소스를 사용하여 Knative Kafka를 설치합니다.

    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
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: kafka-broker-receiver
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: kafka-broker-dispatcher
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: kafka-channel-receiver
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: kafka-channel-dispatcher
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: kafka-source-dispatcher
        annotations:
          "sidecar.istio.io/inject": "true"
          "sidecar.istio.io/rewriteAppHTTPProbers": "true"
      - name: kafka-sink-receiver
        annotations:
          "sidecar.istio.io/inject": "true"
          "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 클러스터 간의 통신에 대해 서비스 메시에 알립니다.

    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 에서 나열된 포트는 예제 Cryostat 포트입니다. 실제 값은 Apache Kafka 클러스터 구성 방법에 따라 다릅니다.

  8. ServiceEntry 리소스를 적용합니다.

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

1.4.4. 통합 확인

Istio가 활성화된 Service Mesh 및 Serverless를 설치한 후 통합이 작동하는지 확인할 수 있습니다.

프로세스

  1. 사이드카 삽입이 활성화되고 패스쓰루(pass-through) 경로를 사용하는 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
    서비스 메시 멤버 롤에 포함된 네임스페이스입니다.
    2
    생성한 인증서가 수신 게이트웨이를 통해 직접 제공되도록 Knative Serving에 패스스루 지원 경로를 생성하도록 지시합니다.
    3
    서비스 메시 사이드카를 Knative 서비스 Pod에 삽입합니다.
    중요

    이 예제의 주석을 모든 Knative 서비스에 항상 추가하여 서비스 메시에서 작동하도록 합니다.

  2. Service 리소스를 적용합니다.

    $ oc apply -f knative-service.yaml
  3. CA에서 신뢰하는 보안 연결을 사용하여 서버리스 애플리케이션에 액세스합니다.

    $ 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은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.