Рейтинг:0

kubernetes дублирует IP-адреса pod — должны ли IP-адреса pod быть уникальными для всего кластера?

флаг de

я прочитал это в документе:

Каждый модуль получает свой собственный IP-адрес... модули на узле могут взаимодействовать со всеми модулями на всех узлах без NAT.

Должен ли я читать это как «каждый стручок получает свой собственный уникальный кластер шириной Айпи адрес"?

Я предположил, что это так, но причина, по которой я спрашиваю, заключается в том, что я заметил модули с одинаковыми IP-адресами только на разных узлах сразу после того, как я инициализировал новый кластер, следуя инструкциям. здесь. Кластер имеет 3 узла тест-VM{4,5,6}, с тест-VM4 как мастер, работающий в локальной фиктивной сети 10.1.4.0/16. Я использовал фланель для CNI и настроил ее следующим образом:

kubectl patch node test-vm{4..6} -p '{ "spec": { "podCIDR": "10.244.0.0/16" } }' # Пришлось сделать это, потому что это не было установлено при инициализации кластера. См. https://stackoverflow.com/a/60944959/2038383.
kubectl применить -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Обратите внимание, что 3 IP-адреса встречаются дважды для 2 разных модулей — 10.244.0.{2,3,4}:

$ kubectl получить модули --all-namespaces -o широкий -w
ПРОСТРАНСТВО ИМЕН ИМЯ ГОТОВНОСТЬ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ IP УЗЛА НАЗНАЧЕННЫЙ УЗЕЛ ГОТОВНОСТЬ ВОРОТА
по умолчанию curl 1/1 Работает 0 14 м 10.244.0.4 test-vm6 <нет> <нет>
по умолчанию my-nginx-cf54cdbf7-d6s9m 1/1 Работает 0 17 м 10.244.0.3 test-vm6 <нет> <нет>
по умолчанию my-nginx-cf54cdbf7-twrvw 1/1 Работает 0 17 мин 10.244.0.2 test-vm6 <нет> <нет>
по умолчанию my-nginx-cf54cdbf7-xpff6 1/1 Работает 0 17 мин 10.244.0.4 test-vm5 <нет> <нет>
по умолчанию my-nginx-more-5f79688b9d-4c9jk 1/1 Работает 0 3m10s 10.244.0.6 test-vm5 <none> <none>
по умолчанию my-nginx-more-5f79688b9d-7htsn 1/1 Работает 0 3m18s 10.244.0.5 test-vm5 <none> <none>
по умолчанию my-nginx-more-5f79688b9d-gqz9b 1/1 Работает 0 3m4s 10.244.0.7 test-vm5 <none> <none>
по умолчанию nginx1 1/1 Работает 0 9 с 10.244.0.8 test-vm5 <нет> <нет>
kube-system coredns-64897985d-kt82d 1/1 Работает 0 41 м 10.244.0.2 test-vm5 <нет> <нет>
kube-system coredns-64897985d-rd7gz 1/1 Работает 0 41 м 10.244.0.3 test-vm5 <нет> <нет>
kube-system etcd-test-vm4 1/1 Работает 0 41 м 10.1.4.36 test-vm4 <нет> <нет>
kube-system kube-apiserver-test-vm4 1/1 Работает 0 41 м 10.1.4.36 test-vm4 <нет> <нет>
kube-system kube-controller-manager-test-vm4 1/1 Running 0 41m 10.1.4.36 test-vm4 <none> <none>
kube-system kube-flannel-ds-snkhk 1/1 Бег 0 29 м 10.1.4.38 test-vm6 <нет> <нет>
kube-system kube-flannel-ds-wtmqg 1/1 Running 0 29m 10.1.4.37 test-vm5 <none> <none>
kube-system kube-flannel-ds-x46xw 1/1 Running 0 29m 10.1.4.36 test-vm4 <none> <none>
kube-system kube-proxy-mjl69 1/1 Running 0 41m 10.1.4.37 test-vm5 <none> <none>
kube-system kube-proxy-vz2p2 1/1 Работает 0 41 м 10.1.4.36 test-vm4 <нет> <нет>
kube-system kube-proxy-xg4gg 1/1 Running 0 41m 10.1.4.38 test-vm6 <none> <none>
kube-system kube-scheduler-test-vm4 1/1 Running 0 41m 10.1.4.36 test-vm4 <none> <none>

