Не удается подключиться к удаленной базе данных PostgreSQL в кластере Kubernetes

#postgresql #kubernetes #connection #cloud #psql

#postgresql #kubernetes #подключение #облако #psql

Вопрос:

В настоящее время я настраиваю экземпляр postgres в своем кластере Kubernetes, размещенном в общедоступном облаке OVH. Проблема в том, что я не могу получить к ней доступ. Я знаю, что мне нужно сделать psql -h host -U user --password -p 30904 db для подключения, но проблема в том, что я не знаю, что поставить вместо host. Локальный хост? IP-адрес главного узла? Другой ip?

Спасибо за ваше время.

postgres-развертывание.yaml :

 apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  type:
    NodePort
  ports:
  - port: 5432
  selector:
    app: postgres
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: postgres
spec:
  selector:
    matchLabels:
      app: postgres
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - image: postgres:13.1
        name: postgres
        env:
            - name: POSTGRES_DB
              valueFrom:
                secretKeyRef:
                  name: ident
                  key: POSTGRES_DB
          
              name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: ident
                  key: POSTGRES_USER

              name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: ident
                  key: POSTGRES_PASSWORD
        ports:
        - containerPort: 5432
          name: postgres
        volumeMounts:
        - name: postgres-persistent-storage
          mountPath: /var/lib/postgresql/data2
      volumes:
      - name: postgres-persistent-storage
        persistentVolumeClaim:
          claimName: postgres-pv-claim
 

Комментарии:

1. Вам необходимо предоставить более подробную информацию о вашей среде, конфигурации kubernetes и т. Д. Как вы развернули эту базу данных, как вы ее раскрыли. Вы использовали Deployment или stateful set, какой тип сервиса использовался. Было бы здорово, если бы вы могли предоставить все шаги для воспроизведения вашей среды с помощью приложения.

2. Хорошо, спасибо! Итак, я использую кластер kubernetes, созданный с помощью OVH, с набором пулов, работающих на стандартной ОС узла OVH, поэтому я не делал большую часть этой части, она в значительной степени управляется самим OVH. То, что я сделал, — это развертывание postgres с сервисом postgres типа NodePort. Я отредактирую свой пост, чтобы поместить в него содержимое моих файлов.

Ответ №1:

Я развернул вашу YAMLs базу данных и смог подключиться.

В --h вы должны указать IP node или host machine где PostgreSQL был развернут pod.

Тестовый пример

Я протестировал это на своем кластере GKE.

На основе вашего YAMLs и этого руководства. В основном для ConfigMap и PV/PVC конфигурации.

   POSTGRES_DB: postgresdb
  POSTGRES_USER: postgresadmin
  POSTGRES_PASSWORD: admin123
 

Подключение к базе данных PostgreSQL

  • 1 — Из модуля SQL
     $ kubectl get po
    NAME                        READY   STATUS    RESTARTS   AGE
    postgres-5586dc9864-pwpsn   1/1     Running   0          37m
 

Вы должны kubectl exec PostgreSQL использовать pod.

 $ kubectl exec -ti postgres-5586dc9864-pwpsn -- bin/bash
root@postgres-5586dc9864-pwpsn:/#
 

Используйте psql команду для подключения database .

 root@postgres-5586dc9864-pwpsn:/# psql -p 5432 -U postgresadmin -d postgresdb
psql (13.1 (Debian 13.1-1.pgdg100 1))
Type "help" for help.

postgresdb=#
 
  • 2 — Из кластера

Сведения о службе:

 $ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.28.0.1    <none>        443/TCP          60m
postgres     NodePort    10.28.14.2   <none>        5432:31431/TCP   45m
 

Подробности модуля:

 $ kubectl get po -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP          NODE                                       NOMINATED NODE   READINESS GATES
postgres-5586dc9864-pwpsn   1/1     Running   0          41m   10.24.1.6   gke-cluster-1-default-pool-8baf2b67-jjjh   <none>           <none>
 

Сведения об узле, где PostgreSQL был развернут pod.

 $ kubectl get node -o wide | grep gke-cluster-1-default-pool-8baf2b67-jjjh
gke-cluster-1-default-pool-8baf2b67-jjjh   Ready    <none>   56m   v1.16.15-gke.4300   10.154.15.222   35.197.210.241   Container-Optimized OS from Google   4.19.112         docker://19.3.1
 

NodeIP адрес node , где PostgreSQL был развернут pod 10.154.15.222 .

Команда:

 $ kubectl exec -ti <podname> -- psql -h <Internal IP address of hosting node> -U postgresadmin --password -p <nodeport number from service> <database name>
 

Вывод:

 $ kubectl exec -ti postgres-5586dc9864-pwpsn -- psql -h 10.154.15.222 -U postgresadmin --password -p 31431 postgresdb
Password:
psql (13.1 (Debian 13.1-1.pgdg100 1))
Type "help" for help.

postgresdb=#
 

Ответ №2:

Вы можете попробовать что-то вроде этого:

 kubectl exec -it $(kubectl get pods -n %YOURNAMESPACE% | grep postgres | cut -d " " -f1) -n %YOURNAMESPACE% -- bash -c "psql -U postgres -c 'SELECT current_database()'"
 

Или опустите значение пространства имен, если оно вам нужно в текущем пространстве имен:

 kubectl exec -it $(kubectl get pods | grep postgres | cut -d " " -f1) -n -- bash -c "psql -U postgres -c 'SELECT current_database()'"