Прокси-сервер hyperkube, kubelet не может найти цепочку iptables, rkt run --net=host

Мой кубелет жалуется:

E1201 09: 00: 12.562610 28747 kubelet_network.go: 365] Не удалось обеспечить правило для отбрасывания пакета, помеченного KUBE-MARK-DROP, в цепочке фильтров KUBE-FIREWALL: правило добавления ошибки: состояние выхода 1: iptables: нет цепочки / цели / совпадения под этим именем

Обычно это происходит, когда вы забыли запустить rkt с --net-host, но я этого не сделал.

export RKT_OPTS = "- том var-log, вид = хост, источник = / var / log \
--mount volume = var-log, target = / var / log \ --volume dns, kind = host, source = / etc / resolv.conf \ --mount volume = dns, target = / etc / resolv.conf - -сетью = хозяин"

Следующее подтверждает, что мой kube-proxy (запущенный kubelet) находится в том же пространстве имен, что и хост, которому принадлежат цепочки iptables:

root@i8:/etc# d exec -it 738 readlink /proc/self/ns/net
net:[4026531963]

root@i8:/etc# readlink /proc/self/ns/net
net:[4026531963]

root@i8:/etc# docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
738ed14ec802        quay.io/coreos/hyperkube:v1.4.6_coreos.0   "/hyperkube proxy --m"   44 minutes ago      Up 44 minutes                                       k8s_kube-proxy.c445d412_kube-proxy-192.168.101.128_kube-system_438e3d01f328e73a199c6c0ed1f92053_10197c34

Прокси аналогично жалуется "Нет цепочки / цели / совпадения с этим именем".

Я также проверил цепочку iptables:

# Completed on Thu Dec  1 01:07:11 2016
# Generated by iptables-save v1.4.21 on Thu Dec  1 01:07:11 2016
*filter
:INPUT ACCEPT [4852:1419411]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5612:5965118]
:DOCKER - [0:0]
:DOCKER-ISOLATION - [0:0]
:KUBE-FIREWALL - [0:0]
:KUBE-SERVICES - [0:0]
-A INPUT -j KUBE-FIREWALL
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A OUTPUT -j KUBE-SERVICES
-A OUTPUT -j KUBE-FIREWALL
-A DOCKER-ISOLATION -j RETURN
-A KUBE-FIREWALL -m mark --mark 0x8000/0x8000 -j DROP
COMMIT

Это удовлетворяет жалобе в сообщении об ошибке (я думаю) и соответствует цепочке фильтров на работающем без проблем операторе Coreos (другой машине, с которой я сравнивал).

Проблемный работник - Debian Jessie, работающий с Docker 1.12.3 и rkt 1.18.0

И хороший, и проблемный работники используют одну и ту же версию iptables, 1.4.21.

KUBELET_VERSION=v1.4.6_coreos.0

Признак состоит в том, что kubernetes на проблемном работнике не устанавливает никаких правил iptables, таких как KUBE-NODEPORTS, и поэтому этот работник не может прослушивать службы NodePort. Я думаю, что это из-за вышеизложенного.

У проблемного работника нет проблем с запуском модулей, запланированных главным узлом.

Модули проблемного работника обслуживают запросы в порядке от прокси-сервера, работающего на другом (coreos) работнике.

Я использую фланель для общения.

Если кому-то интересно, мне нужно, чтобы kubernetes работал над Debian (да, это длинная история)

Что еще я могу сделать, чтобы изолировать то, что кажется kubelet, не видя iptables хоста?

1 ответ

У меня была эта проблема на коробке gentoo с настраиваемой конфигурацией ядра при запуске k8s с использованием k3d 1.3.1. Пересборка ядра со всеми вменяемыми iptables + xt_comment решила эту проблему для меня.

После значительной изоляции отказов я нашел причину и решение.

В моем случае я использую пользовательское ядро ​​pkg (linux-image), в котором отсутствовало несколько модулей ядра, связанных с iptables. Поэтому, когда kubelet попытался добавить правила iptables, содержащие комментарий, он допустил ошибку, потому что xt_comment не был загружен.

Это модули, которые я пропустил: ipt_REJECT, nf_conntrack_netlink, nf_reject_ipv4, sch_fq_codel (возможно, не требуется), xt_comment, xt_mark, xt_recent, xt_statistic

Чтобы получить полный список модулей, которые мне, вероятно, понадобились, я вошел в систему CoreOS kubernetes работника и посмотрел на его lsmod, Тогда просто сравнил этот список с моей "проблемной" машиной.

Другие вопросы по тегам