【问题标题】:How to access the service deployed on one pod via another pod in Kubernetes?如何通过 Kubernetes 中的另一个 pod 访问部署在一个 pod 上的服务?
【发布时间】:2019-04-23 16:17:58
【问题描述】:

谁能告诉我如何通过 kubernetes 集群中的另一个 pod 访问部署在一个 pod 上的服务?

例子:

有一个 nginx 服务部署在 Node1 上(pod 名称为 nginx-12345)和另一个服务部署在 Node2 上(pod 名称为 service-23456)。现在如果'service'出于某种原因想要与'nginx'通信,那么我们如何访问'service-23456' pod中的'nginx'?

【问题讨论】:

  • 您没有正确解释自己。什么是您的“服务”? Kubernetes 默认采用平面网络,因此所有 pod 和节点都可以相互通信,无论它们的命名空间如何。
  • 我的意思是任何随机服务。服务只是访问部署的一种机制。以下部分中的 cmets 清楚地描述了该问题。我想知道的是,如果 nginx 之类的任何服务部署在一个 pod(比如 pod 1)上,而另一个名为 eureka 的服务部署在第二个 pod(比如 pod 2)上,那么我们如何从 pod 2 访问 nginx?我可以访问主服务器中的服务,但无法访问相应的 Pod。
  • 好的。所以,正如我所说,k8s 网络是扁平的,所以你应该能够从一个 pod 到另一个 pod。你是如何创建集群的?如果您关注了任何文档,您可以在这里粘贴吗?
  • 嗨,Suren,我点击了这个链接----howtoforge.com/tutorial/centos-kubernetes-docker-cluster

标签: docker kubernetes kubectl kubelet


【解决方案1】:

在 Kubernetes 中有多种访问服务的方式,您可以通过 NodePort 或 LoadBalancer 公开您的服务并在集群外访问它。

how to access the services的官方文档。

Kubernetes 官方文档指出:

某些集群可能允许您通过 ssh 连接到集群中的某个节点。从那里您可以访问集群服务。这是一种非标准方法,适用于某些集群,但不适用于其他集群。可能会或可能不会安装浏览器和其他工具。集群 DNS 可能无法正常工作。

因此,直接从其他节点访问服务取决于您使用的 Kubernetes 集群类型。

编辑:

在您的集群中部署该服务后,您应该能够使用该服务的名称联系该服务,Kube-DNS 将使用正确的ClusterIP 回答您的最终 pod。 ClusterIP 由 kube-proxy 在 Worker 上创建的 IPTables 规则管理,这些规则将您的请求 NAT 到最终容器的 IP。

Kube-DNS 命名约定为service.namespace.svc.cluster-domain.tld,默认集群域为cluster.local

例如,如果您想从任何命名空间联系db 命名空间中名为mysql 的服务,您只需与mysql.db.svc.cluster.local 交谈即可。

如果这不起作用,则集群中的 kube-dns 可能存在一些问题。 希望这可以帮助。

编辑2: ubuntu 的 dns 解析存在一些已知问题,Kubernetes 官方文档指出

某些 Linux 发行版(例如 Ubuntu)默认使用本地 DNS 解析器(systemd-resolved)。 Systemd-resolved 将 /etc/resolv.conf 移动并替换为存根文件,该存根文件在解析上游服务器中的名称时可能导致致命的转发循环。这可以通过使用 kubelet 的 --resolv-conf 标志指向正确的 resolv.conf 来手动修复(使用 systemd-resolved,这是 /run/systemd/resolve/resolv.conf)。 kubeadm 1.11 自动检测 systemd-resolved,并相应地调整 kubelet 标志。

【讨论】:

  • 嗨,Praful,如果我的问题不清楚,对不起。我已经重新构建了这个问题。我实际上想通过另一个 pod 访问托管在一个 pod 中的服务。有什么办法可以做到吗?我在这里使用法兰绒网络。
  • 您好,Praful,您对 DNS 约定是正确的。我已经在其中一个 pod 上部署了“eureka”,并且从主服务器上,我能够进行 nslookup 和查询 DNS,并将结果作为“eureka-server.default.svc.cluster.local”的集群 IP 返回。我以“nslookup eureka-server.default.svc.cluster.local 10.96.0.10”的形式触发了命令,但是当我从任何 pod 触发相同的命令时,它返回“无法解析主机;虽然 Pod 的名称服务器也设置为 10.96.0.10 。
  • 嗨 Aditya,以下是调试 dns 分辨率的指南,请您检查一下是否一切正常:kubernetes.io/docs/tasks/administer-cluster/…
  • 嗨,Praful,我检查了这篇文章,发现一切正常。我能够看到 DNS 日志,但前提是我从主服务器运行 DNS 查询。当我从相应的 pod 执行 nslookup 时,它无法连接,相应地也没有生成 DNS 日志。我认为 pod 没有引用 '/etc/resolv.conf' 文件。
  • 我的主服务器是 CentOS7,我的两个 pod 都是 Ubuntu 系统。我认为 Ubuntu 可能存在问题。
【解决方案2】:

您是否将您的部署公开为服务?如果是这样,只需通过它的 dns 名称访问它,例如 http://nginx-1234 - 或者如果它位于不同的命名空间中:http://nginx-1234.default.svc(将“默认”更改为服务所在的命名空间)或 http://nginx-1234.default.svc.cluster.local

现在,如果您没有公开服务,那么您可能应该公开。您无需将其暴露给外界,只需不定义服务类型,它只会在您的集群内部可用。

如果由于某种原因你不想暴露一个服务(想不出任何理由),你可以向 api server 查询 pod IP。您需要提供一个令牌进行身份验证,但这些都在 pod 内可用:

获取令牌:

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

调用api服务器:

curl https://kubernetes.default.svc/api/v1/namespaces/default/pods--silent \
     --header "Authorization: Bearer $TOKEN" --insecure

您可以通过添加 ?fieldSelector=spec.nodeName%3Dtargetnodename 或类似名称(只需使用 json 路径)来优化您的查询。可以使用 https://stedolan.github.io/jq/ 或任何其他 JSON 实用程序解析输出。

【讨论】:

  • 嗨,Markus,我将我的部署公开为一项服务,为此我使用了 NodePort。我在其中一个节点上部署了 eureka,当我使用 '10.96.0.10' 作为名称服务器从主服务器执行 nslookup 时,它返回正确的结果作为完整的 FQDN 名称。但是,当我从任何 pod 触发 nslookup 命令时,它显示为“无法解析主机”,尽管 pod 的“/etc/resolve.conf”文件将“10.96.0.10”显示为名称服务器。
  • 我不了解 eureka,但通常您不必更改 /etc/resolve.conf 即可在集群中的服务之间进行通信。
【解决方案3】:

这里回答了类似的问题: Kubernetes - How to acces to service from a web server in pod with a rest request

只需将“ProductWebApp”替换为“nginx”,将“DashboardWebApp”替换为“service”即可。

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,以下链接可能会解决您的问题。通常,集群中的所有服务都是可见和可访问的。将您的 service-23456 服务公开到键入 ClusterIP 和端口 8080。 然后你可以从 nginx 服务调用端点'http://service-23456:8080'。

    Unable to communicate between 2 node,js apps in Istio enabled GKE cluster

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2020-05-19
      • 1970-01-01
      • 2023-04-03
      • 2021-01-23
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多