Почему 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 согласно официальной документации:
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
- flannel kubernetes — проверка установки и правильный манифест
- Диагностика: чеклист и команды
- Распространённые причины и их исправление
- Примеры исправлений и быстрые команды
- Источники
- Заключение
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.
Диагностика: чеклист и команды
Выполните эти команды и смотрите вывод — я укажу, что смотреть в каждом шаге.
- Проверка flannel в кластере
kubectl get pods -n kube-flannel
kubectl get ds -n kube-flannel
Ожидается: DaemonSet kube-flannel-ds и по одному Running pod на каждом узле.
- Логи 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.
- Проверка конфигурации flannel (ConfigMap)
kubectl -n kube-flannel get configmap kube-flannel-cfg -o yaml | grep -A2 Network
Должно быть Network: 10.244.0.0/16 (или ваш выбранный CIDR).
- На рабочем узле: проверить что flannel записал подсеть
sudo cat /run/flannel/subnet.env
# ожидаемые переменные: FLANNEL_NETWORK, FLANNEL_SUBNET, FLANNEL_MTU, FLANNEL_IPMASQ
- Проверить 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 и др.).
- Проверить интерфейсы и маршруты
ip addr show cni0
ip route
Ищите интерфейсы flannel (например flannel.1) и маршрут до pod‑подсетей.
- Sysctl / ip forwarding / iptables
sysctl net.bridge.bridge-nf-call-iptables net.ipv4.ip_forward
sudo iptables -L FORWARD -n -v
Значения должны быть 1, правила не должны блокировать FORWARD.
- Проверка конфликтов 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
Распространённые причины и их исправление
Ниже — кратко про самые частые кейсы и как их фиксить.
- Неправильный манифест (metrics-server вместо flannel)
Исправление: удалить ошибочный ресурс и применить официальный flannel YAML:
kubectl delete -f <тот-же-url-что-вы-применяли> # если есть
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
-
CIDR mismatch (
--pod-network-cidr≠Networkв kube-flannel.yml)
Если кластер свежий — проще пересоздать control‑plane:kubeadm reset→kubeadm init --pod-network-cidr=10.244.0.0/16→ применить flannel.
Если пересоздание нежелательно — можно изменить ConfigMapkube-flannel-cfgтак, чтобы она соответствовала настроенной сети, но будьте осторожны: менять сеть “на лету” опасно для уже созданных подов/маршрутов. -
CNI‑плагины не попали в /opt/cni/bin (init-контейнеры Failed)
Проверьте события pod’а flannel (kubectl describe pod ...). Если init‑контейнеры падают — смотрите логи и права, возможно, контейнер не может записать в/opt/cni/bin(требуются привилегии). -
Docker bridge конфликтует (docker0/cbr0)
Решения: настроить dockerd так, чтобы он не создавал конфликтный мост, или выставитьbipв daemon.json равным подсети flannel для node (только если вы понимаете последствия). Обсуждение см. в сообществах, например https://stackoverflow.com/questions/40592748/kubernetes-pod-is-not-getting-ip-from-flannel-cidr -
flanneld выбрал неверный интерфейс
Если узел с несколькими NIC, укажите интерфейс в манифесте flanneld: добавьте флаг--iface=<имя-интерфейса>в container args. Пример обсуждался здесь: https://stackoverflow.com/questions/66838616/kubernetes-unable-to-access-flannel-pod -
Firewall / VXLAN порт
Если backend — vxlan, откройте UDP порт 8472 между нодами. Без этого флаги VXLAN не смогут связать подсети. -
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 — быстрый план действий.
- Найти и удалить metrics-server (если он есть)
kubectl get pods -A | grep metrics-server
kubectl delete deployment metrics-server -n kube-system # если deployment есть
# или:
kubectl delete -f <тот-же-url-что-вы-применяли>
- Применить flannel:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- Проверить статус:
kubectl -n kube-flannel get pods -o wide
kubectl -n kube-flannel get ds
kubectl -n kube-flannel rollout status daemonset/kube-flannel-ds
- Когда 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 # смотреть события
- Если 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.
Источники
- https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- https://github.com/flannel-io/flannel/blob/master/Documentation/troubleshooting.md
- https://stackoverflow.com/questions/40592748/kubernetes-pod-is-not-getting-ip-from-flannel-cidr
- https://stackoverflow.com/questions/66838616/kubernetes-unable-to-access-flannel-pod
- https://stackoverflow.com/questions/42380762/kubernetes-flannel-network-does-not-work-as-expected
- https://gcore.com/learning/configure-kubernetes-network-with-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), помогу разобрать результаты и предложу точечное исправление.