Как получить доступ к локально установленному postgresql в кластере microk8s - PullRequest
0 голосов
/ 11 марта 2020

Я установил Postgresql и microk8s в Ubuntu 18.
Один из моих микросервисов, который находится внутри кластера с одним узлом microk8s, должен иметь доступ к postgresql, установленному на той же виртуальной машине.
Некоторые статьи, предлагающие мне создать service.yml и endpoint.yml вот так.

apiVersion: v1
metadata:
 name: postgresql
spec:
 type: ClusterIP
 ports:
 - port: 5432
   targetPort: 5432

---

kind: Endpoints
apiVersion: v1
metadata:
 name: postgresql
subsets:
 - addresses:
     - ip: ?????
   ports:
     - port: 5432

Теперь я не получаю то, что я должен вставить в поле subsets.addresses.ip ?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Сначала вам нужно настроить 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.

0 голосов
/ 11 марта 2020

Вы не должны заполнять Endpoints - они заполняются плоскостью управления kubernetes, так как она находит блоки, которые соответствуют selector: в вашем Service - что для вашего примера у вас, кажется, нет, и таким образом, это, вероятно, источник вашего вопроса.

...