← Übersicht  ·  Skripte & Dateien  ·  OpenShift · Netzwerk · Service Mesh

Netzwerkpfad: OVN, Router und Service Mesh

Du baust zwei kleine Test-Workloads, verfolgst den internen Weg vom Service bis zur Pod-IP und liest anschließend die von OpenShift generierte HAProxy-Konfiguration der Route. Zum Schluss erkennst du, ob Service Mesh 3 oder die frühere Maistra-Generation installiert ist und entscheidest, ob die zusätzliche Proxy-Schicht wirklich nötig ist.

Stand: 5. September 2026OCP / OKD 4.xService Mesh 3.2Atlas F1, F3, F4ca. 45 Minuten

1 Drei Datenpfade auseinanderhalten

OVN, Router und Service Mesh lösen unterschiedliche Aufgaben. Sie liegen bei einem Request hintereinander, sind aber keine austauschbaren Produkte.

Pod zu PodDer Client verwendet Service-DNS. OVN ersetzt die virtuelle Service-IP durch eine bereite Pod-IP. Nur zwischen verschiedenen Nodes wird das Paket im Geneve-Overlay transportiert.
Außen nach innenDer OpenShift-Router nimmt eine Route an. HAProxy wählt anhand Host und Pfad ein Backend. Danach erreicht der Request über Service und EndpointSlice den Pod.
Mit MeshEin Envoy-Proxy im Pod fängt Anwendungsverkehr ab. Istio verteilt Identitäten, mTLS-Regeln und Traffic-Richtlinien. OVN transportiert die Pakete darunter weiterhin.

Begriffe: Ein Overlay ist ein virtuelles Netz über dem physischen Node-Netz. DNAT ersetzt die Zieladresse eines Pakets. Eine EndpointSlice enthält die aktuell bereiten Pod-Adressen eines Service. Ein Sidecar ist ein zusätzlicher Container im selben Pod.

2 Netzwerktyp und Komponenten prüfen

Diese Befehle lesen nur. Für System-Namespaces und spätere OVN-Vertiefung brauchst du cluster-admin.

Laptop · PowerShell oder Bash · nur lesen
oc whoami
oc get network.operator.openshift.io cluster -o jsonpath='{.spec.defaultNetwork.type}{"\n"}'
oc get network.config.openshift.io cluster -o yaml
oc get co network ingress
oc get pods -n openshift-ovn-kubernetes -o wide
oc get pods -n openshift-ingress -o wide

Erwartung: Der Netzwerktyp ist OVNKubernetes. Die ClusterOperatoren network und ingress melden Available=True und Degraded=False.

3 Zwei isolierte Test-Workloads anlegen

Die beiden Deployments dienen nur als Quell- und Ziel-Pod. Das Ziel erhält zusätzlich einen Service und eine Route.

Laptop · PowerShell oder Bash · Lab-Projekt
oc new-project network-path-lab
oc create deployment source --image=quay.io/openshifttest/nginx
oc create deployment destination --image=quay.io/openshifttest/nginx
oc expose deployment destination --port=80
oc expose service destination
oc wait --for=condition=Available deployment/source deployment/destination --timeout=120s
oc get pod,service,route -o wide

Die Deployments und ihre Pods werden von dir angefordert. ReplicaSets und Pods werden von Kubernetes generiert. Die ClusterIP des Service und der Hostname der Route werden vom Cluster vergeben.

4 Service bis zur Pod-IP verfolgen

Eine ClusterIP ist kein Prozess und keine Netzwerkkarte. Sie ist eine virtuelle Adresse, für die OVN Regeln mit den EndpointSlice-Adressen programmiert.

