Поды не могут пинговать друг друга в кластере Kubernetes, созданном на узлах из двух разных подсетей

Я пытаюсь создать локальный кластер k8 с помощью kubespray с 3 главными и 5 рабочими узлами. IP-адреса узлов относятся к 2 различным подсетям.

Инвентарь Ansible:

hosts:
saba-k8-vm-m1:
  ansible_host: 192.168.100.1
  ip: 192.168.100.1
  access_ip: 192.168.100.1
saba-k8-vm-m2:
  ansible_host: 192.168.100.2
  ip: 192.168.100.2
  access_ip: 192.168.100.2
saba-k8-vm-m3:
  ansible_host: 192.168.200.1
  ip: 192.168.200.1
  access_ip: 192.168.200.1
saba-k8-vm-w1:
  ansible_host: 192.168.100.3
  ip: 192.168.100.3
  access_ip: 192.168.100.3
saba-k8-vm-w2:
  ansible_host: 192.168.100.4
  ip: 192.168.100.4
  access_ip: 192.168.100.4
saba-k8-vm-w3:
  ansible_host: 192.168.100.5
  ip: 192.168.100.5
  access_ip: 192.168.100.5
saba-k8-vm-w4:
  ansible_host: 192.168.200.2
  ip: 192.168.200.2
  access_ip: 192.168.200.2
saba-k8-vm-w5:
  ansible_host: 192.168.200.3
  ip: 192.168.200.3
  access_ip: 192.168.200.3


children:
    kube-master:
      hosts:
        saba-k8-vm-m1:
        saba-k8-vm-m2:
        saba-k8-vm-m3:
    kube-node:
      hosts:
        saba-k8-vm-w1:
        saba-k8-vm-w2:
        saba-k8-vm-w3:
        saba-k8-vm-w4:
        saba-k8-vm-w5:

Затем я создал dnsutils - kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml Это на w1 worker. Он может искать имя svc (я создал модули elasticsearch на w2)

root@saba-k8-vm-m1:/opt/bitnami# kubectl get svc -n kube-system
    NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
    coredns                     ClusterIP   10.233.0.3      <none>        53/UDP,53/TCP,9153/TCP   6d3h
        
root@saba-k8-vm-m1:/opt/bitnami# kubectl exec -it dnsutils sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
/ #

/ # nslookup elasticsearch-elasticsearch-data.lilac-efk.svc.cluster.local. 10.233.0.3
Server:         10.233.0.3
Address:        10.233.0.3#53

Name:   elasticsearch-elasticsearch-data.lilac-efk.svc.cluster.local
Address: 10.233.49.187

Затем я создал тот же модуль dnsutils на w5 (подсеть .200). nslookup не справляется с этим.

root@saba-k8-vm-m1:/opt/bitnami# kubectl exec -it dnsutils sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
/ #
/ # ^C
/ # nslookup elasticsearch-elasticsearch-data.lilac-efk.svc.cluster.local 10.233.0.3
;; connection timed out; no servers could be reached
    
/ # exit
command terminated with exit code 1

Журналы от nodelocaldns, запущенного на w5:

 [ERROR] plugin/errors: 2 elasticsearch-elasticsearch-data.lilac-efk.lilac-efk.svc.cluster.local. AAAA: dial tcp 10.233.0.3:53: i/o timeout
 [ERROR] plugin/errors: 2 elasticsearch-elasticsearch-data.lilac-efk.lilac-efk.svc.cluster.local. A: dial tcp 10.233.0.3:53: i/o timeout
    

