14
March 29, 2025, 5:42 p.m.
Настройка k3s в режиме high availabilty
Задача: настроить k3s в HA в нескольких регионах
Вводные
- нужна настроенная база данных postgres, в режиме HA. Падение базы приведёт к неработоспособности кластера;
- нужна настроенная сеть, где все ноды могут общаться между собой по порту 6443;
- взаимодействие между нодами в разных cloud провайдерах необходимо реализовать на IPv6;
- в настройке необхоидмо использоваться параметр
flannel-backend=wireguard-native
, который обеспечит шифрование трафика между нодами; - для работы в режиме HA требуется минимум 2 мастер ноды, при отключении одной ноды (например, на этап обновления) вторая нода автоматически заберёт на себя управление. В нормальном режиме работы нагрузка частично балансируется. Часть функций всегда выполняет только одна нода.
Инициализация кластера
Делается один раз, данная команда, создает базу данных и записывает туда параметры.
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="<актуальная версия>" \
INSTALL_K3S_EXEC="server \
--disable-agent \
--datastore-endpoint='postgres://{{ PG_K3S_DB_USER }}:{{ PG_K3S_DB_PASS }}@{{ PG_HOST }}:{{ PG_PORT }}/{{ PG_K3S_DB_NAME }}' \
--flannel-backend=wireguard-native \
--disable=traefik \
--node-ip=:: \
--cluster-cidr=10.42.0.0/16,2001:cafe:42::/56 \
--service-cidr=10.43.0.0/16,2001:cafe:43::/112 \
--kubelet-arg=node-ip=:: \
--flannel-ipv6-masq \
--tls-san=k3s-master0.example.net \
--tls-san=k3s-master1.example.net \
--node-label cloud=aws \
--node-label role=master" \
sh -
Добавление последующих мастер нод
Токен находится /var/lib/rancher/k3s/server/node-token
Делается все последующие разы
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="<актуальная версия>" \
K3S_TOKEN={{ k3s_node_token_value }} \
INSTALL_K3S_EXEC="server \
--disable-agent \
--datastore-endpoint='postgres://{{ PG_K3S_DB_USER }}:{{ PG_K3S_DB_PASS }}@{{ PG_HOST }}:{{ PG_PORT }}/{{ PG_K3S_DB_NAME }}' \
--flannel-backend=wireguard-native \
--disable=traefik \
--node-ip=:: \
--cluster-cidr=10.42.0.0/16,2001:cafe:42::/56 \
--service-cidr=10.43.0.0/16,2001:cafe:43::/112 \
--kubelet-arg=node-ip=:: \
--flannel-ipv6-masq \
--tls-san=k3s-master0.example.net \
--tls-san=k3s-master1.example.net \
--node-label cloud=aws \
--node-label role=master" \
sh -
Добавление воркер нод
--node-label
- по мере необходимости.
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="{{ K3S_VERSION }}" \
K3S_URL=https://[{{ k3s_master_hostname_value }}]:6443 \
K3S_TOKEN={{ k3s_node_token_value }} \
INSTALL_K3S_EXEC="--node-name {{ SERVERNAME }} \
--node-label instance-type={{ INSTANCETYPE }} \
--node-label region={{ REGION }} \
--node-label cloud={{ CLOUD }} \
--node-label role=worker" \
sh -
Важные замечания
При работе с IPv4 на мастерах, в конфигурации необходимо добавить параметр --node-ip=
иначе сетевое взаимодействие между нодами будет ограничено. Для этого на мастер нодах, на которых используются публичные IPv4 адреса. Иначе, удаленные мастер ноды будут обращаться по внутренним (локальным) адресам, которые не доступны снаружи.
sudo nano /etc/systemd/system/k3s.service
Пример установки параметра '--node-ip=52.XX.2XX.1XX' \
ExecStart=/usr/local/bin/k3s \
server \
<...>
'--node-ip=52.XX.2XX.1XX' \
<...>
'--disable-agent' \
'--datastore-endpoint=<???>
'--flannel-backend=wireguard-native' \
Применение настроек
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart k3s
Проверка работы
sudo systemctl status k3s