【问题标题】:kubernetes unable to connect postgres from nodejskubernetes 无法从 nodejs 连接 postgres
【发布时间】:2020-02-21 17:04:19
【问题描述】:

我有 nodejs 应用程序和 postgres 作为数据库,两者都是通过 kubernetes 部署的(使用 kubeadm 和 docker 作为容器)。我为无法从 nodejs 访问的 postgres 创建了 clusterip 服务。

我登录了nodejs pod并ping了postgres的clusterip,它没有连接,但我能够连接部署postgres pod的主机IP(使用节点服务)。

以下是我的 postgres 配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
  labels:
    app: kubia
    tier: database
data:
  POSTGRES_DB: postgresdb
  POSTGRES_USER: postgresadmin
  POSTGRES_PASSWORD: admin123
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-pv
  labels:
    type: local
    app: kubia
    tier: database
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/mnt/data"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pv-claim
  labels:
    app: kubia
    tier: database
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kubia
      tier: database
  template:
    metadata:
      labels:
        app: kubia
        tier: database
    spec:
      containers:
        - name: postgres
          image: postgres:10.4
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          envFrom:
            - configMapRef:
                name: postgres-config
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb
      nodeSelector:
        nodetype: database
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pv-claim

---
apiVersion: v1
kind: Service
metadata:
  name: postgres-node
  labels:
    app: kubia
    tier: database
spec:
  type: NodePort
  ports:
   - port: 5432
     nodePort: 30010
  selector:
   app: kubia
   tier: database

---
apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: kubia
    tier: database
  namespace: default  
spec:
  type: ClusterIP
  ports:
   - port: 5432     
  selector:
   app: kubia
   tier: database

以下是 pod 和服务

NAME                                   READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES
pod/kubia-container-797dcf95c6-lgzkr   1/1     Running   0          3s      172.16.3.23   kube-worker-3   <none>           <none>
pod/postgres-75b85f8f5f-h9vrq          1/1     Running   0          2m31s   172.16.3.21   kube-worker-3   <none>           <none>

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTOR
service/kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          10d     <none>
service/kubia-svc       NodePort    10.98.129.62    <none>        8080:30008/TCP   3s      app=kubia,tier=ui
service/postgres        ClusterIP   10.111.153.26   <none>        5432/TCP         2m31s   app=kubia,tier=database
service/postgres-node   NodePort    10.107.59.255   <none>        5432:30010/TCP   2m31s   app=kubia,tier=database

我在包含集群 ip (10.111.153.26) 和端口 (5432) 的 nodejs 应用程序中使用了 POSTGRES_SERVICE_HOST 和 POSTGRES_SERVICE_PORT,但此应用程序无法连接 (postgres://postgresadmin:admin123@10.111.153.26:5432/postgresdb )。

但应用程序能够将 postgres 与主机 ip (10.30.111.108) 和节点端口连接起来 喜欢 postgres://postgresadmin:admin123@10.30.111.108:30010/postgresdb

参考其他帖子,我什至提到了服务名称 像 postgres://postgresadmin:admin123@postgres/postgresdb 但它也不起作用。

kubectl get ep

给出以下输出

NAME            ENDPOINTS          AGE
kubernetes      x.x.x.x:6443       11d
kubia-svc       172.16.3.25:8080   171m
postgres        172.16.3.24:5432   171m
postgres-node   172.16.3.24:5432   171m

我尝试从 postgres pod 连接 postgres,但连接失败

psql -h postgres -p 5432 -U postgresadmin -d postgresdb
psql: could not translate host name "postgres" to address: Temporary failure in name resolution

我无法对 postgres 主机进行硬编码,因为它可能随时更改,我需要通过 clusterip 进行连接。这其中缺少什么?

代码可用here

【问题讨论】:

  • 你能分享一下 kubectl get ep 的输出吗
  • 您可以将POSTGRES_HOST: localhost 添加到您的配置文件中吗?
  • postgress 服务是否与 postgress 部署在同一个命名空间中?我看到它在yaml中定义了default命名空间,而其他资源没有

标签: kubernetes


【解决方案1】:

我刚刚从 yaml 上方部署了 postgres,没有发现任何问题。我尝试了 clusterIP 以及服务名称,并且可以使用两者连接 postgres。有用。见下文

master $ kubectl get svc,po
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP          111m
service/postgres        ClusterIP   10.97.192.16   <none>        5432/TCP         11m
service/postgres-node   NodePort    10.103.72.80   <none>        5432:30010/TCP   11m

NAME                            READY   STATUS    RESTARTS   AGE
pod/postgres-848d4d8db8-n764v   1/1     Running   0          10m
master $ kubectl exec -it postgres-848d4d8db8-n764v sh


using service name
----------------

# psql -h postgres -p 5432 -U postgresadmin -d postgresdb
Password for user postgresadmin:
psql (10.4 (Debian 10.4-2.pgdg90+1))
Type "help" for help.

postgresdb=# \list
                                 List of databases
    Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
------------+----------+----------+------------+------------+-----------------------
 postgres   | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgresdb | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
            |          |          |            |            | postgres=CTc/postgres
 template1  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
            |          |          |            |            | postgres=CTc/postgres
(4 rows)

postgresdb=#\q

using clusterIP
----------------
postgresdb=# \q
#
#
# psql -h 10.97.192.16 -p 5432 -U postgresadmin -d postgresdb
Password for user postgresadmin:
psql (10.4 (Debian 10.4-2.pgdg90+1))
Type "help" for help.

postgresdb=# \list
                                 List of databases
    Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
------------+----------+----------+------------+------------+-----------------------
 postgres   | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgresdb | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
            |          |          |            |            | postgres=CTc/postgres
 template1  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
            |          |          |            |            | postgres=CTc/postgres
(4 rows)

postgresdb=#

建议您更新 nodejs 中的连接详细信息以使用服务名称或 clusterIP。 nodejs 和 postgres 都在同一个命名空间中运行。它应该工作

【讨论】:

  • 我尝试从 postgres pod 连接 postgres 但无法连接 psql -h postgres -p 5432 -U postgresadmin -d postgresdb psql: could not translate host name "postgres" to address: Temporary failure in name resolution
  • 检查控制平面组件。集群可能存在一些问题
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2020-05-10
  • 2020-08-26
  • 2020-06-13
  • 1970-01-01
  • 2022-12-13
相关资源
最近更新 更多