Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道负载平衡在Docker Swarm中是否有效?_Docker_Go_Load Balancing_Docker Swarm - Fatal编程技术网

如何知道负载平衡在Docker Swarm中是否有效?

如何知道负载平衡在Docker Swarm中是否有效?,docker,go,load-balancing,docker-swarm,Docker,Go,Load Balancing,Docker Swarm,我创建了一个名为accountservice的服务,并在之后复制了3次。在我的服务中,我获取生成服务实例的IP地址,并将其填充到JSON响应中。问题是每次我运行curl$manager ip:6767/accounts/10000返回的ip与以前一样(我尝试了100次) 管理器ip环境变量: set -x manager-ip (docker-machine ip swarm-manager-1) 这是我的Dockerfile: FROM iron/base EXPOSE 6767 ADD

我创建了一个名为
accountservice
的服务,并在之后复制了3次。在我的服务中,我获取生成服务实例的IP地址,并将其填充到JSON响应中。问题是每次我运行curl
$manager ip:6767/accounts/10000
返回的ip与以前一样(我尝试了100次)

管理器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列表,请在服务网络内执行
    挖掘任务。
  • 如果您想测试一些简单的内容,请让您的服务创建一个随机字符串,或者在启动时使用主机名并返回该字符串,以便您在访问时可以区分不同的副本。一个简单的例子是使用image
    elasticsearch:2运行一个服务,该服务将在端口9200上以每个容器不同的随机名称返回JSON