docker - 如何通过 Kubernetes 中的另一个 pod 访问部署在一个 pod 上的服务?
问题描述
谁能让我知道我们如何通过 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。ClusterIPs 由 kube-proxy 在 Workers 上创建的 IPTables 规则管理,这些规则将您的请求 NAT 到最终容器的 IP。
Kube-DNS 命名约定是service.namespace.svc.cluster-domain.tld
,默认集群域是cluster.local
.
例如,如果您想从任何命名空间联系mysql
在db
命名空间中调用的服务,您可以简单地与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 标志。
推荐阅读
- r - 通过按文件权重对目录和子目录进行排序,在 R 中生成文件树
- sql - 我需要将我的 SQL 语句转换为 linq 我尝试使用 Linqer 但这没有任何魔力
- google-apps-script - 谷歌应用脚本:LockService 不起作用
- python - Python Pandas 在 csv 文件警告消息中添加新列
- python - 如何为python中的错误、警告制作单独的日志文件?
- c# - 如何在 nunit 多个测试程序集执行之间保持静态
- html - angular2-notifications 的自定义模板
- trace32 - Trace32 - sys.gtl 上的命令锁定
- php - 在 null 上调用成员函数 get() - LARAVEL
- google-sheets - 在 Google 表格中将文本转换为数字