#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
asmy-app-db
в uri подключения контейнера graphql? Кроме того, требуется ли для баз данных проверка работоспособности / готовности? В настоящее время они не установлены для базы данных.5. Эта настройка звучит правильно. Проверка готовности — хорошая идея.
Ответ №1:
В документах k8s о pods вы можете прочитать:
Модули в кластере Kubernetes используются двумя основными способами:
Модули, которые запускают один контейнер. […]
Модули, которые запускают несколько контейнеров, которые должны работать вместе. […]
Примечание: Группирование нескольких совместно расположенных и совместно управляемых контейнеров в одном модуле является относительно продвинутым вариантом использования. Вы должны использовать этот шаблон только в определенных случаях, в которых ваши контейнеры тесно связаны.
Каждый модуль предназначен для запуска одного экземпляра данного приложения. […]
Обратите внимание, что ваше развертывание не соответствует этому описанию, потому что вы пытаетесь запустить два приложения в одном модуле.
Не забывайте всегда использовать один модуль для каждого контейнера и использовать несколько контейнеров для каждого модуля, только если их невозможно разделить (и по какой-то причине они должны выполняться вместе).
А остальное уже упоминалось Дэвидом.