Questo contenuto non è disponibile nella lingua selezionata.
Chapter 2. Using Service Mesh to isolate network traffic with OpenShift Serverless
Using Service Mesh to isolate network traffic with OpenShift Serverless is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.
For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.
			Service Mesh can be used to isolate network traffic between tenants on a shared Red Hat OpenShift Serverless cluster using Service Mesh AuthorizationPolicy resources. Serverless can also leverage this, using several Service Mesh resources. A tenant is a group of one or multiple projects that can access each other over the network on a shared cluster.
		
2.1. Prerequisites
- You have access to an Red Hat OpenShift Serverless account with cluster administrator access.
- You have set up the Service Mesh and Serverless integration.
- You have created one or more OpenShift projects for each tenant.
2.2. High-level architecture
				The high-level architecture of Serverless traffic isolation provided by Service Mesh consists of AuthorizationPolicy objects in the knative-serving, knative-eventing, and the tenants' namespaces, with all the components being part of the Service Mesh. The injected Service Mesh sidecars enforce those rules to isolate network traffic between tenants.
			
2.3. Securing the Service Mesh
Authorization policies and mTLS allow you to secure Service Mesh.
Procedure
- Make sure that all Red Hat OpenShift Serverless projects of your tenant are part of the same - ServiceMeshMemberRollobject as members:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - All projects that are part of the mesh must enforce mTLS in strict mode. This forces Istio to only accept connections with a client-certificate present and allows the Service Mesh sidecar to validate the origin using an - AuthorizationPolicyobject.
- Create the configuration with - AuthorizationPolicyobjects in the- knative-servingand- knative-eventingnamespaces:- Example - knative-default-authz-policies.yamlconfiguration file- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - These policies restrict the access rules for the network communication between Serverless system components. Specifically, they enforce the following rules: - 
								Deny all traffic that is not explicitly allowed in the knative-servingandknative-eventingnamespaces
- 
								Allow traffic from the istio-systemandknative-servingnamespaces to activator
- 
								Allow traffic from the knative-servingnamespace to autoscaler
- 
								Allow health probes for Apache Kafka components in the knative-eventingnamespace
- 
								Allow internal traffic for channel-based brokers in the knative-eventingnamespace
 
- 
								Deny all traffic that is not explicitly allowed in the 
- Apply the authorization policy configuration: - oc apply -f knative-default-authz-policies.yaml - $ oc apply -f knative-default-authz-policies.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Define which OpenShift projects can communicate with each other. For this communication, every OpenShift project of a tenant requires the following: - 
								One AuthorizationPolicyobject limiting directly incoming traffic to the tenant’s project
- 
								One AuthorizationPolicyobject limiting incoming traffic using the activator component of Serverless that runs in theknative-servingproject
- 
								One AuthorizationPolicyobject allowing Kubernetes to callPreStopHookson Knative Services
 - Instead of creating these policies manually, install the - helmutility and create the necessary resources for each tenant:- Installing the - helmutility- helm repo add openshift-helm-charts https://charts.openshift.io/ - $ helm repo add openshift-helm-charts https://charts.openshift.io/- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Creating example configuration for - team alpha- helm template openshift-helm-charts/redhat-knative-istio-authz --version 1.36.0 --set "name=team-alpha" --set "namespaces={team-alpha-1,team-alpha-2}" > team-alpha.yaml- $ helm template openshift-helm-charts/redhat-knative-istio-authz --version 1.36.0 --set "name=team-alpha" --set "namespaces={team-alpha-1,team-alpha-2}" > team-alpha.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Creating example configuration for - team bravo- helm template openshift-helm-charts/redhat-knative-istio-authz --version 1.31.0 --set "name=team-bravo" --set "namespaces={team-bravo-1,team-bravo-2}" > team-bravo.yaml- $ helm template openshift-helm-charts/redhat-knative-istio-authz --version 1.31.0 --set "name=team-bravo" --set "namespaces={team-bravo-1,team-bravo-2}" > team-bravo.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 
								One 
