无法连接Kubernetes集群上的远程PostgreSQL数据库。

3
我目前正在OVH公共云上的Kubernetes集群上设置一个postgres实例。问题是我无法访问它。我知道我需要使用psql -h host -U user --password -p 30904 db来连接,但问题是我不知道在host位置放什么。是localhost吗?还是主节点的IP?或者是另一个IP?
谢谢您抽出时间帮忙。 postgres-deploy.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

你需要提供关于你的环境、Kubernetes配置等更多细节。你是如何部署这个数据库的?你是如何暴露它的?你使用了Deployment还是StatefulSet,使用了哪种类型的服务?如果你能提供重现你的应用环境的所有步骤,那就太好了。 - undefined
好的,谢谢!所以我使用了一个由OVH创建的Kubernetes集群,其中包含一组在OVH标准节点操作系统上运行的池。所以这部分我没有做太多工作,基本上由OVH自己管理。我所做的是部署了一个Postgres,并创建了一个类型为NodePort的Postgres服务。我会编辑我的帖子,将文件内容放在里面。 - undefined
2个回答

3
我已经部署了你的YAML文件并且成功连接。
在--h中,你需要提供PostgreSQL pod所在的节点或主机的IP地址。
测试案例:
我在我的GKE集群上进行了测试。
根据你的YAML文件和this教程,主要是针对ConfigMap和PV/PVC配置。
  POSTGRES_DB: postgresdb
  POSTGRES_USER: postgresadmin
  POSTGRES_PASSWORD: admin123

连接到PostgreSQL数据库

  • 1 - 从SQL Pod
    $ 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

Pod详情:

$ 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
PostgreSQL pod所在的node

NodeIP地址为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=#

0
你可以尝试这样做:
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()'"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接