DevOps

Почему Pod не получает IP от Flannel в Kubernetes

Pod не получает IP от Flannel в Kubernetes? Диагностика и исправление: неправильный манифест, CIDR mismatch, CNI плагины. Чеклист команд, логи, sysctl. Установка kube-flannel.yml для kubeadm.

Почему POD не получает IP адрес от flannel в Kubernetes?

Я запускаю Kubernetes с командой:

kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

Устанавливаю flannel:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/...

Создаю POD и SERVICE согласно официальной документации:

yaml
apiVersion: v1
kind: Pod
metadata:
 name: nginx
 namespace: lesson-1
 labels:
 app.kubernetes.io/name: nginx-lesson-1
spec:
 containers:
 - name: nginx
 image: nginx:stable
 ports:
 - containerPort: 80
 name: http-web-svc

---
apiVersion: v1
kind: Service
metadata:
 name: nginx-service
 namespace: lesson-1
spec:
 selector:
 app.kubernetes.io/name: nginx-lesson-1
 ports:
 - name: name-of-service-port
 protocol: TCP
 port: 80
 targetPort: http-web-svc

Service получает IP адрес, но POD не получает IP адрес от flannel. В чем может быть проблема?

Причина обычно в flannel kubernetes: либо flannel вообще не установлен (часто — по ошибке вы применили манифест metrics‑server вместо flannel), либо есть несоответствие CIDR между kubeadm и манифестом flannel, либо CNI‑плагины/инициализаторы не сработали. Service получает ClusterIP от API-сервера, а IP пода выдают CNI‑плагины (flannel), поэтому сервис будет иметь адрес, даже если поду не назначили IP. Ниже — детальный чеклист, команды для диагностики и пошаговые способы исправить типичные ошибки.


Содержание


flannel kubernetes — почему POD не получает IP

Почему сервис получает IP, а Pod — нет? Коротко: ClusterIP службы создаёт Kubernetes control plane, а IP пода выдаёт CNI (в вашем случае flannel) в момент запуска Pod’а. Если CNI не установлен или не работает — Pod останется без IP (обычно в состоянии Pending или Running без IP).

Типичные коренные причины:

  • Неправильный манифест применён (вы установили metrics‑server вместо flannel).
  • Несоответствие pod network CIDR: --pod-network-cidr (kubeadm) ≠ Network в kube-flannel.yml.
  • DaemonSet kube-flannel не запущен / init-контейнеры упали.
  • Отсутствуют CNI‑бинарники в /opt/cni/bin или файл конфигурации в /etc/cni/net.d/ (например 10-flannel.conflist).
  • Конфликт мостов (docker0 / cbr0) — Docker создал свой bridge, который конфликтует с подсетями flannel.
  • flanneld выбрал неверный сетевой интерфейс (несколько NIC, нужно указать --iface).
  • sysctl/iptables или firewall блокируют трафик (нужно net.bridge.bridge-nf-call-iptables=1, net.ipv4.ip_forward=1, открыть VXLAN UDP 8472 при backend vxlan).
  • Узел в статусе NotReady — kubelet/taints/ключи сертификатов мешают назначению IP.

Ссылки по схеме установки и диагностике flannel есть ниже; но сначала — как проверить быстро.


flannel kubernetes — проверка установки и правильный манифест

В вашем описании видно: вы запускаете kubeadm с --pod-network-cidr=10.244.0.0/16 — это правильно для flannel по умолчанию. Но вы устанавливали flannel командой:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/...

— это явно не flannel. Частая ошибка: по невнимательности применяют манифест metrics-server. Исправление: удалить ошибочный ресурс и применить официальный манифест flannel:

  • Правильный флаг установки flannel (официальный raw YAML):
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

Этот манифест содержит ConfigMap с Network: "10.244.0.0/16" и DaemonSet kube-flannel-ds. Проверьте, что Network в манифесте совпадает с --pod-network-cidr, который вы использовали при kubeadm init.

Подсказка: если вы уже применяли неправильный файл, удалите его (или конкретные ресурсы) перед применением flannel, чтобы не оставлять лишних конфликтующих объектов в kube-system.


Диагностика: чеклист и команды

Выполните эти команды и смотрите вывод — я укажу, что смотреть в каждом шаге.

  1. Проверка flannel в кластере
kubectl get pods -n kube-flannel
kubectl get ds -n kube-flannel

Ожидается: DaemonSet kube-flannel-ds и по одному Running pod на каждом узле.

  1. Логи flannel
POD=$(kubectl get pods -n kube-flannel -o name | head -n1)
kubectl logs -n kube-flannel ${POD} -c kube-flannel

Ищите ошибки вида: failed to get node IP, no networks found, failed to create subnet file, проблемы с RBAC или pull image.

  1. Проверка конфигурации flannel (ConfigMap)
kubectl -n kube-flannel get configmap kube-flannel-cfg -o yaml | grep -A2 Network

Должно быть Network: 10.244.0.0/16 (или ваш выбранный CIDR).

  1. На рабочем узле: проверить что flannel записал подсеть
sudo cat /run/flannel/subnet.env
# ожидаемые переменные: FLANNEL_NETWORK, FLANNEL_SUBNET, FLANNEL_MTU, FLANNEL_IPMASQ
  1. Проверить CNI конф и бинарники
ls -l /etc/cni/net.d/
ls -l /opt/cni/bin/

