从外部Kubernetes集群连接到Postgres出现问题

时间:2018-12-07 05:47:06

标签: postgresql kubernetes

我已经在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。我想念什么?

1 个答案:

答案 0 :(得分:1)

我刚刚部署了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

这是通过节点端口连接到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),而port是服务中定义的NodePort。问题是您没有使用正确的IP连接到Postgresql。

相关问题