Рейтинг:0

Обертывание Kubernetes с помощью Wireguard

флаг us
TRW

У меня есть сценарий с множеством разных узлов. У некоторых есть общедоступный IPv4, у некоторых есть IPv6, у некоторых есть двойной стек. Поэтому я создал сеть wireguard (10.11.12.0/24), чтобы любой одноранговый узел мог связаться с любым другим внутри частной сети в отношении IP-стека и местоположения. Я хотел бы построить Kubernetes поверх этих сетей wireguard.

Я построил небольшой тестовый кластер...

общедоступный IP-адрес узла wireguard ip
вм1 192.168.10.10 10.11.12.10
вм2 192.168.10.11 10.11.12.11
вм3 192.168.10.12 10.11.12.12
...

... на моей локальной игровой площадке с kubeadm 1.23.5 на основе docker.io (по умолчанию в Debian):

vm01> kubeadm init --apiserver-advertise-address=10.11.12.10 --pod-network-cidr=10.20.0.0/16
vm01> kubectl применить -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml
vm01> kubectl применить -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
...
все узлы> kubeadm join 10.11.12.10:6443 --token ... --discovery-token-ca-cert-hash sha256:...
...
vm01> helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace

Когда я смотрю с vm1 на vm2 через tcpdump -n хост 192.168.10.11, я вижу только трафик через пакеты UDP wireguard. Отлично...

Затем я определил простое развертывание, службу, ClusterIP, Ingress и развернул.

---
apiVersion: приложения/v1
вид: развертывание
метаданные:
  имя: kubernetes-tutorial-deployment
спецификация:
  реплики: 2
  селектор:
    метки соответствия:
      приложение: kubernetes-tutorial-deployment
  шаблон:
    метаданные:
      этикетки:
        приложение: kubernetes-tutorial-deployment
    спецификация:
      контейнеры:
      - имя: kubernetes-tutorial-application
        изображение: auth0blog/kubernetes-tutorial
        порты:
          - контейнерПорт: 3000
---
апиВерсия: v1
вид: сервис
метаданные:
  имя: kubernetes-tutorial-cluster-ip
спецификация:
  порты:
  - порт: 80
    протокол: TCP
    целевой порт: 3000
  селектор:
    приложение: kubernetes-tutorial-deployment
  тип: КластерIP
---
Версия API: networking.k8s.io/v1
вид: Вход
метаданные:
  имя: kubernetes-tutorial-ingress
спецификация:
  ingressClassName: nginx
  правила:
  - хост: test.example.com
    http:
      пути:
      - дорожка: /
        тип пути: префикс
        серверная часть:
          оказание услуг:
            имя: kubernetes-tutorial-cluster-ip
            порт:
              номер: 80

Когда я проверяю браузер, я получаю ответ. Но...

