Внешний ip всегда <none>или <pending>в кубернетес - PullRequest
1 голос
/ 10 февраля 2020

Недавно я начал строить свой собственный кластер kubernetes, используя несколько Raspberry pi.

Я дошел до того, что у меня есть кластер, запущенный и работающий!

Некоторая справочная информация о том, как настроить кластер, я использовал это руководство

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

Следуя инструкциям по kubernetes, я развернул nginx, все работает нормально. когда я делаю переадресацию порта, я вижу страницу по умолчанию nginx на моем локальном хосте.

Теперь сложная часть, создание службы и маршрутизация трафика c из inte rnet через вход к службе.

Я выполнил следующую команду

kubectl expose deployment/nginx --type="NodePort" --port 80
kubectl expose deployment/nginx --type="Loadbalancer" --port 80

И это приводит к следующему.

NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP          25h
nginx        NodePort    10.103.77.5   <none>        80:30106/TCP   7m50s
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP        25h
nginx        LoadBalancer   10.107.233.191   <pending>     80:31332/TCP   4s

Внешний IP-адрес никогда не отображается , что делает для меня совершенно невозможным доступ к приложению из-за пределов кластера, выполнив curl some-ip:80, что, в конце концов, является единственной причиной для меня настроить этот кластер.

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

Примечание: я прочитал кое-что о LoadBalancer, это должно быть предоставлено облачным хостом. так как я бегу по RPI, я не думаю, что это будет работать для меня. но я считаю, что NodePort должен быть в порядке для маршрутизации с входом.

Также я знаю, что у меня должен быть какой-то входной контроллер для работы входа.

Редактировать

Итак, теперь у меня есть следующее для nodeport - 30168

$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        26h
nginx        NodePort    10.96.125.112   <none>        80:30168/TCP   6m20s

и для ip-адреса у меня есть либо 192.168.178.102 или 10.44.0.1

$ kubectl describe pod nginx-688b66fb9c-jtc98
Node:               k8s-worker-2/192.168.178.102
IP:                 10.44.0.1

Но когда я ввожу любой из этих IP-адресов в браузере с помощью узла порта, я все равно не вижу страницу nginx. я делаю что-то не так?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Любой из IP-адресов ваших рабочих узлов будет работать для службы NodePort (или LoadBalancer). Из описания NodePort услуг :

Если вы установите для поля type значение NodePort, плоскость управления Kubernetes назначит порт из диапазона, определенного --service-node-port-range флаг (по умолчанию: 30000-32767). Каждый узел передает этот порт (один и тот же номер порта на каждом узле) в вашу службу.

Если вы не знаете эти IP-адреса, вам может сообщить kubectl get nodes; если вы планируете вызывать их регулярно, то может быть полезно настроить балансировщик нагрузки перед кластером или настроить DNS (или оба!).

В вашем примере, скажем, какой-то узел имеет IP-адрес 10.20 .30.40 (вы входите в Raspberry PI напрямую и запускаете ifconfig, и это адрес хоста); Вы можете достичь nginx из второго примера на http://10.20.30.40:31332.

Поле EXTERNAL-IP никогда не будет заполнено для службы NodePort, или если вы не находитесь в облачной среде, которая может предоставить внешний балансировщик нагрузки для вас. Это не влияет на этот случай, для любого из этих типов услуг вы все равно можете напрямую вызывать порт на узле.

0 голосов
/ 10 февраля 2020

Поскольку вы не являетесь поставщиком облачных услуг, вам нужно использовать MetalLB , чтобы работали функции LoadBalancer.

Kubernetes не предлагает реализацию сетевых балансировщиков нагрузки (Услуги типа LoadBalancer) для голых металлических кластеров. Все реализации Network LB, с которыми поставляется Kubernetes, представляют собой связующий код, который обращается к различным платформам IaaS (GCP, AWS, Azure ...). Если вы не работаете на поддерживаемой платформе IaaS (GCP, AWS, Azure ...), LoadBalancers будет оставаться в состоянии «ожидания» неопределенно при создании. инструменты для переноса пользовательского трафика c в их кластеры, сервисы «NodePort» и «externalIPs». Оба эти варианта имеют существенные недостатки для производственного использования, что делает кластеры с голыми металлами вторым классом граждан в экосистеме Kubernetes.

MetalLB стремится исправить этот дисбаланс, предлагая реализацию Network LB, которая интегрируется со стандартным сетевым оборудованием, поэтому что внешние сервисы на голых металлических кластерах также «просто работают» в максимально возможной степени

Настройка MetalLB очень проста:

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

Это развернет MetalLB в вашем кластере в пространстве имен metallb-system

Вам необходимо создать configMap с диапазоном ip, который вы хотите использовать, создать файл с именем metallb-cf.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250 <= Select the range you want.

kubectl apply -f metallb-cf.yaml

Вот и все.

Для использования в ваших сервисах просто создайте с типом LoadBalancer, а MetalLB сделает все остальное. Если вы хотите настроить конфигурацию, см. здесь

MetalLB назначит IP для вашего сервиса / входа, но если вы находитесь в сети NAT, вам нужно настроить маршрутизатор для пересылки запросов для вашего входящего / служебного IP.

РЕДАКТИРОВАТЬ:

У вас проблема с получением внешнего IP с MetalLB, работающим на Raspberry Pi, попробуйте изменить iptables на устаревшую версию:

sudo sysctl net.bridge.bridge-nf-call-iptables=1
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

Ссылка: https://www.shogan.co.uk/kubernetes/building-a-raspberry-pi-kubernetes-cluster-part-2-master-node/

Надеюсь, это поможет.

...