Вопрос или проблема
У меня keepalived запущен на 3 хостах.
Я хочу перемещать VIP в зависимости от того, где запущен мой контейнер traefik docker.
Поэтому я проверяю, где контейнер запущен, скриптом на всех 3 хостах.
Когда я выполняю скрипт вручную в оболочке,
2 хоста возвращают 1 (контейнер не найден),
1 хост возвращает 0 (контейнер найден).
Так что, думаю, скрипты работают нормально.
Но keepalived всегда сообщает, что скрипты выполнены успешно на всех 3 хостах. Так что переключение MASTER/BACKUP не работает.
Есть ли идеи, что я делаю не так?
Вот мои файлы:
/etc/keepalived/keepalived.conf (host1)
global_defs {
script_user nobody
enable_script_security
}
vrrp_script chk_avail {
script "/etc/keepalived/healthcheck.sh"
interval 1
weight 10
rise 2
fall 2
}
vrrp_instance swarm.vip {
interface enp6s18
state MASTER
virtual_router_id 50
priority 100
advert_int 1
unicast_src_ip 10.10.10.51
unicast_peer {
10.10.10.52
10.10.10.53
}
virtual_ipaddress {
10.10.10.50 dev enp6s18
}
track_script {
chk_avail
}
}
/etc/keepalived/keepalived.conf (host2)
global_defs {
script_user nobody
enable_script_security
}
vrrp_script chk_avail {
script "/etc/keepalived/healthcheck.sh"
interval 1
weight 10
rise 2
fall 2
}
vrrp_instance swarm.vip {
interface enp6s18
state BACKUP
virtual_router_id 50
priority 99
advert_int 1
unicast_src_ip 10.10.10.52
unicast_peer {
10.10.10.51
10.10.10.53
}
virtual_ipaddress {
10.10.10.50 dev enp6s18
}
track_script {
chk_avail
}
}
/etc/keepalived/keepalived.conf (host3)
global_defs {
script_user nobody
enable_script_security
}
vrrp_script chk_avail {
script "/etc/keepalived/healthcheck.sh"
interval 1
weight 10
rise 2
fall 2
}
vrrp_instance swarm.vip {
interface enp6s18
state BACKUP
virtual_router_id 50
priority 98
advert_int 1
unicast_src_ip 10.10.10.53
unicast_peer {
10.10.10.51
10.10.10.52
}
virtual_ipaddress {
10.10.10.50 dev enp6s18
}
track_script {
chk_avail
}
}
/etc/keepalived/healthcheck.sh
#!/bin/sh
# команда docker для проверки, запущен ли контейнер traefik на этом хосте
var=`docker ps |grep traefik:`
# проверка, если строка вывода не нулевой длины
if [ -n "$var" ]; then
# вернуть 0, если контейнер успешно найден
echo 0
else
# вернуть 1, если контейнер не найден на хосте
echo 1
fi
Ответ или решение
У вас возникла проблема с Keepalived и vrrp_script на трех хостах, и вы ищете решение для корректного переключения состояния MASTER/BACKUP в зависимости от запущенного контейнера Traefik. Давайте рассмотрим возможные причины и решения этой проблемы.
Анализ проблемы
Ваш сценарий, healthcheck.sh
, находит контейнер Traefik и возвращает статус 0, если он обнаружен, и 1, если нет. Вы подтвердили, что это работает при ручном выполнении. Однако Keepalived всегда считает, что сценарий выполняется успешно на всех трех хостах, вне зависимости от результатов проверки. Это указывает на возможные ошибки в конфигурации Keepalived или сценарии.
Возможные причины и решения
-
Корректность сценария healthcheck:
- Ваш сценарий использует
echo
для вывода 0 или 1, но Keepalived ожидает, что сценарий завершится с кодом возврата, а не просто напечатает это значение. -
Измените последнюю строку сценария, чтобы он завершался с соответствующим кодом возврата:
#!/bin/sh # docker command to check if traefik container is running on this host var=`docker ps |grep traefik:` # check if output string is not zero length if [ -n "$var" ]; then # return 0 for successfully found the container exit 0 else # return 1 for not finding the container running on the host exit 1 fi
- Ваш сценарий использует
-
Права на выполнение сценарием:
- Проверьте, что у сценария установлены правильные права на выполнение. Выполните команду
chmod +x /etc/keepalived/healthcheck.sh
на всех хостах.
- Проверьте, что у сценария установлены правильные права на выполнение. Выполните команду
-
Проверка окружения:
- Убедитесь, что Keepalived работает от имени пользователя, который имеет право запускать команду Docker. Это может потребовать добавления пользователя в группу
docker
.
- Убедитесь, что Keepalived работает от имени пользователя, который имеет право запускать команду Docker. Это может потребовать добавления пользователя в группу
-
Журналирование ошибок:
- Проверьте журналы Keepalived, чтобы увидеть результаты выполнения сценария. Используйте
journalctl -u keepalived
или проверьте/var/log/syslog
в зависимости от вашей системы, чтобы получить больше информации о возможных ошибках.
- Проверьте журналы Keepalived, чтобы увидеть результаты выполнения сценария. Используйте
-
Конфигурация keepalived.conf:
- Убедитесь, что в конфигурации всех трех хостов правильно указаны
unicast_peer
иunicast_src_ip
. Ошибка в IP-адресах может привести к неправильной работе протокола VRRP.
- Убедитесь, что в конфигурации всех трех хостов правильно указаны
Заключение
Следуя предложенным шагам, вы сможете устранить проблему неработающего vrrp_script в Keepalived. Если проблема не будет устранена, рассмотрите возможность использования других средств мониторинга и автоматизации, таких как consul
, в сочетании с Keepalived, для более сложных сценариев контейнерной оркестрации.