Laptop · PowerShell oder Bash · nur lesen
oc get service destination -o yaml
oc get endpointslice -l kubernetes.io/service-name=destination -o yaml
oc get pods -l app=destination -o wide
oc describe service destination
Laptop · Verbindung aus temporärem Pod
oc run probe --rm -i --restart=Never --image=registry.access.redhat.com/ubi9/ubi-minimal:latest --command -- curl -sS http://destination:80/
Objektentscheidender WertWirkung
Servicespec.clusterIP und Port 80stabile virtuelle Adresse und Name
EndpointSliceendpoints[].addresses und conditions.readyaktuelle erreichbare Ziele
Podstatus.podIP und Nodereales Ziel des umgeschriebenen Pakets

Wenn der Curl-Aufruf funktioniert, wurden DNS-Auflösung, Service-Auswahl, OVN-Regeln und Zielprozess gemeinsam bestätigt. Eine leere EndpointSlice bedeutet meist, dass Selector oder Readiness nicht passen.

5 Geneve und OVN am Node sehen

Geneve kapselt Podverkehr nur dann, wenn Quell- und Ziel-Pod auf verschiedenen Nodes liegen. Auf einer SNO bleibt der Verkehr lokal und zeigt keinen echten Tunnel-Hop.

Laptop · PowerShell · nur lesen
$node = oc get pod -l app=destination -o jsonpath='{.items[0].spec.nodeName}'
$ovnPod = oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node --field-selector spec.nodeName=$node -o jsonpath='{.items[0].metadata.name}'
"Node: $node"
"OVN-Pod: $ovnPod"
oc debug --as-root node/$node -- chroot /host ip -d link show genev_sys_6081
oc logs -n openshift-ovn-kubernetes pod/$ovnPod -c ovnkube-node --since=5m
Bash-Variante anzeigen
Laptop · Bash · nur lesen
node=$(oc get pod -l app=destination -o jsonpath='{.items[0].spec.nodeName}')
ovn_pod=$(oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node --field-selector "spec.nodeName=$node" -o jsonpath='{.items[0].metadata.name}')
printf 'Node: %s\nOVN-Pod: %s\n' "$node" "$ovn_pod"
oc debug --as-root "node/$node" -- chroot /host ip -d link show genev_sys_6081
oc logs -n openshift-ovn-kubernetes "pod/$ovn_pod" -c ovnkube-node --since=5m

Versionsgrenze: Container- und Interface-Namen können sich ändern. Wenn ovnkube-node oder genev_sys_6081 fehlt, zuerst die tatsächlichen Container mit oc get pod -n openshift-ovn-kubernetes $ovnPod -o jsonpath='{.spec.containers[*].name}' und die Interfaces mit oc debug --as-root node/$node -- chroot /host ip -d link lesen.

6 Optional: den OVN-Pfad simulieren

ovnkube-trace simuliert einen TCP- oder UDP-Pfad durch logische OVN- und OpenFlow-Regeln. Diese Vertiefung läuft in Linux oder WSL mit funktionierendem oc-Zugang.

WSL oder Linux · erzeugt lokales Werkzeug
pod=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-control-plane -o name | head -1 | cut -d/ -f2)
oc cp -n openshift-ovn-kubernetes "$pod:/usr/bin/ovnkube-trace" -c ovnkube-cluster-manager ./ovnkube-trace
chmod +x ./ovnkube-trace

./ovnkube-trace \
  -src source -src-namespace network-path-lab \
  -dst destination -dst-namespace network-path-lab \
  -service destination -tcp -dst-port 80 -loglevel 2

ovnkube-trace wird aus dem laufenden Control-Plane-Pod kopiert. Es ist ein temporäres Diagnosewerkzeug und gehört nicht ins Repository. Entferne es danach mit rm -- ./ovnkube-trace.

Leseschlüssel: Ein erfolgreicher Trace bestätigt nur die berechneten OVN-Regeln. Ein echter Curl-Aufruf bestätigt zusätzlich DNS, Prozesse, Ports und den realen Datenpfad. Beide Tests beantworten unterschiedliche Fragen.

7 Route bis zur generierten HAProxy-Konfiguration verfolgen

Der Ingress Operator verwaltet einen IngressController. Dieser erzeugt das Router-Deployment. Der Router beobachtet Routes und Endpoints und rendert daraus seine HAProxy-Konfiguration.

