[Отказ от ответственности: этот вопрос был первоначально размещен на ServerFault . Однако, поскольку официальная документация K8s гласит «задайте свои вопросы по StackOverflow», я также добавляю их сюда]
Я пытаюсь развернуть тестовый кластер Kubernetes в Oracle Cloud, используя экземпляры виртуальной машины OCI - однако у меня возникают проблемы с сетью pod.
Сетевой плагин Calico - кажется, он установлен правильно, но трафик не проходит через туннели от одного хоста к другому. Например, здесь я пытаюсь получить доступ к nginx, запущенному на другом узле:
root@kube-01-01:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-dbddb74b8-th9ns 1/1 Running 0 38s 192.168.181.1 kube-01-06 <none>
root@kube-01-01:~# curl 192.168.181.1
[ ... timeout... ]
Используя tcpdump, я вижу пакеты IP-in-IP (протокол 4), покидающие первый хост, но, похоже, они никогда не доходят до второго (хотя все другие пакеты, включая трафик BGP, проходят через него нормально ).
root@kube-01-01:~# tcpdump -i ens3 proto 4 &
[1] 16642
root@kube-01-01:~# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
root@kube-01-01:~# curl 192.168.181.1
09:31:56.262451 IP kube-01-01 > kube-01-06: IP 192.168.21.64.52268 > 192.168.181.1.http: Flags [S], seq 3982790418, win 28000, options [mss 1400,sackOK,TS val 9661065 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
09:31:57.259756 IP kube-01-01 > kube-01-06: IP 192.168.21.64.52268 > 192.168.181.1.http: Flags [S], seq 3982790418, win 28000, options [mss 1400,sackOK,TS val 9661315 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
09:31:59.263752 IP kube-01-01 > kube-01-06: IP 192.168.21.64.52268 > 192.168.181.1.http: Flags [S], seq 3982790418, win 28000, options [mss 1400,sackOK,TS val 9661816 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
root@kube-01-06:~# tcpdump -i ens3 proto 4 &
[1] 12773
root@kube-01-06:~# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
То, что я проверил до сих пор:
- Сетка маршрутизации Calico подходит просто отлично. Я могу видеть трафик BGP при захвате пакета, и я могу видеть все узлы как "вверх", используя calicoctl
root @ kube-01-01: ~ # ./calicoctl статус узла
Ситцевый процесс запущен.
IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+-------------------+-------+----------+-------------+
| 10.13.23.123 | node-to-node mesh | up | 09:12:50 | Established |
| 10.13.23.124 | node-to-node mesh | up | 09:12:49 | Established |
| 10.13.23.126 | node-to-node mesh | up | 09:12:50 | Established |
| 10.13.23.129 | node-to-node mesh | up | 09:12:50 | Established |
| 10.13.23.127 | node-to-node mesh | up | 09:12:50 | Established |
| 10.13.23.128 | node-to-node mesh | up | 09:12:50 | Established |
| 10.13.23.130 | node-to-node mesh | up | 09:12:52 | Established |
+--------------+-------------------+-------+----------+-------------+
- Правила безопасности для подсети разрешают весь трафик. Все узлы находятся в одной подсети, и у меня есть правило без состояния, разрешающее весь трафик от других узлов в подсети (я также попытался добавить правило, разрешающее трафик IP-in-IP явно - тот же результат).
- Проверка источника / назначения отключена на всех vNIC на узлах K8.
Другие вещи, которые я заметил:
- Я могу заставить ситцевую камеру работать, если я отключу IP в инкапсуляции IP для трафика той же подсети и использую обычную маршрутизацию внутри подсети (как описано здесь для AWS)
- Другие сетевые плагины (например, weave) работают правильно.
Итак, мой вопрос здесь - что происходит с инкапсулированным трафиком IP-in-IP? Могу ли я проверить что-нибудь еще, чтобы выяснить, что происходит?
И да, я знаю, что мог бы использовать управляемый движок Kubernetes напрямую, но где в этом удовольствие (и возможность обучения)? : D
Отредактировано с учетом ответа Рико ниже:
1) Я также не получаю трафик pod-to-pod для прохождения (нет связи между модулями на разных хостах). Но мне не удалось захватить этот трафик, поэтому я использовал в качестве примера узел-к-моду.
2) Я также получаю аналогичный результат, если подключаю svc NodePort к другому узлу, нежели тот, на котором запущен модуль - я вижу исходящие пакеты IP-in-IP с первого узла, но они никогда не отображаются на втором узле (тот, на котором фактически запущен модуль):
root@kube-01-01:~# tcpdump -i ens3 proto 4 &
[1] 6499
root@kube-01-01:~# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
root@kube-01-01:~# curl 127.0.0.1:32137
20:24:08.460069 IP kube-01-01 > kube-01-06: IP 192.168.21.64.40866 > 192.168.181.1.http: Flags [S], seq 3175451438, win 43690, options [mss 65495,sackOK,TS val 19444115 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
20:24:09.459768 IP kube-01-01 > kube-01-06: IP 192.168.21.64.40866 > 192.168.181.1.http: Flags [S], seq 3175451438, win 43690, options [mss 65495,sackOK,TS val 19444365 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
20:24:11.463750 IP kube-01-01 > kube-01-06: IP 192.168.21.64.40866 > 192.168.181.1.http: Flags [S], seq 3175451438, win 43690, options [mss 65495,sackOK,TS val 19444866 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
20:24:15.471769 IP kube-01-01 > kube-01-06: IP 192.168.21.64.40866 > 192.168.181.1.http: Flags [S], seq 3175451438, win 43690, options [mss 65495,sackOK,TS val 19445868 ecr 0,nop,wscale 7], length 0 (ipip-proto-4)
Ничего на втором узле (kube-01-06
, тот, который фактически запускает модуль nginx):
root@kubespray-01-06:~# tcpdump -i ens3 proto 4
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
Я использовал 127.0.0.1 для простоты демонстрации - конечно, то же самое происходит, когда я нажимаю на этот NodePort с внешнего хоста:
20:25:17.653417 IP kube-01-01 > kube-01-06: IP 192.168.21.64.56630 > 192.168.181.1.http: Flags [S], seq 980178400, win 64240, options [mss 1440,nop,wscale 8,nop,nop,sackOK], length 0 (ipip-proto-4)
20:25:17.654371 IP kube-01-01 > kube-01-06: IP 192.168.21.64.56631 > 192.168.181.1.http: Flags [S], seq 3932412963, win 64240, options [mss 1440,nop,wscale 8,nop,nop,sackOK], length 0 (ipip-proto-4)
20:25:17.667227 IP kube-01-01 > kube-01-06: IP 192.168.21.64.56632 > 192.168.181.1.http: Flags [S], seq 2017119223, win 64240, options [mss 1440,nop,wscale 8,nop,nop,sackOK], length 0 (ipip-proto-4)
20:25:20.653656 IP kube-01-01 > kube-01-06: IP 192.168.21.64.56630 > 192.168.181.1.http: Flags [S], seq 980178400, win 64240, options [mss 1440,nop,wscale 8,nop,nop,sackOK], length 0 (ipip-proto-4)
20:25:20.654577 IP kube-01-01 > kube-01-06: IP 192.168.21.64.56631 > 192.168.181.1.http: Flags [S], seq 3932412963, win 64240, options [mss 1440,nop,wscale 8,nop,nop,sackOK], length 0 (ipip-proto-4)
20:25:20.668595 IP kube-01-01 > kube-01-06: IP 192.168.21.64.56632 > 192.168.181.1.http: Flags [S], seq 2017119223, win 64240, options [mss 1440,nop,wscale 8,nop,nop,sackOK], length 0 (ipip-proto-4)
3) Насколько я могу судить (пожалуйста, исправьте меня, если я здесь не прав), узлы осведомлены о маршрутах к сетям pod, и трафик pod-to-node также инкапсулирован IP -in-IP (обратите внимание на протокол 4 пакета в первом захвате выше)
root@kube-01-01:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
alpine-9d85bf65c-2wx74 1/1 Running 1 23m 192.168.82.194 kube-01-08 <none>
nginx-dbddb74b8-th9ns 1/1 Running 0 10h 192.168.181.1 kube-01-06 <none>
root@kube-01-01:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
<snip>
192.168.181.0 10.13.23.127 255.255.255.192 UG 0 0 0 tunl0