【问题标题】:Can't Connect to Kubernetes Service from Inside Service Pod?无法从 Inside Service Pod 连接到 Kubernetes 服务?
【发布时间】:2018-08-18 12:03:22
【问题描述】:

我用来自官方孵化器仓库的官方kafka图表创建了一个单副本zookeeper + kafka集群:

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

这给了我两个 pod:

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

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

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

如果我进入 zookeeper pod:

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

我使用curl 工具来测试 TCP 连接性。我预计会出现通信错误,因为服务器没有使用 HTTP,但如果 curl 甚至无法连接并且我必须按 ctrl-C 退出,则 TCP 连接无法正常工作。

我可以通过curl localhost:2181访问本地pod:

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

我可以通过curl mykafka-kafka:9092访问其他pod:

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

但我无法访问mykafka-zookeeper:2181。该名称解析为集群 IP,但 TCP 连接尝试挂起,直到我 ctrl-C:

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

同样,我可以进入 kafka pod:

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

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

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

连接到本地 kafka 工作正常:

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

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

curl -v mykafka-kafka:9092
* Rebuilt URL to: mykafka-kafka:9092/
* Hostname was NOT found in DNS cache
*   Trying 10.108.143.59...
^C

谁能解释为什么使用我只能从服务外部而不是从服务内部连接到 Kubernetes 服务?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

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

    关于这个话题有几个问题,但这似乎是被引用最多的: https://github.com/kubernetes/kubernetes/issues/45790

    【讨论】:

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