Exposing SAP Edge Integration Cell via OpenShift Routes
Table of Contents
- Overview
- Support Scope
- Architectural Differences: Routes vs. LoadBalancer / NodePort Services
- Traffic Flow with External Load Balancer
- Operational Restrictions (Route-Based Deployments Only)
- Optional: Manual Workaround for Route-Based Deployment
- Namespace Selection
- DNS Configuration
- Note: Auto-Generated Route from EIC Installation
- Option A: Single Virtual Host (Default Only)
- Option B: Multiple Virtual Hosts (Default + API)
Overview
This guide describes how to expose the SAP Edge Integration Cell (EIC) Istio Ingress Gateway using OpenShift Routes. This approach uses the native OpenShift routing layer (HAProxy) for Layer 7 ingress, and can work both with and without an external load balancer in front of the cluster.
Support Scope
[IMPORTANT] Support Scope for OpenShift Routes
While SAP Edge Integration Cell (EIC) can be exposed via OpenShift Routes to accommodate strict on-premise security policies, this configuration differs from the SAP-provided delivery model (which typically relies on LoadBalancer or NodePort services).
- Red Hat Support: Red Hat validates and supports the OpenShift Route configuration and the underlying ingress infrastructure.
- SAP Support: SAP support covers the EIC application logic.
- Customer Responsibility: Any functional limitations, connectivity issues, or feature unavailability resulting specifically from the use of Routes (e.g., inability to support raw TCP without SNI, or loss of source IP preservation) are the responsibility of the customer.
Architectural Differences: Routes vs. LoadBalancer / NodePort Services
When deploying SAP EIC on OpenShift, customers must understand the architectural differences between the Kubernetes service-based approach and the OpenShift Route approach:
| Feature | NodePort / LoadBalancer | OpenShift Route (HAProxy) |
|---|---|---|
| OSI Layer | Layer 4 (Transport) | Layer 7 (Application) & TLS |
| Protocols | TCP, UDP | HTTP, HTTPS, TLS (SNI-based TCP) |
| Client IP | Preserved (usually) | Not Preserved (Router IP sees traffic)* |
| Port Usage | Service-defined (443 via LB, 30000-32767 via NodePort) | Standard ports (80/443) |
*Note: The OpenShift Router (HAProxy) acts as a TCP proxy — it creates a new TCP connection to the backend in all termination modes, replacing the original client IP with the router's own IP. In contrast, LoadBalancer services with externalTrafficPolicy: Local preserve the client source IP. Source IP preservation is not available when using Routes.
Traffic Flow with External Load Balancer
In many enterprise on-premise deployments, an external load balancer (e.g., F5, HAProxy, NetScaler) sits in front of the OpenShift cluster. OpenShift Routes support both passthrough and re-encrypt TLS termination — the choice depends on your security requirements and infrastructure setup.
TLS Passthrough
The external load balancer forwards encrypted traffic without terminating TLS. The OpenShift Router uses the SNI header to select the correct Passthrough Route, and the Istio Gateway terminates TLS.
Client → DNS → External LB (L4 Passthrough) → OpenShift Router (Passthrough Route) → Istio Gateway (TLS Termination)
- DNS: The EIC Virtual Host hostname (e.g.,
eic.apps.<cluster-domain>) must resolve to the external load balancer's VIP address. - External Load Balancer: Must be configured for Layer 4 TCP Passthrough on port 443 — it must not terminate SSL/TLS.
- OpenShift Router: Must have a Passthrough Route whose
spec.hostexactly matches the hostname used by clients. The Router uses the SNI header to select the correct Route — if no Route matches, traffic is silently dropped. - Istio Gateway (EIC): Receives the encrypted traffic and terminates TLS using the certificates configured in the ELM Keystore.
TLS Re-encryption
The OpenShift Router terminates the client TLS session and opens a new TLS connection to the Istio Ingress Gateway. This allows the Router to inspect headers or enforce policies at the edge while keeping traffic encrypted to the backend.
Client → DNS → External LB → OpenShift Router (Re-encrypt Route) → Istio Gateway (TLS Termination)
- Route Configuration: Use
termination: reencryptinstead ofpassthrough. The Router needs the backend CA certificate (destinationCACertificate) to trust the Istio Gateway's TLS certificate. - Istio Gateway: Must be configured with
tls.mode: SIMPLEand a matchinghostsentry. - Trade-off: mTLS between the client and Istio is not possible with this pattern, since the Router terminates the client TLS session.
Note: If traffic bypasses the OpenShift Router entirely (e.g., an external load balancer performing SSL bridging directly to the Istio Ingress Gateway), OpenShift Routes are not involved. In that case, the load balancer must send the correct Virtual Host hostname via SNI in the new TLS connection.
Edge Termination (Not Supported)
Edge termination (termination: edge) is not compatible with SAP EIC. In this mode, the OpenShift Router terminates TLS and forwards unencrypted HTTP to the backend. The Istio Gateway expects to receive TLS traffic and perform its own TLS termination — sending plaintext HTTP breaks this expectation and causes connection failures.
Common Pitfalls
Hostname Mismatch: The Route's
spec.hostmust exactly match the hostname clients use to connect (the Virtual Host configured in EIC). A mismatch causes the Router to drop traffic with no visible error, since SNI-based routing fails silently.Wrong Route Termination Mode: The Route must use
termination: passthroughortermination: reencrypt. Usingtermination: edgeor no termination causes the Router to either terminate TLS without re-encrypting to the backend or treat the traffic as unencrypted HTTP — both break the EIC traffic flow.
Operational Restrictions (Route-Based Deployments Only)
The following restrictions apply specifically when using OpenShift Routes to expose the Istio Ingress Gateway. They do not apply to deployments using LoadBalancer services or external load balancers routing directly to Istio:
-
Raw TCP Traffic: OpenShift Routes rely on Server Name Indication (SNI) to route traffic on port 443. Any SAP EIC component or API artifact that uses "Raw TCP" (without TLS/SNI) cannot be exposed via a standard Route on port 443.
-
UDP Traffic: OpenShift Routes do not support UDP traffic. Any feature requiring UDP is unavailable in this topology.
-
Mutual TLS (mTLS): mTLS between the client and the application is supported with the Passthrough Route used in this guide, since the OpenShift Router forwards the TLS connection directly to Istio without terminating it. However, mTLS is not compatible with edge or re-encrypt Routes, where the router terminates the client TLS session.
Optional: Manual Workaround for Route-Based Deployment
In some older EIC releases, the Istio deployment may wait for an external IP assignment when using OpenShift Routes, causing the installation to stall. The latest SAP ELM EIC releases no longer block on this requirement — if possible, upgrade to the latest release to avoid this issue entirely.
If you are on an older release and encounter this stall, you can try the following workaround:
-
Retry the ELM solution operation if it has failed or timed out.
-
While the Istio solution is waiting for deployment to complete, manually patch the
istio-ingressgatewayservice to assign the external hostname of your OpenShift Route:oc patch svc istio-ingressgateway -n <gateway-namespace> --type='merge' -p ' status: loadBalancer: ingress: - hostname: "eic.apps.<cluster-domain>" 'Replace
<gateway-namespace>with the namespace where your Istio ingress gateway is deployed (see note below), andeic.apps.<cluster-domain>with your actual Route hostname. -
This change allows the Istio deployment to continue by satisfying the external IP/hostname requirement.
Important: This manual patch may be reverted automatically by infrastructure controllers running in the cluster (e.g., Cloud Controller Manager on vSphere/Nutanix/OpenStack, CNI plugins with built-in LoadBalancer capabilities such as Cilium or kube-vip, or ADC operators such as F5 BIG-IP CIS). These controllers watch
type: LoadBalancerservices and will strip any manually injected status they did not provision. If the patch is being reverted, identify which controller is managing LoadBalancer services in your cluster and either configure it accordingly or upgrade to the latest EIC release.
Namespace Selection
The Route(s) must be created in the same namespace as the istio-ingressgateway service. The namespace depends on your deployment model:
| Deployment Model | Gateway Namespace |
|---|---|
| Full Cluster-Admin Access | istio-system |
| Restricted Access (Service Mesh 3.x) | istio-gateways |
Adjust the metadata.namespace in the YAML examples below accordingly.
DNS Configuration
All Virtual Host hostnames must resolve to the OpenShift Router IP (or the external load balancer VIP, if one is in front of the cluster). When using multiple Virtual Hosts, all hostnames point to the same IP — the OpenShift Router handles the host differentiation via SNI.
Note: Auto-Generated Route from EIC Installation
During EIC installation, a Route named istio-ingressgateway is automatically created in the gateway namespace. This auto-generated Route is not suitable for SAP EIC traffic and should not be used for the Virtual Host configuration. It differs from the required configuration in several ways:
- No TLS passthrough — the Route has no
tlssection, so traffic is treated as unencrypted HTTP. - Wrong target port — it targets
http2instead ofhttps(port 443 → 8443). - Auto-generated hostname — the hostname (e.g.,
istio-ingressgateway-istio-gateways.apps.<cluster-domain>) does not match the EIC Virtual Host hostname.
You must create your own Passthrough Route(s) as described below, using the correct Virtual Host hostname and TLS passthrough termination. The auto-generated Route can be left in place — it does not interfere with the manually created Routes.
Option A: Single Virtual Host (Default Only)
Use this configuration when SAP EIC is deployed with a single "Default Virtual Host" only.
Step 1: Define the Route
Create a YAML file to define the Route. Below is an example configuration for exposing the Istio Ingress Gateway using passthrough TLS termination.
When you deploy SAP EIC, use a domain like eic.apps.
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: eic-https-route
namespace: istio-system # Use 'istio-gateways' for restricted-access deployments
labels:
app: istio-ingressgateway
spec:
host: eic.apps.<cluster-domain>
to:
kind: Service
name: istio-ingressgateway
weight: 100
port:
targetPort: https
tls:
termination: passthrough
insecureEdgeTerminationPolicy: None
wildcardPolicy: None
Replace namespace if using the restricted-access model.
Step 2: Apply the Route
oc apply -f eic-route.yaml
Step 3: Verify the Route
oc get route -n istio-system # Use 'istio-gateways' for restricted-access deployments
You should see output similar to the following:
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
eic-https-route eic.apps.<cluster-domain> istio-ingressgateway https passthrough None
Step 4: Test External Access
curl -k --request GET --url https://eic.apps.<cluster-domain>/http/example
Option B: Multiple Virtual Hosts (Default + API)
Use this configuration when SAP EIC is deployed with both a "Default Virtual Host" and an "API Virtual Host" (e.g., for separating runtime and API management traffic).
OpenShift Routes support multiple hostnames on a single Ingress Controller IP using SNI-based routing. Each hostname requires its own Passthrough Route, but both Routes point to the same istio-ingressgateway service. The OpenShift Router reads the SNI header and directs traffic to the correct Route automatically — no additional load balancer configuration is needed.
Step 1: Define Both Routes
Create a YAML file with both Route definitions:
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: eic-default-route
namespace: istio-system # Use 'istio-gateways' for restricted-access deployments
labels:
app: istio-ingressgateway
spec:
host: eic.apps.<cluster-domain>
to:
kind: Service
name: istio-ingressgateway
weight: 100
port:
targetPort: https
tls:
termination: passthrough
insecureEdgeTerminationPolicy: None
wildcardPolicy: None
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: eic-api-route
namespace: istio-system # Use 'istio-gateways' for restricted-access deployments
labels:
app: istio-ingressgateway
spec:
host: eic-api.apps.<cluster-domain>
to:
kind: Service
name: istio-ingressgateway
weight: 100
port:
targetPort: https
tls:
termination: passthrough
insecureEdgeTerminationPolicy: None
wildcardPolicy: None
Replace eic.apps.<cluster-domain> as the "Default Virtual Host" and eic-api.apps.<cluster-domain> as the "API Virtual Host" when deploying SAP EIC.
Step 2: Apply Both Routes
oc apply -f eic-routes.yaml
Step 3: Verify Both Routes
oc get route -n istio-system # Use 'istio-gateways' for restricted-access deployments
You should see both Routes listed:
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
eic-default-route eic.apps.<cluster-domain> istio-ingressgateway https passthrough None
eic-api-route eic-api.apps.<cluster-domain> istio-ingressgateway https passthrough None
Step 4: Test External Access
Test both Virtual Hosts:
curl -k --request GET --url https://eic.apps.<cluster-domain>/http/example
curl -k --request GET --url https://eic-api.apps.<cluster-domain>/http/example
Comments