У меня есть очень простой кусок кода, написанный в 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 никогда не получает ответ, даже если он был возвращен внешней службой. Кажется, что соединение было разорвано где-то между приложением узла и внешним сервисом.
Я пытался использовать:
- опция request.js
forever: true
- настройка агента keepAlive
Это не помогло. Мое приложение узла будет работать вечно, если я не использую опцию timeout
. Когда timeout
установлен и превышен, я получил ESOCKETTIMEDOUT
ошибку.
Что интересно:
- тот же код отлично работает на моей локальной машине
- он также отлично работает на виртуальной машине Linux, которая работает за NAT
- отлично работает с машины Kubernetes, когда я повторяю запрос, используя CURL
Возможно ли, что Кубернетес отбрасывает мою связь? И почему?
Как CURL устанавливает настройки поддержки активности и почему запрос CURL работает от Kubernetes?
PS. Вместо request.js я пытался использовать другие библиотеки, такие как node-fetch или axios , но результаты были такими же.