无法从外部访问Kubernetes postgresql服务

时间:2016-03-02 15:04:09

标签: postgresql ubuntu docker kubernetes haproxy

我在使用Ubuntu 14.04的本地裸机计算机上使用Docker 1.10.1和Kubernetes 1.0.1,我还是新手。 那台计算机是Kubernetes的主人以及我用来进行测试的节点(我目前正在进行概念验证)。 我创建了几个容器(1个nginx和1个postgresql 9.2)来与它们一起玩。

我为postgresql容器创建了服务和pod定义,如下所示:

----- app-postgres-svc.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    name: AppPostgres
  name: app-postgres
spec:
  ports:
    - port: 5432
  selector:
    app: AppPostgresPod
  type: NodePort
  clusterIP: 192.168.3.105

----- app-postgres-pod.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: app-postgres-pod
spec:
  replicas: 1
  selector:
    app: AppPostgresPod
  template:
    metadata:
      name: app-postgres-pod
      labels:
        app: AppPostgresPod
    spec:
      containers:
      - name: app-postgres-pod
        image: localhost:5000/app_postgres
        ports:
        - containerPort: 5432

我还安装了HAProxy,以便将请求重定向到端口80和5432到相应的Kubernetes服务。 以下是postgresql重定向的前端和后端的HAProxy定义:

frontend postgres
        bind *:5432
        mode tcp
        option tcplog        
        default_backend postgres-kubernetes

backend postgres-kubernetes
        mode tcp
        balance roundrobin
        option pgsql-check
        server postgres-01 192.168.3.105:5432 check

在我启动kubernetes集群,服务和pod之后,我首先尝试从外部访问nginx网站,它的工作原理就像 魅力。但是,当我尝试从外部连接到postgresql服务时,我收到以下错误:

Error connecting to the server: server closed the connection unexpectedly
This probably means the server terminated abnormally before or while processing the request.

如果我查看日志,则会有太多这样的消息:

LOG:  incomplete startup packet
LOG:  incomplete startup packet
...

这是我用来尝试从外部(从同一局域网上的另一台计算机)连接的命令:

psql -h 192.168.0.100 -p 5432 -U myuser mydb

我也尝试过使用pgAdmin并显示相同的错误。

注意:如果我尝试从docker / kubernetes主机本身连接到postgres服务,我可以毫无问题地连接:

psql -h 192.168.3.105 -p 5432 -U myuser mydb

所以似乎Kubernetes部分工作正常。

可能出现什么问题?

编辑:包括概念验证中涉及的LAN计算机的详细信息,以及kubernetes定义 对于nginx的东西和haproxy配置上的条目。 所以当我尝试从我的笔记本电脑连接到docker / kubernetes盒子上的postgres服务时会出现问题(我认为HAProxy会将到达端口5432的docker / kubernetes盒子的请求重定向到kubernetes postgres服务)

----- LAN Network
My Laptop: 192.168.0.5
HAProxy/Docker/Kubernetes box: 192.168.0.100
   |
   ---> Kubernetes Nginx Service: 192.168.3.104
           |
           --->  Nginx Pod: 172.16.4.5
   |
   ---> Kubernetes Postgres Service: 192.168.3.105
           |
           ---> Postgres Pod: 172.16.4.9

----- app-nginx-svc.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    name: AppNginx
  name: app-nginx
spec:
  ports:
    - port: 80
  selector:
    app: AppNginxPod
  type: NodePort
  clusterIP: 192.168.3.104

----- app-nginx-pod-yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: app-nginx-pod
spec:
  replicas: 2
  selector:
    app: AppNginxPod
  template:
    metadata:
      name: app-nginx-pod
      labels:
        app: AppNginxPod
    spec:
      containers:
      - name: app-nginx-pod
        image: localhost:5000/app_nginx
        ports:
        - containerPort: 80

----- haproxy entries on /etc/haproxy/haproxy.cfg

frontend nginx
        bind *:80
        mode http
        default_backend nginx-kubernetes

backend nginx-kubernetes
        mode http
        balance roundrobin
        option forwardfor
        option http-server-close
        http-request set-header X-Forwarded-Port %[dst_port]
        http-request add-header X-Forwarded-Proto https if { ssl_fc }
        server nginx-01 192.168.3.104:80 check

解决方案:我必须在HAProxy配置的pgsql-check行中指定用户参数。在那之后,我能够毫无问题地连接。返回并删除了用户参数只是为了验证错误是否已经恢复,而且确实存在错误。所以,当然,问题是由于pgsql-check行中缺少user参数引起的。

0 个答案:

没有答案