docker - 如何访问以全局模式部署的 Docker Swarm 中的服务
问题描述
我不明白如何 ping 在以全局模式部署的 Docker Swarm 中运行的服务。假设我的 Swarm 集群中有 2 个节点(示例如下)。我在全局模式下部署了一些服务,所以 2 个实例在自己的节点上运行。两个服务都公开相同的端口,如下例所示。
version: '3.7'
services:
cadvisor:
image: google/cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- 8080:8080
networks:
- monitor-net
deploy:
mode: global
restart_policy:
condition: on-failure
networks:
monitor-net:
我在同一网络上运行另一个容器,并尝试 ping 服务。Docker 可以通过服务名称解析服务:
root@bdc091e9f4d1:/# ping cadvisor
PING cadvisor (10.0.16.165) 56(84) bytes of data.
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=3 ttl=64 time=0.044 ms
但它只是选择其中一项服务。如何从每个节点到达一个?我尝试使用主机名
services:
cadvisor:
image: google/cadvisor
hostname: "{{.Node.Hostname}}.{{.Service.Name}}"
它hostname
按预期设置。docker container inspect ...
"Config": {
"Hostname": "node01.mon_cadvisor",
"Domainname": "",
"User": "",
"AttachStdin": false,
如果我 ping node01.mon_cadvisor
,Docker 似乎无法通过其解析服务的地址hostanme
那么该怎么做呢?
解决方案
您观察到的不仅限于全局模式部署。已部署的服务将默认使用deploy.endpoint_mode: vip。
在endpoint_mode: vip服务将使用虚拟 ip。服务名称将解析为虚拟 ip 的 ip。vip 负责平衡容器的流量。
您的“ping测试”中唯一错误的是期望。如果您将默认的 vip 行为考虑在内,那么您为什么会观察到您所观察到的东西是有道理的。
如果您使用endpoint_mode 部署服务:dnsrr名称解析将以循环模式返回容器 ips。即使您坚持使用endpoint_mode: vip ,您也可以通过与tasks.{servicename}而不是 servicename进行通信来强制 dnsrr 行为......在您的情况下,这将是tasks.cadvisor。
推荐阅读
- python - 是否有必要按照定义来装饰类方法?
- android - Android Management API 如何识别已注册的设备
- java - 用休眠5保存vividsolutions.jts.geom.Polygonal属性
- sql-server - 如何诊断和修复“格式查询错误,可能参数无效,语法不正确”错误?
- python - 我可以以编程方式参数化 pytest 夹具的返回值吗?
- python - 项目模块的预提交 pylint 因“E0401:无法导入”而失败
- docker - 如何在 Minikube 中访问 docker-compose 容器
- c++ - 如何在没有 X 服务器或显示的情况下访问 INTEL_performance_query OpenGL 扩展?
- bash - Heroku 没有将正确的参数传递给 Docker 的入口点
- java - 类的返回类型返回什么?