Kubernetes отбрасывает длинное HTTP-соединение GET, инициализированное в node.js - PullRequest
0 голосов
/ 14 мая 2018

У меня есть очень простой кусок кода, написанный в node.js (см. Пример ниже), который работает в Kubernetes на GCP и AWS. Приложение просто выполняет запрос GET для импорта данных из внешнего приложения. Иногда этот запрос GET может занимать ~ 30 минут или больше.

var http = require("http");
var request = require('request');

var options = {
    url: "my-external-service",
    gzip: true,
    // (1) forever: true,
    // (2) agent: new http.Agent({ keepAlive: true })
};

request.get(options, (error, response, body) => {
    console.log('error:', error);
    console.log('statusCode:', response && response.statusCode);
    console.log('body:', body);
});

Проблема в том, что мое приложение node.js никогда не получает ответ, даже если он был возвращен внешней службой. Кажется, что соединение было разорвано где-то между приложением узла и внешним сервисом.

Я пытался использовать:

  1. опция request.js forever: true
  2. настройка агента keepAlive

Это не помогло. Мое приложение узла будет работать вечно, если я не использую опцию timeout. Когда timeout установлен и превышен, я получил ESOCKETTIMEDOUT ошибку.

Что интересно:

  • тот же код отлично работает на моей локальной машине
  • он также отлично работает на виртуальной машине Linux, которая работает за NAT
  • отлично работает с машины Kubernetes, когда я повторяю запрос, используя CURL

Возможно ли, что Кубернетес отбрасывает мою связь? И почему? Как CURL устанавливает настройки поддержки активности и почему запрос CURL работает от Kubernetes?

PS. Вместо request.js я пытался использовать другие библиотеки, такие как node-fetch или axios , но результаты были такими же.

...