10.4.2. CLI

Описание

Health Monitoring необходим для проверки доступности серверов (Workers). С учетом настроек каждого health checker Вы можете создать гибкие правила проверок серверов для оперативного их выведения из балансировки и обратного включения.

Кроме стандартных режимов работы есть возможность создания собственных скриптов проверки.

Для проверки доступности серверов используются следующие режимы:

TCP

Проверка доступности осуществляется путем установления TCP-соединения между балансировщиком и сервером (Worker). Проверка считается пройденной, если: 1. Балансировщик отправляет SYN указанному серверу, 2. Балансировщик получает ACK от указанного сервера.

UDP

Проверка доступности осуществляется с помощью отправки UDP-запроса на IP:port сервера. Проверка считается пройденной, если health checker получил успешный ответ, либо не получил ничего. Если получена ошибка, то Worker выводится из балансировки.

ICMP

Проверка доступности Worker осуществляется с помощью ICMP echo request. Проверка считается пройденной, если балансировщиком получен ICMP-reply от Worker.

HTTP

Проверка доступности осуществляется с помощью HTTP-запроса к серверу. При этом в качестве параметров можно указать:

  • код ответа сервера

  • тело HTTP-ответа

  • название хоста

  • порт хоста

  • метод HTTP-запроса

  • путь запроса

HTTPS

Проверка доступности осуществляется с помощью HTTPS-запроса. К вышеуказанным параметрам добавляются:

  • цепочка сертификатов

  • сертификат

  • возможность отключения проверки использования самоподписанных сертификатов

Script

Проверка доступности осуществляется с помощью пользовательских скриптов

DNS

Проверка доступности осуществляется с помощью DNS-запросов (по UDP или TCP) к DNS-серверу

Compound

Проверка доступности осуществляется с помощью последовательной проверки Health Monitor из выбранного списка. При этом есть два режима:

  • And — проверка должна быть успешной у всех Health Monitor из списка

  • Or — проверка должна быть успешной хотя бы у одного Health Monitor из списка

Настройка

vlb health-monitor NAME type <icmp|tcp|udp|http|https|script|dns|compound>

Создать health-checker в одном из режимов проверки.

no service health-monitor enable

Отключить сервис Health Monitor. По умолчанию он включен и данная команда не отображается в конфигурации.

Для каждого режима есть свои команды настройки Health Monitor.

Данные команды являются общими для всех режимов:

interval (1-300)

Интервал (в секундах) между попытками проверки. По умолчанию 5 секунд.

timeout (2-60)

Время ожидания ответа от Worker в секундах. По умолчанию 5 секунд.

up-retries (1-10)

Количество успешных проверок, после которых Worker считается доступным. По умолчанию 1.

down-retries (1-10)

Количество неуспешных проверок, после которых Worker считается недоступным. По умолчанию 2.

HTTP

http {expect-code (100-599)|expect-body BODY|host HOST|port (0-65535)|request-method <get|post|head>|path PATH}

Создать метод проверки по следующим параметрам:

Ключ

Параметр

Описание

expect-code

(100-599)

Код, который мы ожидаем в ответе от сервера. По умолчанию 200. Со списком кодов можно ознакомиться в RFC 7231#6.1

expect-body

BODY

Тело HTTP-ответа, который мы ожидаем от сервера в кодировке Base64. Например, если мы ожидаем ответ <html><body><h1>Server1</h1></body></html>, то конвертировать необходимо всю эту строчку PGh0bWw+PGJvZHk+PGgxPlNlcnZlcjE8L2gxPjwvYm9keT48L2h0bWw+

host

HOST

Название хоста в HTTP-заголовке. Например, trafficsoft.ru

port

(0-65535)

Порт хоста в HTTP-заголовке

request-method

<get|post|head>

Метод HTTP-запроса согласно RFC 7231#4.3. Доступны методы GET, POST и HEAD

path

PATH

Путь. По умолчанию /. Можно опрашивать не только главную страницу WEB-сервера, но какой-то конкретный URL. Например, /checker/check.html

http expect-body import-terminal

Задать тело HTTP-ответа, который мы ожидаем от сервера, через терминал. После нажатия Enter система попросит ввести текст, далее еще раз для потверждения. Перекодировать текст в Base64 не нужно, он будет перекодирован автоматически.

http authentication username NAME [password PASSWORD|password encoded PASSWORD]

Задать логин и пароль в случае, если осуществляется проверка страницы, требующей авторизации.

HTTPS

https {expect-code (100-599)|expect-body BODY|host HOST|port (0-65535)|request-method <get|post|head>|path PATH|ca-certificate NAME|certificate NAME|disable-security-check}

Создать метод проверки по следующим параметрам:

Ключ

Параметр

Описание

expect-code

(100-599)

Код, который мы ожидаем в ответе от сервера. По умолчанию 200. Со списком кодов можно ознакомиться в RFC 7231#6.1

expect-body

BODY

