Подключение двух контейнеров с помощью Kubernetes с использованием переменных среды

#postgresql #kubernetes

#postgresql #kubernetes

Вопрос:

Я новичок в k8s и нуждаюсь в некотором руководстве по устранению неполадок.

У меня есть контейнер postgres и контейнер graphql. Контейнер graphql пытается подключиться к postgres при запуске.

Проблема

Контейнер graphql не может подключиться к postgres. Это ошибка при запуске:

{«internal»:»не удалось подключиться к серверу: соединение отклонено n Это сервер, работающий на хосте «my-app» (xxx.xx.xx.xxx) и принимающий n tTCP / IP-соединения на порту 5432? n», «path»:»$»,»ошибка»:»ошибка подключения»,»код»: «postgres-ошибка»}

Насколько я понимаю, graphql-контейнер не распознает IP my-app (xxx.xx.xx.xxx) . Это фактический IP-адрес хоста Pod, поэтому я не понимаю, почему он его не распознает. Как мне устранить подобные ошибки?

Что я пробовал

  • Жесткое кодирование хоста в uri подключения при развертывании.yaml к фактическому IP-адресу pod-хоста. Та же ошибка.

  • Врезался в контейнер graphql и проверил, что у него правильные значения env с env помощью команды.

deployment.yaml

 spec:
  selector:
    matchLabels:
      service: my-app
  template:
    metadata:
      labels:
        service: my-app
...
  - name: my-graphql-container
    image: image-name:latest
    env:
    - name: MY_POSTGRES_HOST
      value: my-app
    - name: MY_DATABASE
      value: db
    - name: MY_POSTGRES_DB_URL # the postgres connection url that the graphql container uses
      value: postgres://$(user):$(pw)@$(MY_POSTGRES_HOST):5432/$(MY_DATABASE)
...
  - name: my-postgres-db
    image: image-name:latest
  

Комментарии:

1. Имя MY_POSTGRES_HOST хоста должно совпадать с именем службы перед базой данных. Так ли это?

2. Да, это так, оба контейнера находятся в my-app службе.

3. Обычно это не очень хороший шаблон; лучше запустить одно развертывание для (без состояния) my-app и отдельный набор с отслеживанием состояния для my-app-db , с соответствующими службами для каждого. Если у вас есть датчики готовности в вашем модуле, также возникает проблема с курицей и яйцом, когда служба не будет подключаться к модулю, пока модуль не покажет готовность, но модуль не может показать готовность, пока не сможет подключиться к сервису.

4. Я понимаю… Итак, если я создам отдельную вызываемую службу my-app-db , я бы просто установил host as my-app-db в uri подключения контейнера graphql? Кроме того, требуется ли для баз данных проверка работоспособности / готовности? В настоящее время они не установлены для базы данных.

5. Эта настройка звучит правильно. Проверка готовности — хорошая идея.

Ответ №1:

В документах k8s о pods вы можете прочитать:

Модули в кластере Kubernetes используются двумя основными способами:

  • Модули, которые запускают один контейнер. […]

  • Модули, которые запускают несколько контейнеров, которые должны работать вместе. […]

Примечание: Группирование нескольких совместно расположенных и совместно управляемых контейнеров в одном модуле является относительно продвинутым вариантом использования. Вы должны использовать этот шаблон только в определенных случаях, в которых ваши контейнеры тесно связаны.

Каждый модуль предназначен для запуска одного экземпляра данного приложения. […]


Обратите внимание, что ваше развертывание не соответствует этому описанию, потому что вы пытаетесь запустить два приложения в одном модуле.

Не забывайте всегда использовать один модуль для каждого контейнера и использовать несколько контейнеров для каждого модуля, только если их невозможно разделить (и по какой-то причине они должны выполняться вместе).

А остальное уже упоминалось Дэвидом.