Несмотря на то, что говорится в документах, все модули не могут общаться друг с другом. Они могут взаимодействовать только с модулями на одном узле, и это вызывает ошибки. Хотите знать, является ли это красным флагом, что что-то не так или нет, и искать разъяснения по этому вопросу об уникальности IP-адреса модуля.

флаг in
Я считаю, что это IP-адрес узла, что произойдет с `hostNetwork: true`; Вы можете это подтвердить?
spinkus avatar
флаг de
Сеть узлов LAN — 10.1.4.0/24. Другой сетевой диапазон, в котором находятся модули, — 10.244.0.0/16, он создан фланелью и связан с каким-то другим виртуальным устройством или правилом маршрутизации iptables или какой-то ерундой, которую я пока не понимаю. `kubectl получить узел test-vm4 -o json | jq .spec.podCIDR` дает `10.244.0.0/16`. В файле `kube-flannel.yml`, который я использовал для установки фланелевого CNI, есть упоминание о hostNetwork: true. Пока не уверен, что это значит.
spinkus avatar
флаг de
@mdaniel о, теперь я понимаю лучше: flanneld DaemonSet использует сеть хоста (как и должно быть), но сеть pod — это vxlan на 10.244.0.0/16. Так что нет, IP-адрес модуля не является хост-сетью. Это vxlan по умолчанию.
Рейтинг:1
флаг de

Я понял. Во-первых, да поды должны иметь уникальный IP-адрес для всего кластера. Это основа работы k8s. Связанный документ k8s - дерьмо, и вопрос остается немного открытым. Источники с лучшими формулировками:

Такие платформы, как Kubernetes, предполагают, что каждый контейнер (под) имеет уникальный маршрутизируемый IP-адрес внутри кластера. Преимущество этой модели заключается в том, что она устраняет сложности сопоставления портов, возникающие при совместном использовании одного IP-адреса хоста. -- https://github.com/flannel-io/flannel#сетевые-детали

Одним из основных требований сетевой модели Kubernetes является то, что каждый модуль должен получить свой собственный IP-адрес и каждый модуль в кластере должен иметь возможность общаться с ним, используя этот IP-адрес. -- https://ronaknathani.com/blog/2020/08/how-a-kubernetes-pod-gets-an-ip-адрес/


Теперь вопрос: почему моим модулям назначаются одинаковые IP-адреса? В основном это делается во фланелевой CNI. неправильный (Я скопировал это предложение из этот ТАК ответ):

kubectl patch node test-vm{4..6} -p '{ "spec": { "podCIDR": "10.244.0.0/16" } }' # Пришлось сделать это, потому что это не было установлено при инициализации кластера.

podCIDR должен быть уникальным для каждого узла. Вот как k8s гарантирует, что каждый запланированный модуль имеет уникальный IP-адрес — каждый узел назначает некоторый IP-адрес в своем podCIDR. Посмотри это отличный пост в блоге, объясняющий это. Вышеупомянутое не эквивалентно установке --pod-сеть-cidr на инициализация кубеадм как вы должны. --pod-сеть-cidr параметр командной строки фактически соответствует Конфигурация кластера networking.podSubnet. Поэтому, если вам нужно установить его после того, как вы удалили фланель, отредактируйте конфигурацию кластера (на самом деле я не тестировал этот подход, я просто повторно инициализировал с набором --pod-network-cidr):

kubectl удалить -f kube-flannel.yml
kubectl edit cm -n kube-system kubeadm-config # и добавьте settings.

После установки:

плоскость управления автоматически выделяет CIDR для каждого узла. -- https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/.

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


ОБНОВИТЬ: Вышеупомянутый способ установки Конфигурация кластера networking.podSubnet после инициализации фактически не работает. Это даже не сработает, если вы отмените регистрацию и перерегистрируете все рабочие узлы, что раздражает.Насколько я знаю, единственный способ заставить работать автоматическую настройку узла podCIDR — это снести ваш кластер и повторно инициализировать с помощью --pod-сеть-cidr установить или networking.podSubnet установить в начальной конфигурации (см. --config вариант).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.