Kubectl port-forward игнорирует службы loadBalance? - PullRequest
1 голос
/ 28 января 2020

Моя среда: Ma c dev-машина с последней версией Minikube / Docker

Я создал (локально) простой docker образ с простым Django REST API "hello world" .I Я запускаю развертывание с 3 репликами. Это мой yaml файл для его определения:

apiVersion: v1
kind: Service
metadata:
  name: myproj-app-service
  labels:
    app: myproj-be
spec:
  type: LoadBalancer
  ports:
    - port: 8000
  selector:
    app: myproj-be
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myproj-app-deployment
  labels:
    app: myproj-be
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myproj-be
  template:
    metadata:
      labels:
        app: myproj-be
    spec:
      containers:
        - name: myproj-app-server
          image: myproj-app-server:4
          ports:
            - containerPort: 8000
          env:
            - name: DATABASE_URL
              value: postgres://myname:@10.0.2.2:5432/myproj2
            - name: REDIS_URL
              value: redis://10.0.2.2:6379/1

Когда я применяю это yaml, оно генерирует вещи правильно. - одно развертывание - одно обслуживание - три модуля

Развертывания:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
myproj-app-deployment   3/3     3            3           79m

Службы:

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes         ClusterIP      10.96.0.1     <none>        443/TCP          83m
myproj-app-service   LoadBalancer   10.96.91.44   <pending>     8000:31559/TCP   79m

Отделения:

NAME                                   READY   STATUS    RESTARTS   AGE
myproj-app-deployment-77664b5557-97wkx   1/1     Running   0          48m
myproj-app-deployment-77664b5557-ks7kf   1/1     Running   0          49m
myproj-app-deployment-77664b5557-v9889   1/1     Running   0          49m

Интересное Дело в том, что когда я SSH в Minikube и нажимаю на сервис, используя curl 10.96.91.44:8000, он учитывает тип сервиса LoadBalancer и вращается между всеми тремя модулями, когда я снова и снова нажимаю на конечные точки. Я могу видеть, что в возвращенных результатах, которые я обязательно включил в HOSTNAME модуля.

Однако, когда я пытаюсь получить доступ к услуге с моего хостинга Ma c - используя kubectl port-forward service/myproj-app-service 8000:8000 - - Каждый раз, когда я достигаю конечной точки, я получаю один и тот же модуль для ответа. Это не загружает баланс. Я ясно вижу это, когда я kubectl logs -f <pod> обращаюсь ко всем трем модулям, и только один из них обрабатывает попадания, поскольку два других бездействуют ...

Это ограничение kubectl port-forward или проблема? или я что-то здесь упускаю?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

API kubernetes предоставляет только Операции переадресации через порт (CREATE и GET). Подобные операции API не существуют для конечных точек Сервиса.

Таким образом, я бы сказал, kubectl ищет Pod из служебной информации, предоставленной в командной строке, и перенаправляет напрямую в Pod, а не перенаправляет на порт ClusterIP / Service и позволяет кластеру балансировать нагрузку службы как обычный сервис трафик c.

kubectl code

Вот небольшой фрагмент потока кода kubectl, который, кажется, подтверждает это (я просто добавлю, что Go не является моей основной language)

Portforward . go Complete функция - это место, где kubectl portforward в первый раз ищет модуль из опций через AttachablePodForObjectFn:

AttachablePodForObjectFn определяется как attachablePodForObject в этом интерфейсе , тогда вот функция attachablePodForObject .

На мой ( неопытный) Go глазами, кажется, attachablePodForObject - это то, что kubectl использует для поиска Pod для службы, определенной в командной строке.

Затем оттуда на все, что связано с заполнением в Pod Pod c PortForwardOptions (не включает в себя услугу) и передается в API kubernetes.

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

Причина была в том, что мои модули случайно находились в аварийном состоянии из-за файлов Python * .py c, которые оставались в контейнере. Это вызывает проблемы, когда Django работает в многопостовом развертывании Kubernetes. Как только я удалил эту проблему, и все модули успешно запустились, циклический перебор начал работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...