Сначала вам нужно настроить Postgresql для прослушивания не только на вашем виртуальном компьютере localhost
. Предположим, у вас есть сетевой интерфейс с IP-адресом 10.1.2.3
, настроенный на вашем узле, на котором установлен экземпляр Postgresql.
Добавьте следующую запись в ваш /etc/postgresql/10/main/postgresql.conf
:
listen_addresses = 'localhost,10.1.2.3'
и перезапустите службу postgres:
sudo systemctl restart postgresql
Вы можете проверить, прослушивает ли он нужный адрес, выполнив:
sudo ss -ntlp | grep postgres
С вашего Pods
, развернутого в кластере Microk8s , вы сможете получать IP-адреса вашего узла, например, вы должны иметь возможность пинговать упомянутые 10.1.2.3
с вашего Pods
.
Так как для этого не требуется балансировка нагрузки, вы можете подключиться к вашему Postgresql непосредственно с вашего Pods
без необходимости настройки дополнительного Service
, который выставляет его вашему кластеру.
Если вы не хотите ссылаться на ваш экземпляр Postgresql в своем приложении, используя его IP-адрес, вы можете отредактировать ваш Deployment
(который управляет набором Pods
, который подключается к вашему postgres db) для изменения содержимого по умолчанию используемого /etc/hosts
файла Pods
.
Отредактируйте приложение Развертывание, запустив:
microk8s.kubectl edit deployment your-app
и добавьте следующий раздел в Pod
template spec
:
hostAliases: # it should be on the same indentation level as "containers:"
- hostnames:
- postgres
- postgresql
ip: 10.1.2.3
После сохранения все ваши Pods
, управляемые этим Deployment
, будут воссозданы в соответствии с новой спецификацией. Когда вы запустите c в свой Pod
, запустив:
microk8s.kubectl exec -ti pod-name -- /bin/bash
, вы должны увидеть дополнительный раздел в файле / etc / hosts:
# Entries added by HostAliases.
10.1.2.3 postgres postgresql
Теперь вы можете ссылаться к вашему Postgres экземпляру в вашем приложении с именами postgres:5432
или postgresql:5432
, и он будет преобразован в IP-адрес вашей виртуальной машины.
Надеюсь, это поможет.
ОБНОВЛЕНИЕ:
Я почти забыл, что когда-то go я опубликовал ответ на очень похожую тему c. Вы можете найти это здесь . В нем описывается использование Сервиса без селектора , о чем вы и упоминали в своем вопросе. И да, его также можно использовать для настройки доступа к вашему экземпляру Postgresql, работающему на том же хосте. Так как этот тип Service
не имеет селекторов по определению, без конечной точки автоматически создается kubernetes , и вам необходимо создать его самостоятельно. Если у вас есть IP-адрес вашего экземпляра Postgres (в нашем примере это 10.1.2.3
), вы можете использовать его в своем определении endpoint .
Once вы настраиваете все на стороне kubernetes вы все равно можете столкнуться с проблемой с Postgres. В вашем Pod
, который пытается подключиться к экземпляру Postgres, вы можете увидеть следующее сообщение об ошибке:
org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host 10.1.7.151
Это в основном означает, что ваш pg_hba.conf В файле отсутствует необходимая запись, которая позволила бы вашему Pod
получить доступ к вашей базе данных Postgresql. Аутентификация основана на хосте, поэтому другими словами, аутентификация возможна только для хостов с определенными IP-адресами или с IP-адресами в пределах определенного диапазона IP-адресов.
Аутентификация клиента контролируется файлом конфигурации, который традиционно называется pg_hba .conf и хранится в каталоге данных кластера базы данных. (HBA означает аутентификацию на основе хоста.)
Так что теперь вы, вероятно, задаетесь вопросом, какую сеть вы должны разрешить в своей pg_hba.conf
. Для управления кластерной сетью Microk8s использует фланель . Посмотрите на содержимое вашего /var/snap/microk8s/common/run/flannel/subnet.env
файла. Мой выглядит следующим образом:
FLANNEL_NETWORK=10.1.0.0/16
FLANNEL_SUBNET=10.1.53.1/24
FLANNEL_MTU=1410
FLANNEL_IPMASQ=false
Добавление к вашей pg_hba.conf
only фланелевой su bnet должно быть достаточно, чтобы все ваши Pods
могли подключиться к Posgre sql.