我有一个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://
。
防溅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我得到了
拒绝连接
如何解决? 谢谢
答案 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,这只是一个死胡同。