【问题标题】:kubernetes pod can't connect (through service) to self, only to other pod-containerskubernetes pod 无法(通过服务)连接到自己,只能连接到其他 pod-containers
【发布时间】:2016-04-16 09:57:33
【问题描述】:

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

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

当我从任何节点连接到服务时,它将(如预期)分发到其中一个 pod。这将一直有效,直到它对自身(我所在的容器)进行负载平衡。然后连接失败。

很抱歉,我很抱歉,但我将附上我的所有文件,以便您可以看到我在这个小示例中所做的事情。

Dockerfile:

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

获取我的 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

获取服务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

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

现在多次连接到该服务...它将为我提供所有 pod 的应用程序消息,但当它到达自身时,它会挂起。

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

我该如何配置,以便服务的所有成员都可以连接到所有其他成员,包括它自己?

【问题讨论】:

    标签: docker kubernetes coreos


    【解决方案1】:

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

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

    问题发生在:

    kube-proxy --proxy-mode=iptables 
    

    一旦我将其更改为:

               --proxy-mode=userspace 
    

    (也是默认值),然后它再次工作。

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

    【讨论】:

      【解决方案2】:

      这应该可以工作 - 我们已经在 kubernetes v1.1 中使用 iptables 代理对其进行了广泛的测试(不是默认设置,但会在 v1.2 中使用)。你能多谈谈你的环境吗?

      【讨论】:

      • kubelet --version=true Kubernetes v1.1.2+3085895
      • 我以github.com/coreos/coreos-kubernetes.git 的单节点演示为起点
      • Coreos 899.5.0 测试版
      • 这种情况仍在 Kubernetes 1.2.0 上发生,--proxy-mode=iptables--hairpin-mode=hairpin-veth
      【解决方案3】:

      我已经看到至少一位其他用户报告了这一点。我提出了一个问题: https://github.com/kubernetes/kubernetes/issues/20475

      我假设您使用该链接中的 Kubernetes 版本 -- 1.1.2。

      【讨论】:

        猜你喜欢
        • 2018-09-03
        • 2018-10-07
        • 2020-01-01
        • 2021-06-07
        • 1970-01-01
        • 2020-02-04
        • 2019-02-15
        • 2018-08-18
        • 2016-04-28
        相关资源
        最近更新 更多