Laptop · PowerShell · nur lesen
$hostName = oc get route destination -o jsonpath='{.spec.host}'
$hostName
curl.exe -i "http://$hostName"

oc get ingresscontroller default -n openshift-ingress-operator -o yaml
oc get deployment router-default -n openshift-ingress -o yaml
oc exec -n openshift-ingress deployment/router-default -- cat /var/lib/haproxy/conf/haproxy.config | Select-String -Pattern 'network-path-lab'
Bash-Variante anzeigen
Laptop · Bash · nur lesen
host_name=$(oc get route destination -o jsonpath='{.spec.host}')
printf '%s\n' "$host_name"
curl -i "http://$host_name"

oc get ingresscontroller default -n openshift-ingress-operator -o yaml
oc get deployment router-default -n openshift-ingress -o yaml
oc exec -n openshift-ingress deployment/router-default -- cat /var/lib/haproxy/conf/haproxy.config | grep -n 'network-path-lab'

/var/lib/haproxy/conf/haproxy.config wird vom Router generiert. Du liest sie zur Diagnose, bearbeitest sie aber nie. Eine direkte Änderung würde beim nächsten Reconcile überschrieben.

TLS am eigenen Lab einschalten

Laptop · PowerShell · ändert nur die Lab-Route
oc patch route destination --type=merge -p '{"spec":{"tls":{"termination":"edge","insecureEdgeTerminationPolicy":"Redirect"}}}'
oc get route destination -o yaml
$hostName = oc get route destination -o jsonpath='{.spec.host}'
curl.exe -Ik "https://$hostName"
Bash-Variante anzeigen
Laptop · Bash · ändert nur die Lab-Route
oc patch route destination --type=merge -p '{"spec":{"tls":{"termination":"edge","insecureEdgeTerminationPolicy":"Redirect"}}}'
oc get route destination -o yaml
host_name=$(oc get route destination -o jsonpath='{.spec.host}')
curl -Ik "https://$host_name"

Bei edge endet TLS am Router. Zwischen Router und Pod läuft hier HTTP. reencrypt baut eine zweite TLS-Verbindung zum Backend auf. passthrough lässt die verschlüsselte Verbindung bis zum Pod durch und kann deshalb nur anhand des TLS-Servernamens auswählen.

8 Ingress-Sharding verstehen, ohne es anzulegen

Sharding bedeutet, dass mehrere IngressController jeweils nur ausgewählte Namespaces oder Routes übernehmen. So lassen sich intern, extern oder nach Mandant getrennte Router betreiben.

Laptop · PowerShell oder Bash · nur lesen
oc get ingresscontroller -n openshift-ingress-operator
oc explain ingresscontroller.spec.domain
oc explain ingresscontroller.spec.namespaceSelector
oc explain ingresscontroller.spec.routeSelector
oc get route destination --show-labels
Feldentscheidettypisches Beispiel
spec.domainDNS-Zone des Shardsinterne und öffentliche Apps trennen
spec.namespaceSelectorwelche Namespaces der Router beobachteteigener Router für Produktionsprojekte
spec.routeSelectorwelche gelabelten Routes übernommen werdensensible Route auf einen privaten Router legen

Nicht nur Router anlegen: Ein zusätzlicher IngressController braucht eine erreichbare Veröffentlichungsstrategie und passende DNS-Einträge. Auf Hetzner-UPI entsteht das nicht automatisch durch das OpenShift-Objekt.

9 Service-Mesh-Generation erkennen

OpenShift Service Mesh 3 nutzt den OpenShift Service Mesh Operator und Sail-APIs. Die frühere Generation nutzte Maistra-Ressourcen wie ServiceMeshControlPlane.

