kubernetes pod无法连接(通过服务)到self,只能连接到其他pod容器

rid*_*tch 9 docker coreos kubernetes

我有一个kubernetes单节点设置(参见https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant-single.html)

我有一个服务和一个复制控制器创建pod.这些pod需要连接到同一服务中的其他pod(注意:这最终是因为我可以让mongo运行w /副本集(非localhost),但这个简单的例子演示了mongo的问题).

当我从任何节点连接到服务时,它将被分发(按预期)到其中一个pod.这将一直有效,直到它自身负载平衡(我所在的容器).然后它无法连接.

很抱歉是冗长的,但我要附上我的所有文件,以便你可以看到我在这个小例子中做了什么.

Dockerfile:

FROM ubuntu
MAINTAINER Eric H
RUN apt-get update; apt-get install netcat
EXPOSE 8080
COPY ./entry.sh /
ENTRYPOINT ["/entry.sh"]
Run Code Online (Sandbox Code Playgroud)

这是切入点

#!/bin/bash
# wait for a connection, then tell them who we are 
while : ; do 
    echo "hello, the date=`date`; my host=`hostname`" | nc -l 8080 
    sleep .5
done
Run Code Online (Sandbox Code Playgroud)

构建dockerfile

docker build -t echoserver .

标记并上传到我的k8s群集的注册表

docker tag -f echoserver:latest 127.0.0.1:5000/echoserver:latest
docker push 127.0.0.1:5000/echoserver:latest
Run Code Online (Sandbox Code Playgroud)

这是我的复制控制器

apiVersion: v1
kind: ReplicationController
metadata:
  labels:
    role: echo-server
    app: echo
  name: echo-server-1
spec:
  replicas: 3
  template:
    metadata:
      labels:
        entity: echo-server-1
        role: echo-server
        app: echo
    spec:
      containers:
      - 
        image: 127.0.0.1:5000/echoserver:latest
        name: echo-server-1

        ports:
          - containerPort: 8080
Run Code Online (Sandbox Code Playgroud)

最后,这是我的服务

kind: Service
metadata:
  labels:
    app: echo
    role: echo-server
    name: echo-server-1
  name: echo-server-1
spec:
  selector:
    entity: echo-server-1
    role: echo-server
  ports:
    - port: 8080
      targetPort: 8080
Run Code Online (Sandbox Code Playgroud)

创建我的服务 kubectl create -f echo.service.yaml

创建我的rc kubectl create -f echo.controller.yaml

得到我的POD

kubectl get po
NAME                  READY     STATUS    RESTARTS   AGE
echo-server-1-jp0aj   1/1       Running   0          39m
echo-server-1-shoz0   1/1       Running   0          39m
echo-server-1-y9bv2   1/1       Running   0          39m
Run Code Online (Sandbox Code Playgroud)

获取服务IP

kubectl get svc
NAME            CLUSTER_IP   EXTERNAL_IP   PORT(S)    SELECTOR                                AGE
echo-server-1   10.3.0.246   <none>        8080/TCP   entity=echo-server-1,role=echo-server   39m
Run Code Online (Sandbox Code Playgroud)

执行其中一个pod kubectl exec -t -i echo-server-1-jp0aj /bin/bash

现在多次连接到服务...它将为我提供所有pod的app-message,除了它自己何时到达,然后它挂起.

root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello, the date=Mon Jan 11 22:02:38 UTC 2016; my host=echo-server-1-y9bv2
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
^C
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello, the date=Mon Jan 11 22:02:43 UTC 2016; my host=echo-server-1-shoz0
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
^C
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello, the date=Mon Jan 11 22:31:19 UTC 2016; my host=echo-server-1-y9bv2
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello, the date=Mon Jan 11 22:31:23 UTC 2016; my host=echo-server-1-shoz0
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello, the date=Mon Jan 11 22:31:26 UTC 2016; my host=echo-server-1-y9bv2
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
hello, the date=Mon Jan 11 22:31:27 UTC 2016; my host=echo-server-1-shoz0
root@echo-server-1-jp0aj:/# nc 10.3.0.246 8080
Run Code Online (Sandbox Code Playgroud)

如何配置事物以便服务的所有成员可以连接到所有其他成员,包括其自身?

rid*_*tch 4

感谢所有在 GitHub 上提供帮助的人。
解决方法如下:

tanen01 于 2 月 4 日发表评论 在 k8s v1.1.7 stable 上看到同样的问题

问题发生在:

kube-proxy --proxy-mode=iptables 
Run Code Online (Sandbox Code Playgroud)

一旦我将其更改为:

           --proxy-mode=userspace 
Run Code Online (Sandbox Code Playgroud)

(也是默认的),然后它又可以工作了。

--proxy-mode因此,如果您遇到这种情况,请尝试在启动时关闭kube-proxy