1.4. OpenShift Serverless와 Service Mesh 통합
1.4.1. 설치 사전 요구 사항 확인
Serverless와 Service Mesh 통합을 설치하고 구성하기 전에 사전 요구 사항이 충족되었는지 확인합니다.
프로세스
충돌하는 게이트웨이를 확인합니다.
명령 예
$ 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-serving
및Gateway
의게이트웨이
를 제외하고포트 443
및호스트: ["*"]
를 바인딩하는게이트웨이
를 반환해서는 안 됩니다.참고Serverless에서 속하는 메시는 Serverless 워크로드에만 예약되어 있어야 합니다. 이는 게이트웨이와 같은 추가 구성이 Serverless 게이트웨이
knative-local-gateway
및knative-ingress-gateway
를 방해할 수 있기 때문입니다.Red Hat OpenShift Service Mesh는 하나의 게이트웨이가 동일한 포트(포트:
443
)에서 와일드카드호스트 바인딩(호스트: ["*"]
)을 요청할 수 있도록 허용합니다. 다른 게이트웨이가 이미 이 구성을 바인딩하고 있는 경우 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 경로를 사용하여 OpenShift Ingress를 통해 호출해야 합니다.
NodePort
또는LoadBalancer
유형의Service
오브젝트를 사용하여istio-ingressgateway
를 노출하는 것과 같이 서비스 메시에 직접 액세스하는 것은 지원되지 않습니다.
1.4.2. 서비스 메시 설치 및 구성
Serverless를 Service Mesh와 통합하려면 특정 구성으로 서비스 메시를 설치해야 합니다.
프로세스
다음 구성을 사용하여
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를 사용하여 호출할 수 없습니다. 따라서 이러한 포트는 메시에서 제외됩니다.
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-serving
및knative-eventing
네임스페이스가 포함되어야 합니다.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를 설치해야 합니다.
프로세스
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 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
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 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
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 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 클러스터 간의 통신에 대해 서비스 메시에 알립니다.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
에서 나열된 포트는 예제 Cryostat 포트입니다. 실제 값은 Apache Kafka 클러스터 구성 방법에 따라 다릅니다.ServiceEntry
리소스를 적용합니다.$ oc apply -f kafka-cluster-serviceentry.yaml
1.4.4. 통합 확인
Istio가 활성화된 Service Mesh 및 Serverless를 설치한 후 통합이 작동하는지 확인할 수 있습니다.
프로세스
사이드카 삽입이 활성화되고 패스쓰루(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>
중요이 예제의 주석을 모든 Knative 서비스에 항상 추가하여 서비스 메시에서 작동하도록 합니다.
Service
리소스를 적용합니다.$ oc apply -f knative-service.yaml
CA에서 신뢰하는 보안 연결을 사용하여 서버리스 애플리케이션에 액세스합니다.
$ curl --cacert root.crt <service_url>
예를 들어 다음을 실행합니다.
명령 예
$ curl --cacert root.crt https://hello-default.apps.openshift.example.com
출력 예
Hello Openshift!