docker - 如何知道负载平衡在 Docker Swarm 中是否有效?
问题描述
我创建了一个名为的服务accountservice
并在之后复制了 3 次。在我的服务中,我获取生产服务实例的 IP 地址并将其填充到 JSON 响应中。问题是每次我运行 curl$manager-ip:6767/accounts/10000
返回的 IP 都和以前一样(我试了 100 次)
manager-ip
环境变量:
set -x manager-ip (docker-machine ip swarm-manager-1)
这是我的 Dockerfile:
FROM iron/base
EXPOSE 6767
ADD accountservice-linux-amd64 /
ADD healthchecker-linux-amd64 /
HEALTHCHECK --interval=3s --timeout=3s CMD ["./healthchecker-linux-amd64", "-port=6767"] || exit 1
ENTRYPOINT ["./accountservice-linux-amd64"]
这是我构建和运行服务的自动化脚本:
#!/usr/bin/env fish
set -x GOOS linux
set -x CGO_ENABLED 0
set -x GOBIN ""
eval (docker-machine env swarm-manager-1)
go get
go build -o accountservice-linux-amd64 .
pushd ./healthchecker
go get
go build -o ../healthchecker-linux-amd64 .
popd
docker build -t azbshiri/accountservice .
docker service rm accountservice
docker service create \
--name accountservice \
--network my_network \
--replicas=1 \
-p 6767:6767 \
-p 6767:6767/udp \
azbshiri/accountservice
这是我调用来获取 IP 的函数:
package common
import "net"
func GetIP() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return "error"
}
for _, addr := range addrs {
ipnet, ok := addr.(*net.IPNet)
if ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
}
panic("Unable to determine local IP address (non loopback). Exiting.")
}
我使用以下命令扩展服务:
docker service scale accountservice=3
解决方案
一些东西:
- 你的结果是正常的。默认情况下,一个 Swarm 服务在服务任务前面有一个 VIP(虚拟 IP)来充当负载均衡器。尝试从虚拟网络内部访问该服务只会显示该 IP。
- 如果您想使用循环方法并跳过 VIP,您可以创建一个服务
--endpoint-mode=dnsrr
,然后为每个 DNS 请求返回不同的服务任务(但您的客户端可能正在缓存 DNS 名称,导致显示相同的 IP ,这就是为什么 VIP 通常更好)。 - 如果您想获取任务副本的 IP 列表,请
dig tasks.<servicename>
在服务网络内部执行。 - 如果你想测试一些简单的东西,让你的服务创建一个随机字符串,或者在启动时使用主机名并返回,这样你就可以在访问时告诉不同的副本。一个简单的示例是使用图像运行一项服务
elasticsearch:2
,该服务将在端口 9200 上返回 JSON,每个容器具有不同的随机名称。
推荐阅读
- e-commerce - Jamstack 电子商务堆栈建议
- python - 将更新部署到 AWS 后丢失用户保存的图像文件
- java - 由于 MultiReleaseException,jdeps 无法打印模块deps
- python - 如何获得每一层的重量
- methods - 无法为签名“data.frame”、“character”找到函数“writeRaster”的继承方法
- python - For循环遍历两个列表python
- java - 尝试创建临时分支以变基后出现 git 合并错误
- vb.net - 无法解码串口数据
- python - 我需要制作一个接受数字 0-9 和 Az 大小写的程序。如果输入不正确,如何使代码抛出错误
- python - 我不明白 需要 asyncio.Future、协程或 awaitable