【发布时间】: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