Тело HTTP-ответа, который мы ожидаем от сервера в кодировке Base64. Например, если мы ожидаем ответ <html><body><h1>Server1</h1></body></html>, то конвертировать необходимо всю эту строчку PGh0bWw+PGJvZHk+PGgxPlNlcnZlcjE8L2gxPjwvYm9keT48L2h0bWw+

host

HOST

Название хоста в HTTP-заголовке. Например, trafficsoft.ru

port

(0-65535)

Порт хоста в HTTP-заголовке

request-method

<get|post|head>

Метод HTTP-запроса согласно RFC 7231#4.3. Доступны методы GET, POST и HEAD

path

PATH

Путь. По умолчанию /. Можно опрашивать не только главную страницу WEB-сервера, но какой-то конкретный URL. Например, /checker/check.html

ca-certificate

NAME

Цепочка сертификатов, используемых для проверки доступности сервера по HTTPS. Цепочка сертификатов создается в разделе CLI

certificate

NAME

Сертификат, используемый для проверки доступности сервера по HTTPS. Сертификат создается в разделе CLI

disable-security-check

Отключить проверку на использование самоподписанных сертификатов

https expect-body import-terminal

Задает тело HTTP-ответа, который мы ожидаем от сервера, через терминал. После нажатия Enter система попросит ввести текст, далее еще раз для потверждения. Перекодировать текст в Base64 не нужно, он будет перекодирован автоматически.

https authentication username NAME [password PASSWORD|password encoded PASSWORD]

Задает логин и пароль в случае, если проверка осуществляется страницы, требующей авторизации.

Script

script {type <python|shell>|value VALUE}

Создает метод проверки на основе пользовательского скрипта написанного на Python или Shell. В качестве значения указывается текст в кодировке Base64.

script import file NAME

Позволяет загрузить пользовательский скрипт из файла. В качестве пути необходимо указывать домашнюю директорию пользователя, например, /home/admin/.

Реализация этого режима Health Monitor представляет собой шаблон уже готового скрипта, в который при создании Worker (сервера) добавляется пользовательская часть скрипта, а также атрибуты конкретного сервера в качестве констант:

  • TG - Target-группа

  • IP - IP-адрес сервера

  • PORT - Порт сервера

  • INTERVAL - Интервал (в секундах) между попытками проверки

  • TIMEOUT - Время ожидания ответа от Worker в секундах

Константы могут использоваться в пользовательской части скрипта.

Custom script health check позволяет запускать скрипты двух типов:

  • Python script

  • Shell script

От пользователя требуется написать часть скрипта, которая далее будет выполняться в бесконечном цикле.

Скрипт может быть написан для работы в двух режимах:

Успех/неуспех проверки воркера

Пользователю не требуется реализовывать часть с логикой по изменению статуса Worker и реакцию на срабатывание пороговых значений. Эта логика остается на стороне подсистемы Health Monitoring.

Пользователю необходимо в своем скрипте написать функцию (имя функции может быть любым), которая будет возвращать несколько возможных значений, которые указывают на состояние сервера:

  • -1 - успешная проверка;

  • -2 - неуспешная проверка;

  • Любое другое отрицательное значение, либо буквенные символы - ошибка в ходе запуска проверки.

Пример Script code на python

from subprocess import DEVNULL, STDOUT, check_call

def userscript() -> int:
  response = check_call(["ping" + f" -c 1 -W {TIMEOUT} {IP}"], shell=True, stdout=DEVNULL, stderr=STDOUT)
  if response == 0:
      return -1
  return -2

Пример Script code на shell

userscript() {
    if ping -c 1 -i $TIMEOUT $IP &> /dev/null
    then
        status=-1
    else
        status=-2
    fi
    echo $status
}

Возврат веса Worker

В скрипте должен возвращаться вес Worker, который должен быть подсчитан самостоятельно, либо получен из внешнего источника (например, от Worker). Возвращаемое значение должно равняться весу Worker. Вес 0 означает переход Worker в нерабочее состояние.

Пример Script code на python

from subprocess import DEVNULL, STDOUT, check_call

def userscript() -> int:
  response = check_call(["ping" + f" -c 1 -W {TIMEOUT} {IP}"], shell=True, stdout=DEVNULL, stderr=STDOUT)
  if response == 0:
      return 200
  return 0

Пример Script code на shell

userscript() {
    if ping -c 1 -i $TIMEOUT $IP &> /dev/null
    then
        weight=0
    else
        weight=200
    fi

    return $weight
}

DNS

dns domain DOMAIN

Название домена для опроса.

dns mode tcp

Протокол, по которому будут отправляться DNS-запросы. По умолчанию UPD.

dns port (0-65535)

Порт, на который будут отправляться DNS-запросы.

dns reply-code (0-5)

Код ответа от DNS-сервера для прохождения успешной проверки.

Compound

compound health-monitors LINE...

Создать список Health Monitor, по которым будет осуществляться проверка. Названия Health Monitor должны быть отделены пробелом.

compound mode [<and|or>]

Выбрать режим сравнения. По умолчанию используется and.

Show команды

show vlb health-monitor

Показывает все созданные Health Monitor и их параметры.

show vlb health-monitor NAME

Показывает параметры указанного Health Monitor.