Из контейнера dnsutils я не могу получить доступ к IP-адресам контейнера coredns в другой подсети через оверлейную сеть. Кластер создается с помощью Calico.

 root@saba-k8-vm-m1:/opt/bitnami# kubectl get pods -n kube-system -o wide | grep coredns
    pod/coredns-dff8fc7d-98mbw                        1/1     Running   3          6d2h    10.233.127.4    saba-k8-vm-m2   <none>           <none>
    pod/coredns-dff8fc7d-cwbhd                        1/1     Running   7          6d2h    10.233.74.7     saba-k8-vm-m1   <none>           <none>
    pod/coredns-dff8fc7d-h4xdd                        1/1     Running   0          2m19s   10.233.82.6     saba-k8-vm-m3   <none>           <none>
        
 root@saba-k8-vm-m1:/opt/bitnami# kubectl exec -it dnsutils sh
 kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
 / # ping 10.233.82.6
 PING 10.233.82.6 (10.233.82.6): 56 data bytes
 64 bytes from 10.233.82.6: seq=0 ttl=62 time=0.939 ms
 64 bytes from 10.233.82.6: seq=1 ttl=62 time=0.693 ms
 ^C
 --- 10.233.82.6 ping statistics ---
 2 packets transmitted, 2 packets received, 0% packet loss
 round-trip min/avg/max = 0.693/0.816/0.939 ms
 / # ping 10.233.74.7
 PING 10.233.74.7 (10.233.74.7): 56 data bytes
 ^C
 --- 10.233.74.7 ping statistics ---
 4 packets transmitted, 0 packets received, 100% packet loss
 / # ping 10.233.127.4
 PING 10.233.127.4 (10.233.127.4): 56 data bytes
 ^C
 --- 10.233.127.4 ping statistics ---
 2 packets transmitted, 0 packets received, 100% packet loss

kube_service_addresses: 10.233.0.0/18 kube_pods_subnet: 10.233.64.0/18

Из-за этого поведения fluentd, запущенный как демон, установленный на всех 5 рабочих процессах, находится в CrashLoopBack, поскольку он не может разрешить имя svc elasticsearch.

Что мне не хватает? Любая помощь приветствуется.


person Raji    schedule 08.04.2021    source источник
comment
Установлены ли IPIP-каналы Calico на каждом сервере? sudo calicoctl.sh node status. Вы видите все эти IP-адреса с помощью этой команды на каждом сервере? ip r | grep tunl. Можете ли вы пинговать эти IP-адреса с любого сервера на любой сервер? Вы видите какие-либо проблемы в журнале Calico pods?   -  person laimison    schedule 08.04.2021


Ответы (1)


Спасибо @ laimison за то, что дал мне эти указатели.

Размещаю все свои наблюдения, чтобы они могли кому-нибудь пригодиться.

On M1,

root@saba-k8-vm-m1:~# ip r | grep tunl
10.233.72.0/24 via 192.168.100.5 dev tunl0 proto bird onlink
10.233.102.0/24 via 192.168.100.4 dev tunl0 proto bird onlink
10.233.110.0/24 via 192.168.100.3 dev tunl0 proto bird onlink
10.233.127.0/24 via 192.168.100.2 dev tunl0 proto bird onlink

root@saba-k8-vm-m1:~# sudo calicoctl.sh node status
Calico process is running.
IPv4 BGP status
+---------------+-------------------+-------+------------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |   SINCE    |    INFO     |
+---------------+-------------------+-------+------------+-------------+
| 192.168.100.2 | node-to-node mesh | up    | 2021-04-06 | Established |
| 192.168.200.1 | node-to-node mesh | start | 2021-04-06 | Passive     |
| 192.168.100.3 | node-to-node mesh | up    | 2021-04-06 | Established |
| 192.168.100.4 | node-to-node mesh | up    | 2021-04-06 | Established |
| 192.168.100.5 | node-to-node mesh | up    | 2021-04-06 | Established |
| 192.168.200.2 | node-to-node mesh | start | 2021-04-06 | Passive     |
| 192.168.200.3 | node-to-node mesh | start | 2021-04-06 | Passive     |
+---------------+-------------------+-------+------------+-------------+
IPv6 BGP status
No IPv6 peers found.

On M3,

lilac@saba-k8-vm-m3:~$ ip r | grep tunl
10.233.85.0/24 via 192.168.200.3 dev tunl0 proto bird onlink
10.233.98.0/24 via 192.168.200.2 dev tunl0 proto bird onlink

