keepalived vrrp_script не работает

Вопрос или проблема

У меня 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 или сценарии.

Возможные причины и решения

  1. Корректность сценария 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
  2. Права на выполнение сценарием:

    • Проверьте, что у сценария установлены правильные права на выполнение. Выполните команду chmod +x /etc/keepalived/healthcheck.sh на всех хостах.
  3. Проверка окружения:

    • Убедитесь, что Keepalived работает от имени пользователя, который имеет право запускать команду Docker. Это может потребовать добавления пользователя в группу docker.
  4. Журналирование ошибок:

    • Проверьте журналы Keepalived, чтобы увидеть результаты выполнения сценария. Используйте journalctl -u keepalived или проверьте /var/log/syslog в зависимости от вашей системы, чтобы получить больше информации о возможных ошибках.
  5. Конфигурация keepalived.conf:

    • Убедитесь, что в конфигурации всех трех хостов правильно указаны unicast_peer и unicast_src_ip. Ошибка в IP-адресах может привести к неправильной работе протокола VRRP.

Заключение

Следуя предложенным шагам, вы сможете устранить проблему неработающего vrrp_script в Keepalived. Если проблема не будет устранена, рассмотрите возможность использования других средств мониторинга и автоматизации, таких как consul, в сочетании с Keepalived, для более сложных сценариев контейнерной оркестрации.

Оцените материал
Добавить комментарий

Капча загружается...