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 не будет работать.
Надеюсь это поможет.