В kubernetes есть два вида IP: ClusterIP и Pod IP.
CNI
CNI заботится о Pod IP.
CNI Plugin фокусируется на созданииоверлейная сеть, без которой стручки не могут общаться друг с другом.Задача плагина CNI состоит в том, чтобы назначить Pod IP для Pod, когда это запланировано, и создать виртуальное устройство для этого IP, и сделать этот IP доступным из каждого узла кластера.
В Calico это реализовано с помощью N маршрутов хоста (N = количество устройств калибровки) и M прямых маршрутов на tun0 (M = количество узлов кластера K8s).
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.130.29.1 0.0.0.0 UG 100 0 0 ens32
10.130.29.0 0.0.0.0 255.255.255.0 U 100 0 0 ens32
10.244.0.0 0.0.0.0 255.255.255.0 U 0 0 0 *
10.244.0.137 0.0.0.0 255.255.255.255 UH 0 0 0 calid3c6b0469a6
10.244.0.138 0.0.0.0 255.255.255.255 UH 0 0 0 calidbc2311f514
10.244.0.140 0.0.0.0 255.255.255.255 UH 0 0 0 califb4eac25ec6
10.244.1.0 10.130.29.81 255.255.255.0 UG 0 0 0 tunl0
10.244.2.0 10.130.29.82 255.255.255.0 UG 0 0 0 tunl0
В этом случае 10.244.0.0/16
- это CIDR Pod IP, а 10.130.29.81
- это узел в кластере.Вы можете себе представить, если у вас есть TCP-запрос к 10.244.1.141
, он будет отправлен на 10.130.29.81
, следуя седьмому правилу.И на 10.130.29.81
будет правило маршрута, подобное этому:
10.244.1.141 0.0.0.0 255.255.255.255 UH 0 0 0 cali4eac25ec62b
Это, наконец, отправит запрос на правильный Pod.
Я не уверен, почему демонnessesary, я думаю, демон должен предотвратить ручное удаление созданных им правил маршрута.
kube-proxy
Работа kube-proxy довольно проста, он просто перенаправляет запросы с IP-адреса кластера на PodIP.
kube-proxy имеет два режима, IPVS
и iptables
.Если ваш kube-proxy работает в режиме IPVS
, вы можете увидеть правила перенаправления, созданные kube-proxy, выполнив следующую команду на любом узле кластера:
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.96.0.1:443 rr
-> 10.130.29.80:6443 Masq 1 6 0
-> 10.130.29.81:6443 Masq 1 1 0
-> 10.130.29.82:6443 Masq 1 0 0
TCP 10.96.0.10:53 rr
-> 10.244.0.137:53 Masq 1 0 0
-> 10.244.0.138:53 Masq 1 0 0
...
В этом случае выможет видеть IP-адрес кластера по умолчанию CoreDNS 10.96.0.10
, а за ним находятся два реальных сервера с IP-адресом: 10.244.0.137
и 10.244.0.138
.
Это правило - то, что нужно создать для kube-прокси, и чтоСоздан kube-proxy. Режим
PS iptables
почти такой же, но правила iptables выглядят ужасно.Я не хочу вставлять это здесь.: Р