Wireshark trace - анализ тайм-аута между прокси и службой
У меня есть следующие настройки (как видно на прикрепленном изображении):
A (java-процесс) -> B (прокси-сервер kubernetes ambassador) -> C (java-сервис в модуле kubernetes)
Связь осуществляется с использованием HTTPS между A и B, а затем посол удаляет HTTPS и продолжает разговаривать по HTTP с C.
Проблема, с которой я сталкиваюсь, заключается в том, что иногда бывает, что отправляемое сообщение HTTP BODY не передается на 100% между A и B, а только на трассе стороны B, я вижу, что оно остановилось по какой-то причине (в трассировке на A стороне показано, как все отправлено ОК). Затем java-процесс в C (который ждет, пока B-прокси пересылает все данные) просто ждет и истекает через 30 секунд.
Вы можете видеть на прикрепленном изображении, в следе A написано, что отправлено все ТЕЛО, но на следе на стороне B видна (доставлена) только половина ТЕЛА. Я подозреваю на этихTCP Previous segment not captured
.
Вы также можете видеть, что после этого он просто ждет 30 секунд и истекает время ожидания.
У меня такое случается довольно часто. Кто-нибудь знает, в чем может быть проблема?
Конфигурация посла:
getambassador.io/config: |
---
apiVersion: ambassador/v1
kind: TLSContext
name: tls
ambassador_id: some-stg
secret: ambassador-tls-cert
---
apiVersion: ambassador/v1
kind: Module
name: ambassador
ambassador_id: some-stg
config:
service_port: 8443
diagnostics:
enabled: true
envoy_log_type: json
---
apiVersion: ambassador/v1
kind: Module
name: tls
ambassador_id: some-stg
config:
server:
enabled: True
redirect_cleartext_from: 8080
alpn_protocols: "h2, http/1.1"
secret: ambassador-tls-cert
---
apiVersion: ambassador/v1
kind: TracingService
name: tracing
service: tracing-jaeger-collector.tracing:9411
driver: zipkin
ambassador_id: some-stg
tag_headers:
- :authority
- :path
ОБНОВИТЬ
Вот также следы на cloudhark: Дамп (отправляющая сторона - вне кубернетов): https://www.cloudshark.org/captures/8cfad383c8fb Дамп B (приемник прокси-сервера kubernetes ambassador): https://www.cloudshark.org/captures/50512920d898
2 ответа
Похоже, мой коллега нашел в чем дело. Перед этим модулем посланника стоит балансировщик нагрузки AWS, и когда он его воссоздал, похоже, теперь он работает без проблем. Я предполагаю, что кто-то отправил ACK клиенту (A), но не передал все сообщения модулю посла (B). Он воссоздал балансировщик нагрузки с другим типом (NLB), так как классический не работает.
Previous segment not captured
означает именно то, что сегмент в потоке tcp не был захвачен, это определяется порядковыми номерами tcp. Обычно в начале захвата, если начальное соединение произошло до захвата, также может произойти, если захватывающий хост сбросил пакет или если произошла фактическая потеря пакета.
Кроме того, потеря пакета всегда сигнализируется путем установки номера ACK на последний байт полезной нагрузки, который был принят без перерыва. Таким образом, если что-то потеряно, номер ACK остается в последнем успешном байте, независимо от того, сколько еще пакетов пройдет. ACK увеличивается только при повторной передаче.
Игнорируемая неизвестная запись возникает из-за того, что диссектор TLS не понимает данные. В вашем случае это может быть связано с потерей сегмента TCP.
Обратите внимание на TCP segment of a reassembled PDU
заявление.
Wireshark считает, что знает, какой протокол работает поверх TCP в этом сегменте TCP; этот сегмент TCP не содержит всего "блока данных протокола" (PDU) для этого протокола более высокого уровня, то есть пакета или протокольного сообщения для этого протокола более высокого уровня, и не содержит последней части этого PDU, поэтому он пытается повторно собрать несколько сегментов TCP, содержащих этот PDU более высокого уровня. Например, ответ HTTP с большим количеством данных не помещается в один сегмент TCP в большинстве сетей, поэтому он будет разделен на несколько сегментов TCP; все сегменты TCP, кроме последнего, будут помечены какTCP segment of a reassembled PDU
.
Также обратите внимание на отладочную службу:
прокси kube работает
проверьте iptables
Что нужно для того, чтобы модуль мог управлять другим развертыванием в кубернетах?
Затем убедитесь, что вы выполнили следующие действия tls-ambassador, особенно создав сертификат и сохраните его.
Полезная документация: TCP Analysis.