繁体   English   中英

如何通过 Kubernetes 中的另一个 pod 访问部署在一个 pod 上的服务?

[英]How to access the service deployed on one pod via another pod in Kubernetes?

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

例子:

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

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

请参阅有关如何访问服务的官方文档。

Kubernetes官方文件指出:

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

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

编辑:

在群集中部署服务后,您应该能够使用其名称联系该服务, Kube-DNS将使用正确的ClusterIP进行回答,以便与最终的pod进行通信。 ClusterIP由在工作站上由kube-proxy创建的IPTables规则管理,这些规则将您对最终容器的IP请求NAT。

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标志。

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

无法在启用了 Istio 的 GKE 集群中的 2 个节点、js 应用程序之间进行通信<\/a>

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

现在,如果您没有公开服务,那么您可能应该这样做。 您不需要将它暴露给外部世界,只是不要定义服务类型,它只能在您的集群中使用。

如果由于某种原因您不想公开服务(无法想到任何原因),您可以在api服务器中查询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实用程序进行解析。

这里回答了Simlar问题: Kubernetes - 如何通过休息请求从pod中的Web服务器访问服务

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM