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