Подключение Kube proxy к API Server отклонено в RKE2 HA.

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

Я сталкиваюсь с проблемой с kube-proxy в моей RKE2 HA кластерной установке, состоящей из 3 мастер-узлов, 3 рабочих узлов и внешнего балансировщика нагрузки. Экземпляры kube-proxy на всех 3 мастер-узлах не могут подключиться к API серверу. Ниже приведены журналы ошибок от kube-proxy:

E0122 16:18:27.308126       1 proxier.go:733] "Error cleaning up nftables rules" 
err="could not find nftables binary: exec: 
\"nft\": executable file not found in $PATH"

E0122 16:18:27.308193       1 proxier.go:733] "Error cleaning up nftables rules"                          
err="could not find nftables binary: exec: \"nft\": executable file not found in $PATH"

E0122 16:18:27.310875       1 server.go:687] "Failed to retrieve node info" err="Get  
\"https://127.0.0.1:6443/api/v1/nodes/master01\": dial tcp 127.0.0.1:6443: connect: 
connection refused"

E0122 16:18:28.392318       1 server.go:687] "Failed to retrieve node info" err="Get   
\"https://127.0.0.1:6443/api/v1/nodes/master01\": dial tcp 127.0.0.1:6443: connect:     
connection refused"

E0122 16:18:30.765162       1 server.go:687] "Failed to retrieve node info" err="Get   
\"https://127.0.0.1:6443/api/v1/nodes/master01\": dial tcp 127.0.0.1:6443: connect:   
connection refused"

E0122 16:18:34.773599       1 server.go:687] "Failed to retrieve node info" err="Get 
\"https://127.0.0.1:6443/api/v1/nodes/master01\": dial tcp 127.0.0.1:6443: connect: 
connection refused"

Когда я проверяю процесс с помощью ps aux | grep proxy, я вижу, что он использует следующий kubeconfig файл: /var/lib/rancher/rke2/agent/kubeproxy.kubeconfig. Содержимое файла:

apiVersion: v1
clusters:
- cluster:
    server: https://127.0.0.1:6443
    certificate-authority: /var/lib/rancher/rke2/agent/server-ca.crt
  name: local
contexts:
- context:
    cluster: local
    namespace: default
    user: user
  name: Default
current-context: Default
kind: Config
preferences: {}
users:
- name: user
  user:
    client-certificate: /var/lib/rancher/rke2/agent/client-kube-proxy.crt
    client-key: /var/lib/rancher/rke2/agent/client-kube-proxy.key

Интересно, что когда я вручную тестирую API сервер с помощью curl, используя те же сертификаты и URL, я НЕ получаю ошибку 403. Вместо этого я получаю корректный JSON ответ:

curl --cacert /var/lib/rancher/rke2/agent/server-ca.crt \
     --cert /var/lib/rancher/rke2/agent/client-kube-proxy.crt \
     --key /var/lib/rancher/rke2/agent/client-kube-proxy.key \
     https://127.0.0.1:6443/api/v1/nodes/master01

Это доказывает, что сертификаты действительны и API сервер доступен. Однако kube-proxy все равно не может подключиться.

Дополнительные заметки:

  • Я развернул кластер rke2 с помощью следующей Ansible роли: labLabs
  • kube-proxy работает с настройками по умолчанию (iptables mode)
  • Я изменил SELinux на режим Permissive
  • При выполнении ss -tunlp я вижу, что API сервер прослушивает порт 6443:
LISTEN   0    4096   *:6443  *:*    users:(("kube-apiserver",pid=15859,fd=3))   
  • У меня такое же поведение, когда я выполняю iptables flush
  • Журнал упоминает проблемы с nftables: exec: “nft”: executable file not found in $PATH. Может ли это быть связано? Даже если я не думаю, что это может быть проблемой, поскольку я встречал то же самое при развертывании более старой версии RKE2, которая не вызывает ошибку журнала “nft”
  • Адрес сервера в kubeconfig — https://127.0.0.1:6443. Должен ли он указывать на внешний балансировщик нагрузки?
  • Что еще может вызвать эту проблему.
  • В целом, rke2-server вызывает ошибки журнала no route to host, когда он хочет отправить запросы на внутренние адреса подов. Я считаю, что это происходит из-за неправильной работы kube-proxy

Ответ или решение

Проблема с отказом подключения kube-proxy к API Server в настройке RKE2 в режиме высокой доступности (HA) может возникнуть из-за множества факторов. Давайте рассмотрим это подробно, используя подход TEA (теория, пример, применение).

Теория

Kube-proxy играет критическую роль в Kubernetes, отвечая за сетевую маршрутизацию пакетов внутри кластера. Он управляет правилами iptables для отправки трафика в правильные поды в кластере. В вашей конфигурации с высокой доступностью присутствуют три управляющих узла и три рабочих узла, а также внешний балансировщик нагрузки, что требует согласованности и правильной конфигурации сетевых компонентов.

Ошибка "connection refused" указывает на проблему с сетевым подключением к API Server. Возможны несколько причин: некорректная конфигурация kube-proxy, проблемы с сетевой инфраструктурой (например, с балансировщиком нагрузки), или такие системные проблемы, как отсутствие необходимых бинарных файлов.

Пример

Согласно приведённым вами логам, kube-proxy сталкивается с несколькими проблемами:

  1. Ошибка отсутствия nftables: Хотя эта ошибка может не быть напрямую связана с отказом подключения, отсутствие nft может стать причиной, почему kube-proxy не работает корректно, особенно если он использует nftables для управления сетью.

  2. Соединение отклонено: Ошибка в попытке подключения по https://127.0.0.1:6443 говорит о некорректной конфигурации. Возможно, сервер API не настроен на прослушивание запросов с localhost, а ваше тестирование через curl может не отражать фактическую рабочую среду kube-proxy.

  3. Проблемы с iptables: Совместная работа iptables и nftables требует наличия определённых бинарных файлов и их правильной интеграции в сетевой стек системы. Ошибки в логах показывают, что некоторые правила iptables не применяются надлежащим образом, что может быть частично вызвано отсутствием поддержки nftables.

Применение

  1. Проверка конфигурации kube-proxy:

    • Измените конфигурацию kube-proxy, чтобы он использовал адрес внешнего балансировщика нагрузки вместо localhost. Так как ваше тестирование с curl показало успешное подключение, проблема может скрываться в использовании локального адреса.
    • Обновите kubeconfig, чтобы удостовериться, что серверы указаны корректно.
  2. Разрешение проблем с nftables:

    • Установите полезные утилиты для работы с nftables на всех узлах, где это необходимо. Это может очистить часть ошибки сетевых правил.
  3. Изменения в настройке iptables:

    • Поскольку может возникать конфликт между различными слоями сетевых технологий, рассмотрите переход на совместимый стек, либо устраните специфические ошибки в правилах iptables.
  4. Обзор сетевой настройки:

    • Убедитесь, что балансировщик нагрузки корректно распределяет трафик между управляющими узлами и все необходимые порты открыты. Используйте утилиты мониторинга сети для диагностирования возможных проблем маршрутизации или NAT.
  5. Отслеживание и диагностика работы:

    • Воспользуйтесь инструментами журналирования и мониторинга, например, Prometheus и Grafana, чтобы наблюдать за состоянием сети и узлов, выявлять задержки и отказы в связи.

Эти шаги должны помочь выделить и исправить недостатки в сетевых соединениях, поддерживаемых kube-proxy, и улучшить связь между компонентами в вашей RKE2 HA среде. Настройка с высокой доступностью требует точной и своевременной диагностики сетевых компонентов, поэтому систематическое устранение выявленных проблем будет ключом к успешному разрешению сложившейся ситуации.

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

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