Вопрос или проблема
Я сталкиваюсь с проблемой с 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 сталкивается с несколькими проблемами:
-
Ошибка отсутствия nftables: Хотя эта ошибка может не быть напрямую связана с отказом подключения, отсутствие
nft
может стать причиной, почему kube-proxy не работает корректно, особенно если он использует nftables для управления сетью. -
Соединение отклонено: Ошибка в попытке подключения по
https://127.0.0.1:6443
говорит о некорректной конфигурации. Возможно, сервер API не настроен на прослушивание запросов с localhost, а ваше тестирование черезcurl
может не отражать фактическую рабочую среду kube-proxy. -
Проблемы с
iptables
: Совместная работа iptables и nftables требует наличия определённых бинарных файлов и их правильной интеграции в сетевой стек системы. Ошибки в логах показывают, что некоторые правила iptables не применяются надлежащим образом, что может быть частично вызвано отсутствием поддержки nftables.
Применение
-
Проверка конфигурации kube-proxy:
- Измените конфигурацию kube-proxy, чтобы он использовал адрес внешнего балансировщика нагрузки вместо
localhost
. Так как ваше тестирование с curl показало успешное подключение, проблема может скрываться в использовании локального адреса. - Обновите kubeconfig, чтобы удостовериться, что серверы указаны корректно.
- Измените конфигурацию kube-proxy, чтобы он использовал адрес внешнего балансировщика нагрузки вместо
-
Разрешение проблем с nftables:
- Установите полезные утилиты для работы с nftables на всех узлах, где это необходимо. Это может очистить часть ошибки сетевых правил.
-
Изменения в настройке iptables:
- Поскольку может возникать конфликт между различными слоями сетевых технологий, рассмотрите переход на совместимый стек, либо устраните специфические ошибки в правилах iptables.
-
Обзор сетевой настройки:
- Убедитесь, что балансировщик нагрузки корректно распределяет трафик между управляющими узлами и все необходимые порты открыты. Используйте утилиты мониторинга сети для диагностирования возможных проблем маршрутизации или NAT.
-
Отслеживание и диагностика работы:
- Воспользуйтесь инструментами журналирования и мониторинга, например, Prometheus и Grafana, чтобы наблюдать за состоянием сети и узлов, выявлять задержки и отказы в связи.
Эти шаги должны помочь выделить и исправить недостатки в сетевых соединениях, поддерживаемых kube-proxy, и улучшить связь между компонентами в вашей RKE2 HA среде. Настройка с высокой доступностью требует точной и своевременной диагностики сетевых компонентов, поэтому систематическое устранение выявленных проблем будет ключом к успешному разрешению сложившейся ситуации.