首页 > 解决方案 > 如何通过 Kubernetes 中的另一个 pod 访问部署在一个 pod 上的服务?

问题描述

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

例子:

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

标签: dockerkuberneteskubectlkubelet

解决方案


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

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

Kubernetes 官方文档指出:

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

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

编辑:

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

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

例如,如果您想从任何命名空间联系mysqldb命名空间中调用的服务,您可以简单地与mysql.db.svc.cluster.local.

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

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


推荐阅读