- Apply the authorization policy configuration: - oc apply -f team-alpha.yaml team-bravo.yaml - $ oc apply -f team-alpha.yaml team-bravo.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
2.4. Verifying the configuration
				You can use the curl command to verify the configuration for network traffic isolation.
			
					The following examples assume having two tenants, each having one namespace, and all part of the ServiceMeshMemberRoll object, configured with the resources in the team-alpha.yaml and team-bravo.yaml files.
				
Procedure
- Deploy Knative Services in the namespaces of both of the tenants: - Example command for - team-alpha- kn service create test-webapp -n team-alpha-1 \ --annotation-service serving.knative.openshift.io/enablePassthrough=true \ --annotation-revision sidecar.istio.io/inject=true \ --env RESPONSE="Hello Serverless" \ --image docker.io/openshift/hello-openshift- $ kn service create test-webapp -n team-alpha-1 \ --annotation-service serving.knative.openshift.io/enablePassthrough=true \ --annotation-revision sidecar.istio.io/inject=true \ --env RESPONSE="Hello Serverless" \ --image docker.io/openshift/hello-openshift- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example command for - team-bravo- kn service create test-webapp -n team-bravo-1 \ --annotation-service serving.knative.openshift.io/enablePassthrough=true \ --annotation-revision sidecar.istio.io/inject=true \ --env RESPONSE="Hello Serverless" \ --image docker.io/openshift/hello-openshift- $ kn service create test-webapp -n team-bravo-1 \ --annotation-service serving.knative.openshift.io/enablePassthrough=true \ --annotation-revision sidecar.istio.io/inject=true \ --env RESPONSE="Hello Serverless" \ --image docker.io/openshift/hello-openshift- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Alternatively, use the following YAML configuration: - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Deploy a - curlpod for testing the connections:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Verify the configuration by using the - curlcommand.- Test - team-alpha-1through cluster local domain, which is allowed:- team-alpha-1 - Example command - oc exec deployment/curl -n team-alpha-1 -it -- curl -v http://test-webapp.team-alpha-1:80 - $ oc exec deployment/curl -n team-alpha-1 -it -- curl -v http://test-webapp.team-alpha-1:80- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Test the - team-alpha-1to- team-alpha-1connection through an external domain, which is allowed:- Example command - EXTERNAL_URL=$(oc get ksvc -n team-alpha-1 test-webapp -o custom-columns=:.status.url --no-headers) && \ oc exec deployment/curl -n team-alpha-1 -it -- curl -ik $EXTERNAL_URL - $ EXTERNAL_URL=$(oc get ksvc -n team-alpha-1 test-webapp -o custom-columns=:.status.url --no-headers) && \ oc exec deployment/curl -n team-alpha-1 -it -- curl -ik $EXTERNAL_URL- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Test the - team-alpha-1to- team-bravo-1connection through the cluster’s local domain, which is not allowed:- Example command - oc exec deployment/curl -n team-alpha-1 -it -- curl -v http://test-webapp.team-bravo-1:80 - $ oc exec deployment/curl -n team-alpha-1 -it -- curl -v http://test-webapp.team-bravo-1:80- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Test the - team-alpha-1to- team-bravo-1connection through an external domain, which is allowed:- Example command - EXTERNAL_URL=$(oc get ksvc -n team-bravo-1 test-webapp -o custom-columns=:.status.url --no-headers) && \ oc exec deployment/curl -n team-alpha-1 -it -- curl -ik $EXTERNAL_URL - $ EXTERNAL_URL=$(oc get ksvc -n team-bravo-1 test-webapp -o custom-columns=:.status.url --no-headers) && \ oc exec deployment/curl -n team-alpha-1 -it -- curl -ik $EXTERNAL_URL- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Delete the resources that were created for verification: - oc delete deployment/curl -n team-alpha-1 && \ oc delete ksvc/test-webapp -n team-alpha-1 && \ oc delete ksvc/test-webapp -n team-bravo-1 - $ oc delete deployment/curl -n team-alpha-1 && \ oc delete ksvc/test-webapp -n team-alpha-1 && \ oc delete ksvc/test-webapp -n team-bravo-1- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow