当前位置: 首页 > 知识库问答 >
问题:

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

酆恩
2023-03-14

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

helm install --name mykafka -f kafka.yaml incubator/kafka
kubectl get pods
NAME                  READY     STATUS
mykafka-kafka-0       1/1       Running
mykafka-zookeeper-0   1/1       Running
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

我使用curl工具测试TCP连通性。我预计会出现通信错误,因为服务器没有使用HTTP,但是如果curl连都不能连接,我不得不用ctrl-C输出,那么TCP连接就不能工作了。

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

root@mykafka-zookeeper-0:/# curl localhost:2181
curl: (52) Empty reply from server
root@mykafka-zookeeper-0:/# curl mykafka-kafka:9092
curl: (56) Recv failure: Connection reset by peer
root@mykafka-zookeeper-0:/# curl -v mykafka-zookeeper:2181
* Rebuilt URL to: mykafka-zookeeper:2181/
*   Trying 10.109.43.48...
^C
> kubectl exec -it mykafka-kafka-0 -- /bin/bash
root@mykafka-kafka-0:/# curl mykafka-zookeeper:2181
curl: (52) Empty reply from server
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

有人能解释一下为什么使用I只能从服务外部连接到一个Kubernetes服务,而不能从服务内部连接到它吗?

共有1个答案

谷翰飞
2023-03-14

我相信您正在经历的问题可以通过查看您的kubelet是如何设置运行的来解决。在启动kubelet时,您可以切换一个名为--hairpin-mode的设置。默认情况下,此设置被设置为字符串混杂,其中pod不能连接到它自己的服务,但您可以将其更改为hairpin-veth,这将允许pod连接到它自己的服务。

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

 类似资料:
  • 我试图在我本地minikube集群上的一个简单示例中使用fabric8io/kubernetes-client,在这里我获得了一个pod的IP 是完成执行的pod的名称,如果执行则可见。 是一个kubernetes API主机,我从中获得该主机。 MiniKube只有1个节点。 Fabric8IO/Kubernetes-客户端版本为4.9.1 Java 11 我将此代码作为作业部署在的同一集群上。

  • 我刚刚在我的桌面上安装了带有minkube的库伯内特斯(运行Ubuntu 18.10),然后尝试使用Helm在桌面机器上安装Postgresql。 安装头盔后,我做到了: 成功完成后,我转发了postgres端口: 然后我用psql——主机127.0.0.1——U postgres从我的桌面本地连接到它,成功了。 我试图从笔记本电脑连接到postgres,但失败原因如下: 为了确保我的桌面确实在监

  • 我有一个Google Cloud SQL第二代实例和一个Google Kubernetes引擎集群。问题是我不能用私有IP连接到云SQL。我在云SQL仪表板中启用了私有IP,并将其分配给我的VPC网络。但是,容器仍然无法连接。 这可能与对等路线有关吗?我需要创建一个吗? 我遵循本指南 https://cloud.google.com/sql/docs/mysql/connect-kubernete

  • 我按照这里给出的步骤从外部Jenkins实例连接到openshift在线代理。然而,当我提供OpenShift凭据时,即使我似乎拥有正确的凭据,登录也无法通过。消息“无法请求https://openshift.redhat.com/broker/rest/domains:OpenShift Online(下一代)开发者预览版在这里!我们不会接受OpenShift Online(v2)平台上的新用户

  • 我在我的Windows10电脑(Ubuntu18.04)上安装了Windows子系统Linux。我在Windows上安装了Docker toolbox,通过虚拟机运行,我可以通过以下设置正常运行Docker命令: 我可以很好地访问它并正确安装/运行docker容器。其中一个服务是运行在localhost:8084上的Kafka Connect容器,如果是从我的Windows创建的。如果我直接从Ub

  • 我对kubernetes相当陌生,我正试图在MacBook上使用minikube来编排我的rails应用程序。我的应用程序包括MySQL、Redis和Sidekiq。我在独立的豆荚里运行webapp、sidekiq、redis和数据库。Sidekiq吊舱没有连接到redis吊舱。 sidekiq吊舱的库贝特尔日志是这样说的: 我的webapp.yaml webapp-service.yaml Si