Ответ очень медленный (я могу подтвердить с помощью простого завитка, сервису требуется 10-20 секунд, чтобы ответить на один запрос - это странно медленно для такого простого развертывания.

Когда я смотрю через tcpdump, я вижу трафик вне сети wireguard, что гораздо более странно.

18:39:18.341836 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 128
18:39:18.344382 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 176
18:39:18.344563 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 1452
18:39:18.344571 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 1452
18:39:18.344572 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 1452
18:39:18.344573 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 96
18:39:18.344711 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:18.344711 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:18.344711 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:20.566833 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 128
18:39:20.566833 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 592
18:39:20.567003 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 96
18:39:20.570978 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 128
18:39:20.571309 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:20.572538 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 176
18:39:20.572566 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 592
18:39:20.572764 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:20.572764 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:23.540401 ARP, запрос, у кого есть 192.168.10.11 скажите 192.168.10.10, длина 28
18:39:23.540646 ARP, ответ 192.168.10.11 is-at 7a:1d:d9:fc:fa:eb, длина 28
18:39:23.608703 IP 192.168.10.10.42274 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.5.55222 > 10.20.4.2.3000: флаги [S], seq 3011291899, win 64860, параметры [mss 1410,sackOK,TS val 2531657982 ecr 0,nop,wscale 7], длина 0
18:39:23.609071 IP 192.168.10.11.59205 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.3000 > 10.20.0.5.55222: флаги [S.], seq 1444377380, ack 3011291900, win 64308, параметры [mss 1410,sackOK,TS val 2546470618 ecr 2531657982],nop,w0scale 7
18:39:23.609112 IP 192.168.10.10.42274 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.5.55222 > 10.20.4.2.3000: Флаги [.], ack 1, win 507, параметры [nop,nop,TS val 2531657983 ecr 2546470618], длина 0
18:39:23.609140 IP 192.168.10.10.42274 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.5.55222 > 10.20.4.2.3000: Флаги [P.], seq 1:749, ack 1, win 507, опции [nop,nop,TS val 2531657983 ecr 2546470618], длина 748
18:39:23.609370 IP 192.168.10.11.59205 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.3000 > 10.20.0.5.55222: Флаги [.], ack 749, win 501, параметры [nop,nop,TS val 2546470618 ecr 2531657983], длина 0
18:39:23.610441 IP 192.168.10.11.36593 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.33592 > 10.20.0.2.53: 53349+ А? test.example.com.default.svc.cluster.local. (60)
18:39:23.610713 IP 192.168.10.10.58646 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.2.53 > 10.20.4.2.33592: 53349 NXDomain*- 0/1/0 (153)
18:39:23.611018 IP 192.168.10.11.32846 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.40077 > 10.20.0.2.53: 57710+ А? test.example.com.svc.cluster.local. (52)
18:39:23.611134 IP 192.168.10.10.41066 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.2.53 > 10.20.4.2.40077: 57710 NXDomain*- 0/1/0 (145)
18:39:23.611427 IP 192.168.10.11.51546 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.59046 > 10.20.0.3.53: 18849+ А? test.example.com.cluster.local. (48)
18:39:23.611567 IP 192.168.10.10.39789 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.3.53 > 10.20.4.2.59046: 18849 NXDomain*- 0/1/0 (141)
18:39:23.611831 IP 192.168.10.11.50067 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.34442 > 10.20.0.3.53: 49768+ А? test.example.com.sol.system. (45)
18:39:25.329861 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 208
18:39:25.330138 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:25.613106 IP 192.168.10.10.52981 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.3.53 > 10.20.4.2.34442: 49768 ServFail- 0/0/0 (45)
18:39:25.613542 IP 192.168.10.11.33388 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.59146 > 10.20.0.3.53: 49768+ А? test.example.com.sol.system. (45)
18:39:27.021478 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 224
18:39:27.021876 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:27.614533 IP 192.168.10.10.48157 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.3.53 > 10.20.4.2.59146: 49768 ServFail- 0/0/0 (45)
18:39:27.614906 IP 192.168.10.11.52721 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.33596 > 10.20.0.3.53: 32196+ А? test.example.com. (34)
18:39:28.500696 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 128
18:39:28.503146 ​​IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 256
18:39:28.503158 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 1452
18:39:28.503159 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 1452
18:39:28.503161 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 1452
18:39:28.503162 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 96
18:39:28.503453 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:28.503453 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:28.503453 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:28.503453 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:28.503453 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:28.627012 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 128
18:39:28.627292 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 128
18:39:28.627636 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:29.615282 IP 192.168.10.10.52590 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.3.53 > 10.20.4.2.33596: 32196 ServFail- 0/0/0 (34)
18:39:29.615672 IP 192.168.10.11.37175 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.50957 > 10.20.0.3.53: 32196+ А? test.example.com. (34)
18:39:29.877400 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 192
18:39:29.877722 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:30.898243 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 128
18:39:30.898243 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 592
18:39:30.898330 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 96
18:39:30.902126 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 128
18:39:30.902362 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:30.903556 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 176
18:39:30.903696 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 592
18:39:30.904023 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:30.904023 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96
18:39:31.617136 IP 192.168.10.10.38253 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.3.53 > 10.20.4.2.50957: 32196 ServFail- 0/0/0 (34)
18:39:31.619778 IP 192.168.10.11.59205 > 192.168.10.10.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.4.2.3000 > 10.20.0.5.55222: флаги [P.], seq 1:114, ack 749, win 501, опции [nop,nop,TS val 2546478629 ecr 2531657983], длина 113
18:39:31.619911 IP 192.168.10.10.42274 > 192.168.10.11.8472: OTV, флаги [I] (0x08), оверлей 0, экземпляр 1
IP 10.20.0.5.55222 > 10.20.4.2.3000: флаги [.], ack 114, win 507, параметры [nop,nop,TS val 2531665993 ecr 2546478629], длина 0
18:39:33.434382 IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 128
18:39:33.434488 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 96
18:39:33.434537 IP 192.168.10.10.59120 > 192.168.10.11.59120: UDP, длина 128
18:39:33.434860 ​​IP 192.168.10.11.59120 > 192.168.10.10.59120: UDP, длина 96

Какова возможная причина, почему ответ такой медленный в сети LAN.Это из-за неправильной маршрутизации на «общедоступные» IP-адреса вместо использования IP-адреса wireguard? Можно ли настроить Kubernetes для использования адреса wireguard для порта 8472?

Рейтинг:0
флаг us
TRW

Хорошо, я нашел решение.

  1. Я протестировал установку кластера без Wireguard. И в этом случае приложение auth0blog/kubernetes-учебник также зависает на несколько секунд. Поэтому я переключился на простой http-сервис nginx, который отвечает в ожидаемое время.
  2. Порт 8472 используется фланелью. На Github есть проблемы (с 2018 года...), показывающие, что он по умолчанию использует внешний сетевой интерфейс. Он должен быть настроен для использования интерфейса wireguard. Видеть https://github.com/rancher/rancher/issues/15133 и https://github.com/rancher/rancher/issues/14721#issuecomment-417913067

Итак, на самом деле это более или менее дубликат https://stackoverflow.com/questions/66449289/is-there-any-way-to-bind-k3s-flannel-to-another-interface

И поскольку я новичок в Kubernetes, мне было интересно, как изменить это значение в заданных мной командах (см. вопрос).Документация говорит только о параметрах, но не говорит, как и где их установить. Я огляделся и нашел https://stackoverflow.com/questions/47845739/configuring-flannel-to-use-a-non-default-interface-in-kubernetes

Там вы можете увидеть, что решение состоит в том, чтобы загрузить flannel.yml и добавить параметр --iface=wg_k8s в этот файл в правильном месте. В текущей версии (2022) находится в строке 200+.

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

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