kubernetes pod 无法(通过服务)连接到自身,只能连接到其他 pod 容器
kubernetes pod can't connect (through service) to self, only to other pod-containers
我有一个 kubernetes 单节点设置(参见 https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant-single.html)
我有一个服务和一个创建 pods 的复制控制器。那些 pods 需要连接到同一服务中的另一个 pods (注意:这最终是为了让我可以获得 mongo 运行 w/replica 集(非localhost), 但这个简单的例子演示了 mongo 的问题).
当我从任何节点连接到该服务时,它将(按预期)分发到 pods 之一。这将一直有效,直到它对自身(我所在的容器)进行负载平衡。然后就连接不上了。
抱歉冗长,但我将附上我的所有文件,以便您可以看到我在这个小示例中所做的事情。
Docker 文件:
FROM ubuntu
MAINTAINER Eric H
RUN apt-get update; apt-get install netcat
EXPOSE 8080
COPY ./entry.sh /
ENTRYPOINT ["/entry.sh"]
这里是入口点
#!/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
构建 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
这是我的复制控制器
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
最后,这是我的服务
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
创建我的服务
kubectl create -f echo.service.yaml
创建我的 rc
kubectl create -f echo.controller.yaml
获取我的PODs
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
获取服务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
执行到pods之一
kubectl exec -t -i echo-server-1-jp0aj /bin/bash
现在多次连接到该服务...它将向我提供所有 pods 的应用程序消息,除非它到达自身时挂起。
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
如何配置才能使服务的所有成员都可以连接到所有其他成员,包括服务本身?
我已经看到至少一位其他用户报告了这一点。我提出了一个问题:
https://github.com/kubernetes/kubernetes/issues/20475
我假设您使用的是 link -- 1.1.2.
中的 Kubernetes 版本
这应该可以工作 - 我们已经在 kubernetes v1.1 中使用 iptables 代理对其进行了广泛的测试(不是默认的,但将在 v1.2 中)。能多说说你的环境吗?
感谢所有在 GitHub 上提供帮助的人。
解决方法如下:
tanen01 commented on Feb 4 Seeing the same problem here on k8s v1.1.7
stable
Issue occurs with:
kube-proxy --proxy-mode=iptables
Once I changed it to:
--proxy-mode=userspace
(also the default), then it works again.
所以,如果您遇到这种情况,请在启动时尝试关闭 --proxy-mode
kube-proxy
。
我有一个 kubernetes 单节点设置(参见 https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant-single.html)
我有一个服务和一个创建 pods 的复制控制器。那些 pods 需要连接到同一服务中的另一个 pods (注意:这最终是为了让我可以获得 mongo 运行 w/replica 集(非localhost), 但这个简单的例子演示了 mongo 的问题).
当我从任何节点连接到该服务时,它将(按预期)分发到 pods 之一。这将一直有效,直到它对自身(我所在的容器)进行负载平衡。然后就连接不上了。
抱歉冗长,但我将附上我的所有文件,以便您可以看到我在这个小示例中所做的事情。
Docker 文件:
FROM ubuntu
MAINTAINER Eric H
RUN apt-get update; apt-get install netcat
EXPOSE 8080
COPY ./entry.sh /
ENTRYPOINT ["/entry.sh"]
这里是入口点
#!/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
构建 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
这是我的复制控制器
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
最后,这是我的服务
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
创建我的服务
kubectl create -f echo.service.yaml
创建我的 rc
kubectl create -f echo.controller.yaml
获取我的PODs
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
获取服务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
执行到pods之一
kubectl exec -t -i echo-server-1-jp0aj /bin/bash
现在多次连接到该服务...它将向我提供所有 pods 的应用程序消息,除非它到达自身时挂起。
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
如何配置才能使服务的所有成员都可以连接到所有其他成员,包括服务本身?
我已经看到至少一位其他用户报告了这一点。我提出了一个问题: https://github.com/kubernetes/kubernetes/issues/20475
我假设您使用的是 link -- 1.1.2.
中的 Kubernetes 版本这应该可以工作 - 我们已经在 kubernetes v1.1 中使用 iptables 代理对其进行了广泛的测试(不是默认的,但将在 v1.2 中)。能多说说你的环境吗?
感谢所有在 GitHub 上提供帮助的人。
解决方法如下:
tanen01 commented on Feb 4 Seeing the same problem here on k8s v1.1.7 stable
Issue occurs with:
kube-proxy --proxy-mode=iptables
Once I changed it to:
--proxy-mode=userspace
(also the default), then it works again.
所以,如果您遇到这种情况,请在启动时尝试关闭 --proxy-mode
kube-proxy
。