k8s - IP и DNS для postgres с сервисом - PullRequest
0 голосов
/ 06 марта 2019

Я создал службу с отслеживанием состояния, которая поддерживается развертыванием postgres с k8s.

Установка состоит из 3 общедоступных подсетей | AZ и 3 частных подсетей | AZ.Развертывание postgres позволяет создать 1 реплику и службу с clusterIP: none

Но теперь каждый раз, когда я удаляю службу и создаю заново, IP-адрес меняется, и я что-то читал о разрешении DNS.Я хочу получить доступ к БД из Java-клиента, чтобы развернуть другой модуль на н / ж;здесь я не могу получить статический IP.

Могу ли я создать сервис с clusterIP: #some_IP_from_one_of_the_subnet_range#?Что произойдет, если сервис выйдет из строя и k8s запустит его?Будет ли он запущен в том же AZ и подсети?Что делать, если AZ не работает?

1 Ответ

1 голос
/ 07 марта 2019

Я воспроизвел проблему, о которой вы сообщили. Я создал кластер postgres, а также создал службу K8S для кластера.

Кластер выглядит как

root@k8-master:~# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
kibana                      1/1     Running   0          9s
postgres-59bcb7c9d4-lvg8v   1/1     Running   0          56m
postgres-59bcb7c9d4-rfppm   1/1     Running   0          56m
postgres-59bcb7c9d4-s9zc4   1/1     Running   0          56m

После создания кластера и службы

Служба предоставляет имя службы, которое также преобразуется в IP-адрес с помощью разрешения DNS k8s.

Поэтому нам не нужно использовать статический IP-адрес для кластера postgres, потому что сервис postgres k8s поможет вам подключиться к контейнерам кластера. Чтобы доказать, что я отправил запрос curl, используя имя службы, а не IP-адрес.

root@k8-master:~# kubectl exec -it kibana /bin/bash
bash-4.2$ curl http://postgres:5432
curl: (52) Empty reply from server
bash-4.2$ exit

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

root@k8-master:~# kubectl describe services postgres
Name:                     postgres
Namespace:                default
Labels:                   app=postgres
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"postgres"},"name":"postgres","namespace":"default"},"spe...
Selector:                 app=postgres
Type:                     NodePort
IP:                       10.97.201.134
Port:                     <unset>  5432/TCP
TargetPort:               5432/TCP
NodePort:                 <unset>  30362/TCP
Endpoints:                10.244.1.12:5432,10.244.1.13:5432,10.244.2.242:5432
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

В приведенном выше примере конечные точки назначены на 10.244.1.12 и другие. Если это поле пустое, то доступ к сервису postgres не даст результата.

Еще один способ сказать, что служба просто перенаправляет запрос в кластер. Если кластер не распознает службу, доступ из Java не будет работать.

Надеюсь, это поможет.

...