有人能告诉我如何通过kubernetes集群中的另一个pod访问部署在一个pod上的服务吗?
示例:
有一个nginx服务部署在Node1上(pod名称为nginx-1245(,还有一个服务部署在Node 2上(pod名为service-23456(。现在,如果"服务"出于某种原因想要与"nginx"通信,那么我们如何访问"服务-23456"吊舱内的"nginx"?
kubernetes中有多种访问服务的方式,您可以通过NodePort或LoadBalancer公开您的服务,并在集群外访问它。
请参阅有关如何访问服务的官方文档。
Kubernetes官方文件指出:
某些集群可能允许您通过ssh连接到集群中的某个节点。从那里您可以访问群集服务。这是一种非标准的方法,对某些集群有效,但对其他集群无效。浏览器和其他工具可能已安装,也可能未安装。群集DNS可能无法工作。
因此,直接从其他节点访问服务取决于您使用的Kubernetes集群的类型。
编辑:
一旦服务部署在集群中,您应该能够使用其名称联系该服务,Kube-DNS
将用正确的ClusterIP
回答,以便与您的最终pod对话。ClusterIP由kube代理在Workers上创建的IPTables规则管理,Workers将您的请求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.onf手动修复(如果已解析systemd,则为/run/systemd/resolve/resolv.conf(。kubeadm 1.11会自动检测已解析的systemd,并相应地调整kubelet标志。
您是否将部署作为服务公开?如果是这样,只需通过它的dns名称访问它,比如http://nginx-1234-或者如果它在不同的命名空间中:http://nginx-1234.default.svc(将"default"更改为服务所在的命名空间(或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实用程序。
我遇到了类似的问题,下面的链接可能会解决您的问题。通常,所有服务在集群中都是可见和可访问的。将service-23456
服务暴露为ClusterIP类型和8080端口。然后您可以调用端点'http://service-23456:8080'来自nginx服务。
无法在2个节点之间通信,Istio中的js应用程序启用了GKE集群
Simlar问题在这里得到了回答:Kubernetes-如何通过休息请求从pod中的web服务器访问服务
只需将"ProductWebApp"替换为"nginx",将"DashboardWebApp"更改为"service"即可。