lilac@saba-k8-vm-m3:~$ sudo calicoctl.sh node status
Calico process is running.
IPv4 BGP status
+---------------+-------------------+-------+------------+--------------------------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |   SINCE    |              INFO              |
+---------------+-------------------+-------+------------+--------------------------------+
| 192.168.100.1 | node-to-node mesh | start | 2021-04-06 | Active Socket: Connection      |
|               |                   |       |            | reset by peer                  |
| 192.168.100.2 | node-to-node mesh | start | 2021-04-06 | Active Socket: Connection      |
|               |                   |       |            | closed                         |
| 192.168.100.3 | node-to-node mesh | start | 2021-04-06 | Active Socket: Connection      |
|               |                   |       |            | closed                         |
| 192.168.100.4 | node-to-node mesh | start | 2021-04-06 | Active Socket: Connection      |
|               |                   |       |            | closed                         |
| 192.168.100.5 | node-to-node mesh | start | 2021-04-06 | Active Socket: Connection      |
|               |                   |       |            | closed                         |
| 192.168.200.2 | node-to-node mesh | up    | 2021-04-06 | Established                    |
| 192.168.200.3 | node-to-node mesh | up    | 2021-04-06 | Established                    |
+---------------+-------------------+-------+------------+--------------------------------+
IPv6 BGP status
No IPv6 peers found.

На M1 192.168.200.2 и 192.168.200.3 пассивны. На M3 заметил Active Socket: подключение для всех .100 IP. Это говорит о том, что M3 пытается установить соединение BGP, но не может пройти.

Мне удалось telnet 192.168.100.x 179 из М3.

Проверив журнал calico pod и дамп узла при запуске /usr/local/bin/calicoctl.sh node diags на M1, я мог видеть

bird: BGP: Unexpected connect from unknown address 10.0.x.x (port 53107)

10.0.x.x - это управляющий IP-адрес сервера, на котором размещены виртуальные машины .200. Делал исходный NAT.

Я добавил это правило:

-A POSTROUTING ! -d 192.168.0.0/16 -j SNAT --to-source 10.0.x.x

Это решило проблему.

root@saba-k8-vm-m1:/tmp/calico050718821/diagnostics/logs# /usr/local/bin/calicoctl.sh node status
Calico process is running.

IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+---------------+-------------------+-------+----------+-------------+
| 192.168.100.2 | node-to-node mesh | up    | 08:08:38 | Established |
| 192.168.200.1 | node-to-node mesh | up    | 08:09:15 | Established |
| 192.168.100.3 | node-to-node mesh | up    | 08:09:24 | Established |
| 192.168.100.4 | node-to-node mesh | up    | 08:09:02 | Established |
| 192.168.100.5 | node-to-node mesh | up    | 08:09:47 | Established |
| 192.168.200.2 | node-to-node mesh | up    | 08:08:55 | Established |
| 192.168.200.3 | node-to-node mesh | up    | 08:09:37 | Established |
+---------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

Другие вещи, которые я пробовал:

Я обновил ipipMode на всех узлах. Это не решает проблему, но помогает повысить производительность.

sudo /usr/local/bin/calicoctl.sh patch ippool default-pool -p '{"spec":{"ipipMode": "CrossSubnet"}}'
Successfully patched 1 'IPPool' resource

Я сослался на calico / node не готово: BIRD не готов: BGP не установлен и установите interface = ens3, хотя это единственный интерфейс на моих виртуальных машинах. Опять же, это не решает проблему, но поможет, когда на узле ситца есть несколько интерфейсов.

person Raji    schedule 09.04.2021
comment
Я столкнулся с аналогичной проблемой, и я мог вспомнить настройку какой-то IP Masquerade на физическом хосте, на котором размещены виртуальные машины для узлов Kubernetes Master + Worker. Не могли бы вы посоветовать, добавляли ли вы указанное выше правило iptables на физическом хосте или узлах Kubernetes, поскольку я больше не вижу правил POSTROUTING на физических хостах, но есть несколько на основных и рабочих узлах, которые генерируются Kubernetes для сетей Calico? - person Shoaib Khan; 15.07.2021
comment
Я добавил вышеупомянутое правило POSTROUTING на физический хост (тот, на котором размещены виртуальные машины .200) - person Raji; 16.07.2021