Как узнать, работает ли балансировка нагрузки в Docker Swarm? - PullRequest
0 голосов
/ 04 мая 2018

Я создал службу с именем 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

1 Ответ

0 голосов
/ 05 мая 2018

Несколько вещей:

  • Ваши результаты в норме. По умолчанию служба Swarm имеет VIP (виртуальный IP-адрес) перед задачами службы, чтобы действовать в качестве балансировщика нагрузки. Попытка получить доступ к этому сервису из виртуальной сети покажет только этот IP.
  • Если вы хотите использовать циклический подход и пропустить VIP, вы можете создать службу с --endpoint-mode=dnsrr, которая затем будет возвращать другую задачу службы для каждого запроса DNS (но ваш клиент может кэшировать имена DNS, вызывая чтобы показать тот же IP, поэтому VIP обычно лучше).
  • Если вы хотите получить список IP-адресов для реплик задач, выполните dig tasks.<servicename> внутри сети службы.
  • Если вы хотите протестировать что-нибудь простое, попросите ваш сервис создать случайную строку или использовать имя хоста при запуске и вернуть его, чтобы вы могли указать различные реплики при доступе. Простой пример - запустить один сервис с использованием образа elasticsearch:2, который вернет JSON на порт 9200 с другим случайным именем для контейнера.
...