#kubernetes #networking #interface #flannel #k3s
#kubernetes #сеть #интерфейс #фланель #k3s
Вопрос:
У меня есть кластер K3s (v1.20.4 k3s1) с 3 узлами, каждый с двумя интерфейсами. Интерфейс по умолчанию имеет общедоступный IP-адрес, второй — адрес 10.190.1.0. Я установил K3s с опцией -flannel-backend= none и без нее, а затем развернул flannel через » kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml «, предварительно привязав контейнер kube-flannel к внутреннему интерфейсу с помощью аргументов «—iface=». В этой настройке модули kube-flannel получают IP-адрес узла внутреннего интерфейса, но я не могу связаться с модулями на других узлах через ICPM. Если я разверну flannel без аргумента iface, модули kube-flannel получат адрес из сети 10.42.0.0. Тогда я смогу получить доступ к модулям других хостов, но трафик будет маршрутизироваться через общедоступные интерфейсы, чего я хочу избежать. У кого-нибудь есть совет для меня?
Комментарии:
1.
ICMP
Включен ли трафик в вашей частной сети? Вы пытались получить доступ кPods
ним с узла или с другогоPod
? Вы пытались использовать аргумент —node-ip ? Насколько я знаю, есть аргумент —flannel-iface , а не--iface=
.2. вы правы, «—flannel-iface=» сработало. Спасибо!
3. Это здорово 🙂 итак, использование
--flannel-iface=
решило вашу проблему, и теперь все работает так, как ожидалось?4. точно 🙂 теперь я могу использовать:
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.20.4 k3s1" INSTALL_K3S_EXEC="server --disable=traefik --flannel-iface=ens10 --bind-address 10.190.1.5 --advertise-address 10.190.1.5 --datastore-endpoint etcd --node-name kube-master-01 --node-ip 10.190.1.5 --node-external-ip 10.190.1.30 --cluster-init" sh -s -
для установки первого главного узла, в то время как ens10 — это второй интерфейс
Ответ №1:
Проблема была решена в разделе комментариев, но для лучшей наглядности я решил предоставить ответ.
Как мы можем видеть в документации K3s, K3s использует flannel в качестве CNI по умолчанию:
По умолчанию K3s будет работать с flannel в качестве CNI, используя VXLAN в качестве серверной части по умолчанию. Чтобы изменить CNI, обратитесь к разделу о настройке пользовательского CNI.
По умолчанию flannel выбирает первый интерфейс на хосте (посмотрите документацию flannel), но мы можем переопределить это поведение с помощью флага —flannel-iface .
Кроме того, мы можем явно задать IP-адрес для объявления для узла, используя флаг —node-ip .
Я создал простой пример, чтобы проиллюстрировать, как это работает.
На моем хост-компьютере у меня есть два сетевых интерфейса ( ens4
и ens5
):
kmaster:~# ip a s | grep -i "UP|inet"
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
inet 10.156.15.197/32 brd 10.156.15.197 scope global dynamic ens4
3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.0.2/32 brd 192.168.0.2 scope global dynamic ens5
Без установки --flannel-iface
флагов --node-ip
и flannel выберет первый интерфейс ( ens4: 10.156.15.197
):
kmaster:~# curl -sfL https://get.k3s.io | sh -
[INFO] Finding release for channel stable
[INFO] Using v1.20.4 k3s1 as release
...
[INFO] systemd: Starting k3s
kmaster:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP
kmaster Ready control-plane,master 97s v1.20.4 k3s1 10.156.15.197
Но, как я упоминал ранее, мы можем переопределить интерфейс flannel по умолчанию с --flannel-iface
помощью флага:
kmaster:~# curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--node-ip=192.168.0.2 --flannel-iface=ens5" sh -
[INFO] Finding release for channel stable
[INFO] Using v1.20.4 k3s1 as release
...
[INFO] systemd: Starting k3s
kmaster:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP
kmaster Ready control-plane,master 64s v1.20.4 k3s1 192.168.0.2