postgresql - 从 Kubernetes 集群外部连接到 postgres 时出现问题
问题描述
我在 minikube 中启动了一个 postgresql 服务器,但我很难从集群外部连接到它。
更新
事实证明,我的集群遇到了不相关的问题,导致了各种破坏行为。我最终对整个集群和虚拟机进行了核对,并从头开始。现在我有工作了。我将部署更改为有状态集,尽管我认为它可以以任何一种方式工作。
设置和测试:
kubectl --context=minikube create -f postgres-statefulset.yaml
kubectl --context=minikube create -f postgres-service.yaml
url=$(minikube service postgres --url --format={{.IP}}:{{.Port}})
psql --host=${url%:*} --port=${url#*:} --username=postgres --dbname=postgres \
--command='SELECT refobjid FROM pg_depend LIMIT 1'
Password for user postgres:
refobjid
----------
1247
postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
role: service
spec:
selector:
app: postgres
type: NodePort
ports:
- name: postgres
port: 5432
targetPort: 5432
protocol: TCP
postgres-statefulset.yaml
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
name: postgres
labels:
app: postgres
role: service
spec:
replicas: 1
selector:
matchLabels:
app: postgres
role: service
serviceName: postgres
template:
metadata:
labels:
app: postgres
role: service
spec:
containers:
- name: postgres
image: postgres:9.6
env:
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
value: postgres
- name: POSTGRES_DB
value: postgres
ports:
- containerPort: 5432
name: postgres
protocol: TCP
原始问题
我创建了一个运行一个容器 ( postgres-container
) 和一个 NodePort ( postgres-service
) 的部署。我可以从 pod 本身连接到 postgresql:
$ kubectl --context=minikube exec -it postgres-deployment-7fbf655986-r49s2 \
-- psql --port=5432 --username=postgres --dbname=postgres
但我无法通过服务连接。
$ minikube service --url postgres-service
http://192.168.99.100:32254
$ psql --host=192.168.99.100 --port=32254 --username=postgres --dbname=postgres
psql: could not connect to server: Connection refused
Is the server running on host "192.168.99.100" and accepting
TCP/IP connections on port 32254?
我认为 postgres 已正确配置为接受远程 TCP 连接:
$ kubectl --context=minikube exec -it postgres-deployment-7fbf655986-r49s2 \
-- tail /var/lib/postgresql/data/pg_hba.conf
host all all 127.0.0.1/32 trust
...
host all all all md5
$ kubectl --context=minikube exec -it postgres-deployment-7fbf655986-r49s2 \
-- grep listen_addresses /var/lib/postgresql/data/postgresql.conf
listen_addresses = '*'
我的服务定义如下:
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
selector:
app: postgres-container
type: NodePort
ports:
- port: 5432
targetPort: 5432
protocol: TCP
部署是:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: postgres-deployment
spec:
replicas: 1
selector:
matchLabels:
app: postgres-container
template:
metadata:
labels:
app: postgres-container
spec:
containers:
- name: postgres-container
image: postgres:9.6
env:
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
value: postgres
- name: POSTGRES_DB
value: postgres
ports:
- containerPort: 5432
生成的服务配置:
$ kubectl --context=minikube get service postgres-service -o yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: 2018-12-07T05:29:22Z
name: postgres-service
namespace: default
resourceVersion: "194827"
selfLink: /api/v1/namespaces/default/services/postgres-service
uid: 0da6bc36-f9e1-11e8-84ea-080027a52f02
spec:
clusterIP: 10.109.120.251
externalTrafficPolicy: Cluster
ports:
- nodePort: 32254
port: 5432
protocol: TCP
targetPort: 5432
selector:
app: postgres-container
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
如果我使用端口转发,我可以连接,但我想改用 nodePort。我错过了什么?
解决方案
我刚刚部署了 postgres 并通过 NodePort 公开了它的服务,下面是我的 pod 和服务。
[root@master postgres]# kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-7ff9df5765-2mpsl 1/1 Running 0 1m
[root@master postgres]# kubectl get svc postgres
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgres NodePort 10.100.199.212 <none> 5432:31768/TCP 20s
这就是通过 nodeport 连接到 postgres 的方式:
[root@master postgres]# kubectl exec -it postgres-7ff9df5765-2mpsl -- psql -h 10.6.35.83 -U postgresadmin --password -p 31768 postgresdb
Password for user postgresadmin:
psql (10.4 (Debian 10.4-2.pgdg90+1))
Type "help" for help.
postgresdb=#
在上面,10.6.35.83 是我的节点/主机 IP(不是 pod IP 或 clusterIP),端口是服务中定义的 NodePort。问题是您没有使用正确的 IP 连接到 postgresql。
推荐阅读
- java - 页面未调整大小/向其他用户显示不同的问题
- python - 导入 Sklearn 时出现错误
- r - 为什么在 mapply 的 MoreArgs 参数中进行变量赋值与在其“...”参数中进行变量赋值给出不同的结果?
- python - 用于监控 github repos 更改的 Python 看门狗
- ruby - 无法使用 Rails / Vue / Nginx / Puma 正确配置 WebSocket
- fonts - 热制作字体的粗体版本(.ttf / .otf 格式)
- amazon-web-services - 将 AWS ECS 与 EC2 实例结合使用时出现 CannotStartContainerError
- google-apps-script - 您如何通过 Google Apps 脚本访问 Google Sheets API?
- r - 使用给定的 beta0 和 beta1 对手动计算 RSS
- postgresql - 每行具有不同日期的 Postgres SQL 查询