Рейтинг:2

Kubernetes ingress 502 неверный шлюз в DigitalOcean

флаг es

Я пытаюсь развернуть NestJS приложение с Кубернетес на DigitalOcean, и я следил за этот учебник, но я всегда получаю ошибку 502 Bad Gateway от nginx-входящий-контроллер.

Это мое развертывание.yaml

---
апиВерсия: v1
вид: сервис
метаданные:
  имя: Nestjs-API
спецификация:
  порты:
    - порт: 80
      целевой порт: 3001
  селектор:
    приложение: NestJS-API
---
# Создаем NestJS-API
apiVersion: приложения/v1
вид: развертывание
метаданные:
  имя: Nestjs-API
  этикетки:
    приложение: NestJS-API
спецификация:
  реплики: 1
  селектор:
    метки соответствия:
      приложение: NestJS-API
  шаблон:
    метаданные:
      этикетки:
        приложение: NestJS-API
    спецификация:
      контейнеры:
        - имя:nesjs-апи
          изображение:Registry.digitalocean.com/nestjs-registry/nestjs-api
          порты:
            - контейнерПорт: 3001
          envОт:
            - секретСсылка:
                имя: API-окружение
---
Версия API: networking.k8s.io/v1
вид: Вход
метаданные:
  имя: nestjs-вход
спецификация:
  правила:
    - хост: api.mydomain.com
      http:
        пути:
          - дорожка: /
            тип пути: префикс
            серверная часть:
              оказание услуг:
                имя: Nestjs-API
                порт:
                  номер: 80

Это образ Docker на Registration.digitalocean.com/nestjs-registry/nestjs-api

ОТ узла: 14-alpine3.14 AS BUILD_IMAGE

