Kubernetes: Calio не работает на удаленном рабочем месте, локально нормально

#kubernetes #project-calico #bgp

#kubernetes #проект-calico #bgp

Вопрос:

Я настраиваю кластер Kubernetes с помощью calico. Настройка «простая»

  • 1x master (локальная сеть, ок)
  • 1x узел (локальная сеть, ок)
  • 1x узел (облачный сервер, не в порядке)

Все проблемы debian с docker 19.03

На облачном сервере модули calico не отображаются:

calico-kube-controllers-token-x:

     Events:
  Type     Reason          Age                   From     Message
  ----     ------          ----                  ----     -------
  Normal   SandboxChanged  47m (x50 over 72m)    kubelet  Pod sandbox changed, it will be killed and re-created.
  Warning  FailedMount     43m                   kubelet  MountVolume.SetUp failed for volume "calico-kube-controllers-token-x" : failed to sync secret cache: timed out waiting for the condition
  Normal   SandboxChanged  3m41s (x78 over 43m)  kubelet  Pod sandbox changed, it will be killed and re-created.
 

calico-node-x:

       Warning  Unhealthy       43m (x5 over 43m)      kubelet  Liveness probe failed: calico/node is not ready: Felix is not live: Get "http://localhost:9099/liveness": dial tcp [::1]:9099: connect: connection refused
  Warning  Unhealthy       14m (x77 over 43m)     kubelet  Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/bird/bird.ctl: connect: no such file or directory
  Warning  BackOff         4m26s (x115 over 39m)  kubelet  Back-off restarting failed container
 

Я предполагаю, что что-то не так с конфигурацией IP / Network, но не выяснил, что именно.

  • Требуемые порты (k8s и BGP) пересылаются с маршрутизатора, также попробовал мастер, напрямую подключенный к Интернету
  • —control-plane-endpoint — это имя хоста и общедоступный разрешимый
  • Calico использует пиринг BGP (используя общедоступный ip в качестве однорангового узла)

Эта запись беспокоит меня больше всего:

  • отображает локальный ip: kubectl get —raw /api

Я безуспешно пытался найти способ изменить это на общедоступный IP-адрес мастера.

Кто-нибудь знает, что попробовать дальше?

Ответ №1:

После дополнительного времени, потраченного на анализ, проблема заключалась в том, что IP-адрес распределенного api был локальным, а не dns-именем.

Создал vpn с помощью wireguard от облачного узла к локальному мастеру, поэтому локальный IP-адрес мастера доступен с облачного узла.

Не знаю, является ли это самым чистым решением, но оно работает.

Ответ №2:

  1. Запустите эту команду, чтобы проверить, установлена ли IP_AUTODETECTION_METHOD переменная среды в calico daemonset
 kubectl get daemonset/calico-node -n kube-system --output json | jq '.spec.template.spec.containers[].env[] | select(.name | startswith("IP"))'
 
  1. Запустите эту команду на каждом из ваших узлов k8s, чтобы найти допустимый сетевой интерфейс
 ifconfig
 
  1. Явно задайте переменную IP_AUTODETECTION_METHOD среды, чтобы убедиться, что узел calico подключается к правильному сетевому интерфейсу узла K8s.
 kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=en.*