k8s - IP и DNS для postgres с сервисом

Я создал службу с отслеживанием состояния, которая поддерживается развертыванием 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 ответ

Я воспроизвел проблему, о которой вы сообщили. Я создал кластер 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 поможет вам подключиться к контейнерам кластера. Чтобы доказать, что я отправил запрос скручивания, используя имя службы, а не 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 не будет работать.

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

Другие вопросы по тегам