我在使用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参数引起的。