RUN apk update && apk add yarn curl bash make && rm -rf /var/cache/apk/*

ЗАПУСК curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin

РАБОЧИЙ КАТАЛОГ /usr/src/app

# устанавливаем зависимости
RUN пряжа --frozen-lockfile

КОПИРОВАТЬ . .
БЕГ пряжи установить
наращивание пряжи RUN

ЗАПУСК npm prune --production

ЗАПУСК /usr/local/bin/node-prune

С узла: 14-alpine3.14

ПОЛЬЗОВАТЕЛЬ 1000
ВЫПОЛНИТЬ mkdir -p /дом/узел/приложение/
ЗАПУСК mkdir -p /home/node/app/node_modules
ВЫПОЛНИТЬ mkdir -p /home/node/app/dist

RUN chown -R 1000:1000 /home/node/app
RUN chown -R 1000:1000 /home/node/app/node_modules
RUN chown -R 1000:1000 /home/node/app/dist

РАБОЧИЙ КАТАЛОГ /дом/узел/приложение

КОПИРОВАТЬ --from=BUILD_IMAGE /usr/src/app/dist /home/node/app/dist
КОПИРОВАТЬ --from=BUILD_IMAGE /usr/src/app/node_modules /home/node/app/node_modules

ВЫСТАВИТЬ 3001
ТОЧКА ВХОДА ["узел"]
CMD ["/home/node/app/dist/main.js"]

Это журнал моего nginx-входящий-контроллер

2021/09/29 18:37:12 [ошибка] 590#590: *147263 connect() не удалось (111: Отказ в подключении) при подключении к восходящему каналу, клиент: MY_HOME_IP, сервер: api.mydomain.com, запрос: "GET / HTTP/1.1", восходящий поток: "http://10.244.0.229:3001/", хост: "api.mydomain.com"
2021/09/29 18:37:12 [ошибка] 590#590: *147263 connect() не удалось (111: Отказ в подключении) при подключении к восходящему каналу, клиент: MY_HOME_IP, сервер: api.mydomain.com, запрос: "GET / HTTP/1.1", восходящий поток: "http://10.244.0.229:3001/", хост: "api.mydomain.com"
2021/09/29 18:37:12 [ошибка] 590#590: *147263 connect() не удалось (111: Отказ в подключении) при подключении к восходящему каналу, клиент: MY_HOME_IP, сервер: api.mydomain.com, запрос: "GET / HTTP/1.1", восходящий поток: "http://10.244.0.229:3001/", хост: "api.mydomain.com"
MY_HOME_IP - - [29/сен/2021:18:37:12 +0000] "GET / HTTP/1.1" 502 150 "-" "PostmanRuntime/7.28.4" 204 0,000 [default-nestjs-api-80] [] 10.244.0.229:3001, 10.244.0.229:3001, 10.244.0.229:3001 0, 0, 0 0,000, 0,000, 0,000 502, 502, 502 a54bfdae6e0b77bf894e53d8ac8fa29e

Вот некоторые выводы из кубектл

$ kubectl get pods -o широкий
НАЗВАНИЕ ГОТОВНОСТЬ СТАТУС ПЕРЕЗАПУСКИ ВОЗРАСТ IP УЗЛА НАЗНАЧЕННЫЙ УЗЕЛ ГОТОВНОСТЬ ВОРОТА
nestjs-api-6bcccbdbd5-zmdqg 1/1 Работает 0 61 м 10.244.0.238 api-wn5e3n2u8-u3j8q <none> <none>

$ kubectl получить сервис -o широкий
НАЗВАНИЕ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВЫБОР ВОЗРАСТА
Nestjs-api ClusterIP 10.245.37.142 <нет> 80/TCP 3h app=nestjs-api
kubernetes ClusterIP 10.245.0.1 <нет> 443/TCP 5d6h <нет>


$ kubectl get pods -n ingress-nginx -o wide
ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ IP УЗЛА НАЗНАЧЕННЫЙ УЗЕЛ ГОТОВНОСТЬ ВОРОТА
ingress-nginx-admission-create-psdn2 0/1 Завершено 0 6h34m 10.244.0.251 api-wn5e3n2u8-u3j8q <none> <none>
ingress-nginx-admission-patch-x8vvs 0/1 Завершено 1 6h34m 10.244.0.252 api-wn5e3n2u8-u3j8q <none> <none>
ingress-nginx-controller-68649d49b8-bj7vp 1/1 Работает 0 6h34m 10.244.0.175 api-wn5e3n2u8-u3j8q <none> <none>

ОБНОВИТЬ

Журнал моего main.js показывает, что приложение прослушивает порт 3001

{"message":"Приложение запущено на: http://127.0.0.1:3001"}

Что исходит из следующего кода

// Получить IP и ПОРТ сервера из конфигурации
константный ip = process.env.SERVER_IP;
постоянный порт = parseInt (process.env.SERVER_PORT, 10);

// Запустить сервер
ожидайте app.listen (порт, ip);
logger.log(`Приложение запущено: ${await app.getUrl()}`);
logger.log(`Среда: ${окружение}`);

Это вары, сохраненные в API-окружение в качестве секрета на k8s.

СЕРВЕР_IP: 127.0.0.1
ПОРТ_СЕРВЕРА: 3001

В любом случае, как предложил @mdaniel, я добавил livenessProbe к спецификации моего Развертывание и сбой Pod.

    спецификация:
      контейнеры:
        - имя:nesjs-апи
          изображение:Registry.digitalocean.com/nestjs-registry/nestjs-api
          порты:
            - контейнерПорт: 3001
          живостьзонд:
            httpПолучить:
              порт: 3001
              дорожка: '/'
          envОт:
            - секретСсылка:
                имя: API-окружение

Теперь я действительно смущен. Что-то не так в моей конфигурации, но я понятия не имею, что.

Заранее спасибо.

флаг in
Привет, fasenderos, добро пожаловать в S.F. Сообщение кажется довольно простым — ваш `main.js`, очевидно, не прослушивает: 3001. Вы можете заставить k8s помочь вам, добавив `livenessProbe: {httpGet: {port: 3001, path: "/" } }` к `spec:`, и он взорвет ваш Pod, если узел перестанет слушать, сделав неправильную конфигурацию намного громче
Mikołaj Głodziak avatar
флаг id
Вы пробовали предложение от mdaniel? Дайте нам знать, какой результат вышел.
флаг es
Привет mdaniel спасибо за ответ. Я обновил вопрос.
флаг in
Вы также действительно оказываете себе и своим будущим коллегам серьезную медвежью услугу, скрывая информацию о конфигурации в «секрете», поскольку IP-адрес сервера и порт **наверняка** не являются секретными, но каждое взаимодействие с ними потребует `Роль`, которая может читать секреты кластера, а затем декодировать поля секрета.
Рейтинг:2
флаг in

{"message":"Приложение запущено: http://127.0.0.1:3001"}

Вот ваша проблема; как и с любым сервером, если вы только привязываетесь к локальному хосту, ничего такого за исключением того, что одна «машина» может получить доступ к этому порту.

Ты захочешь

данные:
  СЕРВЕР_IP: 0.0.0.0
  SERVER_PORT: «3001»
флаг es
Даже установка IP-адреса 0.0.0.0 не работает, но, вероятно, что-то не так с моим приложением Nestjs. Я использую адаптер Fastify и следую их документации https://docs.nestjs.com/techniques/performance.
флаг es
Решено, было правило брандмауэра, которое блокировало мое приложение при запуске. Во всяком случае, частью правила брандмауэра было изменение IP-адреса на 0.0.0.0. Спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.