Подключение к сервису Splash на Kubernetes, GKE

У меня есть контроллер Python, который использует scrapy-splash lib, который отправляет SplashRequest службе Splash.

Локально я запускаю и контроллер, и сервис splash в двух разных докерах.

yield SplashRequest(url=response.url, callback=parse, splash_url=<URL> endpoint='execute', args=<SPLASH_ARGS>)

Когда я отправляю запрос локально с splash_url="http://127.0.0.1:8050, все работает нормально.

Теперь я хотел развернуть Kubernetes со Splash и обрабатывать запрос splash в облаке. Я создал Splash Deployment и службу с type=LoadBalancer в Google Cloud Kubernetes.

И отправив запрос заставки External Ip службы заставки.

Но splash не получает никаких запросов ... и в скрипте python я получаю

twisted.python.failure.Failure twisted.internet.error.TCPTimedOutError: Тайм-аут TCP-соединения: 60: Тайм-аут операции.

Раньше это работало при использовании Internal endpoint модуля, но я начал получать Missing schema исключение, потому что я не использовал http:// в URL-адресе.

  • всплеск изображения докеров scrapinghub / splash: 3.2
  • Kubernetes версии 1.7, (пробовал также на 1.9)

splash-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: my-app
  name: splash
  namespace: ns-app
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      labels:
        app: splash
    spec:
      containers:
      - image: scrapinghub/splash:3.2
        name: splash
        ports:
        - containerPort: 8050
        resources: {}
      restartPolicy: Always
status: {}

splash-service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: app
  name: splash
  namespace: ns-app
spec:
  type: LoadBalancer
  ports:
  - name: "8050"
    port: 8050
    targetPort: 8050
    protocol: TCP
  selector:
    app: app
status:
  loadBalancer: {}

ОБНОВЛЕНИЕ. Я заметил, что локально, когда я вхожу в http://localhost:8050/, я вижу пользовательский интерфейс Splash, а при входе на IP-адрес через Kubernetes я получаю

отказался подключиться

Как решить ?? Спасибо


person Ami Hollander    schedule 08.03.2018    source источник


Ответы (2)


Проблема в том, что селектор splash-service.yaml неправильный ... он должен указывать на имя развертывания.

apiVersion: v1
kind: Service
metadata:
  labels:
    app: app
  name: splash
  namespace: ns-app
spec:
  type: LoadBalancer
  ports:
  - name: "8050"
    port: 8050
    targetPort: 8050
    protocol: TCP
  selector:
    app: splash
status:
  loadBalancer: {}
person Ami Hollander    schedule 09.03.2018

ОБНОВЛЕНИЕ. Теперь я заметил, что вы сами нашли проблему, моя проблема.

Я считаю, что, поскольку Ами Холландер права, это проблема с селектором ярлыков, но я хотел бы объяснить вам, почему.

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

Сервисы Kubernetes могут быть доступны на внешних IP-адресах, которые маршрутизируются на один или несколько узлов кластера. Трафик, входящий в кластер с внешним IP-адресом (в качестве IP-адреса назначения) на сервисном порте, будет перенаправлен на одну из конечных точек сервиса.

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

$ kubectl get endpoints
$ Kubectl describe endpoints endpointname

Это может ввести в заблуждение, потому что, с другой стороны, если вы запустите

$ kubectl get services

вы заметите, что служба была создана правильно, показывая частный и общедоступный IP-адреса, что будет просто тупиком.

  • Вы смогли увидеть это правильно, потому что все работало, но запрос не был направлен правильным образом.
person GalloCedrone    schedule 09.03.2018
comment
Да, это объяснение очень хорошее и может мне очень помочь ... до того, как я потратил на это 4 часа: S Спасибо - person Ami Hollander; 12.03.2018