Ein Azure-Dienst, der eine universelle, serverlose Containerplattform bereitstellt.
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:
- 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
transportso eingestellt isttcpund der mitexposedPortdem übereinstimmt.targetPortHier 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 - 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 EigenschaftexposedPortbenö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.