无法从Inside Service Pod连接到Kubernetes服务?

时间:2018-03-09 20:42:42

标签: kubernetes

我使用官方孵化器回购中的官方kafka图表创建了一个复制品zookeeper + kafka集群:

:host {
    &::before {
        content: '';
        display: block;
        width: 100%;
        height: $channel-border-w;
        background: $color-border-divider-bg;
    }
}

这给了我两个豆荚:

helm install --name mykafka -f kafka.yaml incubator/kafka

还有四项服务(除了默认的kubernetes服务)

kubectl get pods
NAME                  READY     STATUS
mykafka-kafka-0       1/1       Running
mykafka-zookeeper-0   1/1       Running

如果我进入zookeeper pod:

kubectl get service
NAME                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)
kubernetes                   ClusterIP   10.96.0.1       <none>        443/TCP
mykafka-kafka                ClusterIP   10.108.143.59   <none>        9092/TCP
mykafka-kafka-headless       ClusterIP   None            <none>        9092/TCP
mykafka-zookeeper            ClusterIP   10.109.43.48    <none>        2181/TCP
mykafka-zookeeper-headless   ClusterIP   None            <none>        2888/TCP,3888/TCP

我使用> kubectl exec -it mykafka-zookeeper-0 -- /bin/bash 工具测试TCP连接。我期望通信错误,因为服务器没有使用HTTP,但如果curl甚至无法连接,我必须ctrl-C out,那么TCP连接不起作用。

我可以通过curl访问本地广告连播:

curl localhost:2181

我可以通过root@mykafka-zookeeper-0:/# curl localhost:2181 curl: (52) Empty reply from server 访问其他广告连播:

curl mykafka-kafka:9092

但我无法访问root@mykafka-zookeeper-0:/# curl mykafka-kafka:9092 curl: (56) Recv failure: Connection reset by peer 。该名称解析为群集IP,但尝试TCP连接挂起,直到我ctrl-C:

mykafka-zookeeper:2181

同样,我可以进入kafka pod:

root@mykafka-zookeeper-0:/# curl -v mykafka-zookeeper:2181
* Rebuilt URL to: mykafka-zookeeper:2181/
*   Trying 10.109.43.48...
^C

通过服务名称连接到Zookeeper pod工作正常:

> kubectl exec -it mykafka-kafka-0 -- /bin/bash

连接到localhost kafka工作正常:

root@mykafka-kafka-0:/# curl mykafka-zookeeper:2181
curl: (52) Empty reply from server

但是通过服务名称连接到Kafka pod不起作用,我必须ctrl-C卷曲尝试:

root@mykafka-kafka-0:/# curl localhost:9092
curl: (56) Recv failure: Connection reset by peer

任何人都可以解释为什么使用我只能从服务外部而不是从服务内部连接到Kubernetes服务?

1 个答案:

答案 0 :(得分:1)

我相信您的体验可以通过查看您的kubelet设置如何运行来解决。您可以在启动名为--hairpin-mode的kubelet时切换设置。默认情况下,此设置设置为字符串promiscuous,其中pod无法连接到自己的服务,但您可以将其更改为hairpin-veth,这将允许pod连接到它自己的服务。

关于这个主题有一些问题,但这似乎被引用最多: https://github.com/kubernetes/kubernetes/issues/45790