#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:
- Запустите эту команду, чтобы проверить, установлена ли
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"))'
- Запустите эту команду на каждом из ваших узлов k8s, чтобы найти допустимый сетевой интерфейс
ifconfig
- Явно задайте переменную
IP_AUTODETECTION_METHOD
среды, чтобы убедиться, что узел calico подключается к правильному сетевому интерфейсу узла K8s.
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=en.*