Internal TCP ingress between Container Apps in the same environment times out

Alexander Morbitzer 0 Zuverlässigkeitspunkte
2026-07-09T13:18:01.1933333+00:00

Umgebung:

  • Subscription: [REDACTED_SUBSCRIPTION_ID]
    • Resource Group: AsiMinu2.0-dev
    • Region: germanywestcentral
    • Container Apps Environment: cae-asiminu-dev (VNet-integriert, Consumption-Workload-Profile, Domain happybeach-1c528f76.germanywestcentral.azurecontainerapps.io)
    • Betroffene App: ca-asiminu-postgres-dev (Ziel/Server)
    • Aufrufende Apps: ca-asiminu-api-dev sowie eine dedizierte Test-App ca-asiminu-nettest — beide in derselben Environment Konfiguration von ca-asiminu-postgres-dev:
    • Ingress: external: false, transport: tcp, targetPort: 5432, exposedPort: 5432
    • Container läuft nachweislich stabil und lauscht auf 0.0.0.0:5432 (per az containerapp exec + netstat verifiziert)
    • Revision-Health-State: „Healthy" Problem: Jede TCP-Verbindung von einer anderen Container-App in derselben Environment zu ca-asiminu-postgres-dev.internal.<domain>:5432 läuft nach ca. 6 Sekunden in einen Timeout (Connection timed out), unabhängig vom aufrufenden Client. Was wir bereits ausgeschlossen haben:
    • DNS-Auflösung korrekt (löst zu 100.100.0.205 auf, konsistent über mehrere Tests)
    • Kein NSG/keine Route-Table auf dem Subnet
    • Beide Apps in derselben Environment, demselben Workload-Profile (Consumption)
    • Kein Propagierungsverzögerungs-Effekt (mehrere Minuten gewartet)
    • Kein Caching-/Stale-State-Problem (mit komplett neu erzeugten Revisionen wiederholt getestet)
    • Kurzer App-Name vs. vollständige interne FQDN — identisches Ergebnis
    • Test von drei unterschiedlichen Aufrufern (API-App, dedizierte Test-App, sowie die Zielapp selbst) — überall identisches Timeout Entscheidender Isolationstest: Beim testweisen Umstellen der Ingress-Konfiguration von transport: tcp auf transport: http (gleicher targetPort: 5432, gleicher Container) funktioniert die Verbindung zum Backend — der Envoy-Proxy stellt die Verbindung zum Container erfolgreich her (HTTP/2 502, „upstream connect error" ist NICHT mehr vorhanden, stattdessen eine normale 502 durch das nicht-HTTP-Protokoll von Postgres). Nach Zurückstellen auf transport: tcp tritt der Timeout sofort wieder auf, reproduzierbar, auch mit einer frisch erzeugten Revision. Schlussfolgerung: Das Backend/der Container ist über den Envoy-Proxy erreichbar — das Problem liegt spezifisch im TCP-Transport-Modus des internen Ingress, nicht an der Anwendung, dem Netzwerk-Setup oder der Konfiguration. Frage an Microsoft: Ist dies ein bekannter Fehler bei TCP-Transport für internen Ingress in Consumption-Workload-Profile-Environments, oder gibt es eine zusätzliche, undokumentierte Konfigurationsanforderung für TCP-Ingress zwischen Container Apps?
Azure Container Apps
Azure Container Apps

Ein Azure-Dienst, der eine universelle, serverlose Containerplattform bereitstellt.


1 Antwort

Sortieren nach: Am hilfreichsten
  1. Rakesh Mishra 11,350 Zuverlässigkeitspunkte Externe Microsoft-Mitarbeiter Moderator
    2026-07-09T14:45:07.53+00:00

    Hallo Alexander,

    Vielen Dank, dass Sie sich gemeldet und Ihnen eine so detaillierte Aufschlüsselung der bereits durchgeführten Fehlerbehebung gegeben haben.

    Der ~6-Sekunden-Verbindungsabbruch, den du über den internen TCP-Ingress erlebst, ist ein bekanntes Symptom dafür, wie der zugrundeliegende Envoy-Proxy mit Upstream-Endpunkten umgeht, die ihre Gesundheitsproben ausfallen. In Azure Container Apps wird der Proxy den Container vorübergehend aus dem Routing-Pool entfernen, wenn keine explizite TCP-Gesundheitsprobe definiert ist oder der Container zu lange braucht, um als "bereit" zu melden. Dies führt dazu, dass der Proxy die aktive TCP-Verbindung zum Upstream-Postgres-Container beendet.

    Dies ist keine Einschränkung des Verbrauchsprofils (TCP wird in Consumption für Service-zu-Service-Kommunikation vollständig unterstützt), sondern vielmehr eine Konfigurationsanforderung für langlebige TCP-Verbindungen.

    Um das zu lösen, musst du explizite TCP-Gesundheitsprobes für deinen Postgres-Container konfigurieren.

    Schritte zur Lösung:

    1. Aktualisieren Sie Ihre Container-App YAML: Sie müssen explizite Readiness and Liveness-Sonden definieren, die für TCP auf Ihrem Postgres-Port konfiguriert sind (Standard 5432). Stellen Sie sicher, dass Ihr Eintritt transport so eingestellt ist tcp und der mit exposedPort dem übereinstimmt. targetPort Hier ist ein Beispiel für die Konfiguration, die Sie anwenden müssen:
         properties:
           configuration:
             ingress:
               external: false
               targetPort: 5432
               exposedPort: 5432
               transport: tcp
           template:
             containers:
               - name: postgres
                 image: postgres:14
                 probes:
                   - type: Liveness
                     tcpSocket:
                       port: 5432
                     initialDelaySeconds: 15
                     periodSeconds: 10
                   - type: Readiness
                     tcpSocket:
                       port: 5432
                     initialDelaySeconds: 5
                     periodSeconds: 10
      
    2. Wenden Sie die Konfiguration an: Aktualisieren Sie Ihre App mit der Azure-CLI:
         az containerapp update --name <your-postgres-app-name> --resource-group <your-resource-group> --yaml <path-to-your-yaml>
      

    Quellen: Wie in der Azure Container Apps Ingress-Dokumentation erwähnt:

    "Container Apps unterstützt TCP-Ingress. Um den TCP-Ingress zu aktivieren, müssen Sie die Eigenschaft Ingress Transport auf konfigurieren tcp. [...] Wenn du TCP als Ingress-Protokoll verwendest, wird die Eigenschaft exposedPort benötigt. Diese Eigenschaft spezifiziert den Port, auf dem die Container-App für eingehende TCP-Anfragen hört."

    Außerdem heißt es in der Health Probes-Dokumentation bezüglich der Gesundheitsuntersuchungen :

    "Wenn ein Container nicht auf die Readiness Probe reagiert, entfernt die Container-App den Container aus dem Load Balancer Pool. Diese Maßnahme führt dazu, dass der Proxy die Verbindung abbricht."

    Wenn Sie nach Verbindungsaufbau weiterhin Ausfälle sehen und längere Zeit (z. B. 4 Minuten) im Leerlauf bleiben, müssen Sie möglicherweise auch TCP Keepalives auf Ihrem Postgres-Client konfigurieren, da der Azure-Plattform-Load Balancer einen standardmäßigen 4-minütigen Leerlauf-Timeout hat.

    Sag mir Bescheid, ob die Konfiguration der TCP-Gesundheitsproben den Verbindungsabbruch für dich löst.

    War diese Antwort hilfreich?

    Eine Person fand diese Antwort hilfreich.
    0 Kommentare Keine Kommentare

Ihre Antwort

Antworten können von Fragestellenden als „Angenommen“ und von Moderierenden als „Empfohlen“ gekennzeichnet werden, wodurch Benutzende wissen, dass diese Antwort das Problem des Fragestellenden gelöst hat.