Laptop · PowerShell · nur lesen
oc get csv -A | Select-String -Pattern 'servicemesh|sail|istio|maistra'
oc api-resources | Select-String -Pattern 'Istio|ServiceMeshControlPlane|ServiceMeshMemberRoll'
oc get istio.sailoperator.io -A
oc get istiorevision.sailoperator.io -A
oc get servicemeshcontrolplane.maistra.io -A
oc get pod -n network-path-lab -o jsonpath='{range .items[*]}{.metadata.name}{": "}{.spec.containers[*].name}{"\n"}{end}'
Bash-Variante anzeigen
Laptop · Bash · nur lesen
oc get csv -A | grep -Ei 'servicemesh|sail|istio|maistra'
oc api-resources | grep -E 'Istio|ServiceMeshControlPlane|ServiceMeshMemberRoll'
oc get istio.sailoperator.io -A
oc get istiorevision.sailoperator.io -A
oc get servicemeshcontrolplane.maistra.io -A
oc get pod -n network-path-lab -o jsonpath='{range .items[*]}{.metadata.name}{": "}{.spec.containers[*].name}{"\n"}{end}'
FundBedeutung
Istio und IstioRevision aus sailoperator.ioService Mesh 3. Der Operator erzeugt aus der Istio-CR die Steuerungsebene.
ServiceMeshControlPlane aus maistra.iofrühere Service-Mesh-Generation. Keine Mesh-3-Manifeste blind darüber anwenden.
Container istio-proxy im PodSidecar-Datenpfad ist für diesen Pod aktiv.
keine dieser Ressourcenkein Service Mesh installiert. OVN und Router funktionieren trotzdem vollständig.

Nicht nebenbei installieren: Service Mesh 3 benötigt Operator, Istio-CR, IstioCNI und eine bewusst begrenzte Discovery-Konfiguration. Mesh 2 und Mesh 3 dürfen nicht unkontrolliert im selben Cluster betrieben werden.

10 Entscheiden, ob ein Mesh nötig ist

Anforderungkleinste passende Lösung
Nur interner Service-Aufruf und LastverteilungService und OVN. Kein Mesh.
Öffentliche HTTP- oder TLS-AdresseOpenShift Route und Router. Kein Mesh erforderlich.
Interne TLS-Zertifikate für wenige DiensteService-CA aus der Reconcile- und Service-CA-Anleitung.
Netzwerkzugriff zwischen Namespaces begrenzenNetworkPolicy aus der NetworkPolicy-Anleitung.
Identitätsbasiertes mTLS, Traffic-Splitting und gemeinsame Telemetrie für viele DiensteService Mesh prüfen.

Auf einer kleinen SNO kostet ein Sidecar pro Pod zusätzlichen RAM und CPU. Für die Bibliothek ist Service-CA plus NetworkPolicy meist die kleinere und verständlichere Lösung. Ein Mesh lohnt sich erst, wenn seine zentralen Regeln mehrere Anwendungen konsistent entlasten.

11 Fehler an der richtigen Schicht eingrenzen

  1. DNS: Löst destination.network-path-lab.svc auf?
  2. Service: Stimmen Selector, Port und targetPort?
  3. EndpointSlice: Gibt es eine bereite Pod-IP?
  4. NetworkPolicy: Ist Quell- oder Zielverkehr erlaubt?
  5. OVN: Sind Netzwerk-Operator und Node-Pod gesund? Was zeigt ovnkube-trace?
  6. Route: Hat der Router die Route in die generierte HAProxy-Konfiguration übernommen?
  7. Mesh: Ist ein Sidecar injiziert und akzeptieren mTLS- sowie AuthorizationPolicy-Regeln den Request?

Die Grundlagen für Service, Route und Readiness stehen in der Service-, Route- und Probes-Anleitung. Policy-Fehler werden in der NetworkPolicy-Anleitung praktisch isoliert.

12 Lab vollständig aufräumen

Laptop · löscht nur das Lab-Projekt
oc delete project network-path-lab

Falls du ovnkube-trace kopiert hast, entferne zusätzlich die lokale Binärdatei. Das Service Mesh und die OpenShift-Systemkomponenten wurden durch dieses Lab nicht verändert.