【问题标题】:Connection to Splash service on Kubernetes, GKE连接到 Kubernetes、GKE 上的 Splash 服务
【发布时间】:2018-03-08 08:34:14
【问题描述】:

我有一个 Python 控制器,它使用 scrapy-splash 库将 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 上使用type=LoadBalancer 创建了 Splash 部署和服务。

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

但是 splash 没有收到任何请求...并且在我得到的 python 脚本中

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

过去在使用 pod 的 Internal endpoint 时它可以工作,但我开始收到 Missing schema 异常,因为我没有在 url 中使用 http://

  • splash docker image 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 UI,而在通过 Kubernetes IP 进入时,我得到了

拒绝连接

怎么解决?? 谢谢

【问题讨论】:

    标签: docker kubernetes splash-screen scrapy-splash


    【解决方案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: {}
    

    【讨论】:

      【解决方案2】:

      更新我现在注意到你一个人发现了问题,我的错。

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

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

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

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

      $ kubectl get endpoints
      $ Kubectl describe endpoints endpointname
      

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

      $ kubectl get services
      

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

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

      【讨论】:

      • 是的,这个解释非常好,可以帮助我很多......在我浪费了 4 个小时之前:S 谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 2018-09-18
      • 1970-01-01
      • 2018-10-19
      • 2020-08-26
      • 2018-09-03
      • 1970-01-01
      相关资源
      最近更新 更多