В /etc/cni/net.d/ должен быть 10-flannel.conflist (или аналог), в /opt/cni/bin/ — плагины (bridge, host-local и др.).

  1. Проверить интерфейсы и маршруты
ip addr show cni0
ip route

Ищите интерфейсы flannel (например flannel.1) и маршрут до pod‑подсетей.

  1. Sysctl / ip forwarding / iptables
sysctl net.bridge.bridge-nf-call-iptables net.ipv4.ip_forward
sudo iptables -L FORWARD -n -v

Значения должны быть 1, правила не должны блокировать FORWARD.

  1. Проверка конфликтов Docker
ip addr show docker0
docker info | grep -i 'Bridge\|bip'

Если docker0 использует подсеть, пересекающуюся с FLANNEL_SUBNET — это проблема.

Если после flannel pods в kube-flannel статус CrashLoopBackOff — см. логи и init-контейнеры (они копируют CNI-бинарники).

Подробнее по диагностике — официальная страница troubleshooting: https://github.com/flannel-io/flannel/blob/master/Documentation/troubleshooting.md


Распространённые причины и их исправление

Ниже — кратко про самые частые кейсы и как их фиксить.

  1. Неправильный манифест (metrics-server вместо flannel)
    Исправление: удалить ошибочный ресурс и применить официальный flannel YAML:
kubectl delete -f <тот-же-url-что-вы-применяли> # если есть
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
  1. CIDR mismatch (--pod-network-cidrNetwork в kube-flannel.yml)
    Если кластер свежий — проще пересоздать control‑plane: kubeadm resetkubeadm init --pod-network-cidr=10.244.0.0/16 → применить flannel.
    Если пересоздание нежелательно — можно изменить ConfigMap kube-flannel-cfg так, чтобы она соответствовала настроенной сети, но будьте осторожны: менять сеть “на лету” опасно для уже созданных подов/маршрутов.

  2. CNI‑плагины не попали в /opt/cni/bin (init-контейнеры Failed)
    Проверьте события pod’а flannel (kubectl describe pod ...). Если init‑контейнеры падают — смотрите логи и права, возможно, контейнер не может записать в /opt/cni/bin (требуются привилегии).

  3. Docker bridge конфликтует (docker0/cbr0)
    Решения: настроить dockerd так, чтобы он не создавал конфликтный мост, или выставить bip в daemon.json равным подсети flannel для node (только если вы понимаете последствия). Обсуждение см. в сообществах, например https://stackoverflow.com/questions/40592748/kubernetes-pod-is-not-getting-ip-from-flannel-cidr

  4. flanneld выбрал неверный интерфейс
    Если узел с несколькими NIC, укажите интерфейс в манифесте flanneld: добавьте флаг --iface=<имя-интерфейса> в container args. Пример обсуждался здесь: https://stackoverflow.com/questions/66838616/kubernetes-unable-to-access-flannel-pod

  5. Firewall / VXLAN порт
    Если backend — vxlan, откройте UDP порт 8472 между нодами. Без этого флаги VXLAN не смогут связать подсети.

  6. sysctl / ip_forward / iptables
    Установите:

sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
sudo sysctl -w net.ipv4.ip_forward=1

И сделайте persist при необходимости.


Примеры исправлений и быстрые команды

Сценарий: вы по ошибке применили metrics-server вместо flannel — быстрый план действий.

  1. Найти и удалить metrics-server (если он есть)
kubectl get pods -A | grep metrics-server
kubectl delete deployment metrics-server -n kube-system # если deployment есть
# или:
kubectl delete -f <тот-же-url-что-вы-применяли>
  1. Применить flannel:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
  1. Проверить статус:
kubectl -n kube-flannel get pods -o wide
kubectl -n kube-flannel get ds
kubectl -n kube-flannel rollout status daemonset/kube-flannel-ds
  1. Когда flannel Running на всех нодах — пересоздайте тестовый pod:
kubectl apply -f <ваш-pod-yaml>.yaml
kubectl get pod -n lesson-1 -o wide
kubectl describe pod <pod-name> -n lesson-1 # смотреть события
  1. Если Pod всё ещё без IP — собрать вывод для диагностики:
kubectl get pods -n kube-flannel -o wide
kubectl logs -n kube-flannel <flannel-pod> -c kube-flannel
kubectl describe pod <problem-pod> -n lesson-1
# на ноде:
sudo cat /run/flannel/subnet.env
ls -l /etc/cni/net.d /opt/cni/bin
ip addr show cni0
sysctl net.bridge.bridge-nf-call-iptables net.ipv4.ip_forward

Скиньте эти выводы — и я помогу разобрать дальше.

Если проблема в CIDR и кластер маленький/только что создан — самый надёжный путь: сброс (kubeadm reset) и kubeadm init --pod-network-cidr=10.244.0.0/16, затем снова применить flannel.


Источники


Заключение

Коротко: самое вероятное — вы применили не тот YAML (metrics‑server), поэтому flannel просто не установлен, или есть CIDR/конфликт мостов/ошибки init‑контейнеров. Начните с проверки DaemonSet kube-flannel, логов flannel и содержимого /run/flannel/subnet.env, затем примените официальный манифест https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml. Если пришлёте вывод команд из раздела диагностики (список pod’ов, логи flannel, содержимое subnet.env и вывод ls /opt/cni/bin), помогу разобрать результаты и предложу точечное исправление.

Авторы
Проверено модерацией
Модерация
Почему Pod не получает IP от Flannel в Kubernetes