Kubernetes (docker-desktop) с несколькими сервисами LoadBalancer

Верно ли, что у меня не может быть двух служб LoadBalancer в кластере докер-десктоп (osx), потому что они обе будут использовать localhost (и все порты перенаправляются)?

Я создал пример, и последней службе никогда не назначается внешний IP-адрес, но она остается в состоянии pending. Однако первый доступен на localhost.

> kubectl get all     
NAME                                       READY   STATUS    RESTARTS   AGE
pod/whoami-deployment-9f9c86c4f-l5lkj      1/1     Running   0          28s
pod/whoareyou-deployment-b896ddb9c-lncdm   1/1     Running   0          27s
pod/whoareyou-deployment-b896ddb9c-s72sc   1/1     Running   0          27s

NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes          ClusterIP      10.96.0.1       <none>        443/TCP        95s
service/whoami-service      LoadBalancer   10.97.171.139   localhost     80:30024/TCP   27s
service/whoareyou-service   LoadBalancer   10.97.171.204   <pending>     80:32083/TCP   27s

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/whoami-deployment      1/1     1            1           28s
deployment.apps/whoareyou-deployment   2/2     2            2           27s

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/whoami-deployment-9f9c86c4f      1         1         1       28s
replicaset.apps/whoareyou-deployment-b896ddb9c   2         2         2       27s

Подробное описание whoareyou-сервиса:

kubectl describe service whoareyou-service
Name:                     whoareyou-service
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"whoareyou-service","namespace":"default"},"spec":{"ports":[{"name...
Selector:                 app=whoareyou
Type:                     LoadBalancer
IP:                       10.106.5.8
Port:                     http  80/TCP
TargetPort:               80/TCP
NodePort:                 http  30333/TCP
Endpoints:                10.1.0.209:80,10.1.0.210:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

person Daniel    schedule 19.12.2019    source источник
comment
Не могли бы вы describe service whoareyou-service?   -  person mario    schedule 19.12.2019
comment
Можете ли вы получить доступ к двум портам NodePort localhost:30024 и localhost:32083 с консоли на том же физическом хосте? Я почти уверен, что настольные приложения Docker не могут создать балансировщик нагрузки для служб типа LoadBalancer, поэтому они будут действовать так же, как службы NodePort.   -  person David Maze    schedule 20.12.2019
comment
@DavidMaze, вы имеете в виду, как с Minikube, который вообще не поддерживает LoadBalancers? Но нет, я не могу получить к ним доступ.   -  person Daniel    schedule 20.12.2019
comment
@mario Я добавил вывод к вопросу   -  person Daniel    schedule 20.12.2019
comment
Работает, наверное, точно так же, как в Minikube. Поскольку docker-desktop не может предоставить реальный LoadBalancer, он все еще может имитировать создание службы такого типа с помощью NodePort (это легко увидеть по диапазону портов, который он использует). Я почти уверен, что вы не можете использовать тот же IP-адрес, что и ExternalIP службы LoadBalancer, и если вы создадите еще один Service такого типа, у вашего рабочего стола докера не останется другого выбора, кроме как использовать ваш локальный хост еще раз. Поскольку он уже используется другим Service, он не может использоваться другим и поэтому остается в состоянии ожидания.   -  person mario    schedule 20.12.2019
comment
Обратите внимание, что если вы создаете реальный LoadBalancer в облачной среде, каждый раз, когда предоставляется новый IP-адрес, и нет ситуации, когда следующий LoadBalancer, который вы создаете, получит тот же IP-адрес, который уже используется существующим. По-видимому, здесь он не может использовать какой-либо другой IP-адрес, кроме localhost, и этот уже используется. В любом случае я бы порекомендовал вам просто использовать NodePort, если вы хотите открыть свой Deployment внешнему миру.   -  person mario    schedule 20.12.2019


Ответы (2)


Я решил скопировать свои комментарии, так как они частично объясняют проблему, и сделать из них Community Wiki ответ, чтобы они были более четко видны и доступны для возможного дальнейшего редактирования сообществом:

Вероятно, это работает точно так же, как в Minikube. Поскольку docker-desktop не может предоставить реальный LoadBalancer, он все еще может "имитировать" создание Service такого типа с помощью NodePort (это легко увидеть по используемому диапазону портов). Я почти уверен, что вы не можете использовать тот же IP-адрес, что и ExternalIP LoadBalancer Service, и если вы создадите еще один Service такого типа, у вашего docker-desktop не будет другого выбора, кроме как использовать ваш localhost больше времени. Поскольку он уже используется одним Service, он не может использоваться другим и поэтому остается в pending state.

Обратите внимание, что если вы создаете реальный LoadBalancer в облачной среде, каждый раз, когда предоставляется новый IP-адрес, и нет ситуации, когда следующий LoadBalancer, который вы создаете, получит тот же IP-адрес, который уже используется существующим. Очевидно, здесь он не может использовать какой-либо другой IP-адрес, кроме одного из localhost, а этот уже используется. В любом случае, я бы порекомендовал вам просто использовать NodePort, если вы хотите открыть свой Deployment внешнему миру.

person Community    schedule 20.01.2020

Подумайте об использовании вместо этого контроллера Ingress.

Итак, в основном, это 3 шага после установки docker-desktop:

  1. Сертификат Wilcard на месте
  2. SSL-сертификат для локального env
  3. Установить Ingress Controller

Подробно здесь: https://github.com/kubernetes-tn/guideline-kubernetes-enterprise/blob/master/general/desktop-env-setup.md

person Abdennour TOUMI    schedule 09.02.2021