连接到Kubernetes,GKE的Splash服务

时间:2018-03-08 08:34:15

标签: docker kubernetes splash scrapy-splash

我有一个Python控制器,它使用scrapy-splash lib将SplashRequest发送到Splash服务。

在本地,我在两个不同的Docker中运行控制器和启动服务。

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

当我使用splash_url="http://127.0.0.1:8050在本地发送请求时,一切正常。

现在,我希望在Splash中部署Kubernetes,并在云上处理启动请求。我在Google Cloud Kubernetes上创建了Splash Deployment和一个type=LoadBalancer的服务。

将启动请求发送到启动服务的External Ip

但是泼水没有收到任何请求......在python脚本中我得到了

  

twisted.python.failure.Failure twisted.internet.error.TCPTimedOutError:TCP连接超时:60:操作超时。

过去使用pod Internal endpoint时有效,但我开始Missing schema例外,因为我没有在网址中使用http://

  • splash docker image scrapinghub / splash:3.2
  • Kubernetes 1.7版,(也试过1.9版)

防溅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: {}

防溅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 UI,同时进入了通过Kubernetes IP我得到了

  

拒绝连接

如何解决? 谢谢

2 个答案:

答案 0 :(得分:1)

问题是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: {}

答案 1 :(得分:1)

更新我现在注意到你发现了这个问题,我的不好。

我相信Ami Hollander是对的,这是标签选择器的问题,但我想解释一下原因。

考虑每次使用选择器创建service时,也会创建一个端点资源,它会填充具有与标签匹配的pod的节点的所有地址,您也可以手动添加任何指向外部资源的IP或域。

Kubernetes服务可以在路由到一个或多个集群节点的externalIP上公开。在服务端口上使用外部IP(作为目标IP)进入群集的流量将路由到其中一个服务端点。

因此,正如他们指出的那样,您的选择器不匹配任何pod,并且端点资源可能不包含任何后端,因此以任何方式路由请求。您可以仔细检查它是否正在运行:

$ kubectl get endpoints
$ Kubectl describe endpoints endpointname

这可能会产生误导,因为另一方面,如果你运行

$ kubectl get services

您会注意到该服务已正确创建,显示私人和公共IP,这只是一个死胡同。

  • 您能够正确地看到它,因为一切正常,但请求没有以正确的方式路由。