我有以下服务配置:
kind: Service
apiVersion: v1
metadata:
name: web-srv
spec:
type: NodePort
selector:
app: userapp
tier: web
ports:
- protocol: TCP
port: 8090
targetPort: 80
nodePort: 31000
并且这个服务背后有一个nginx容器。虽然我可以通过nodePort
访问该服务,但无法通过port
字段访问该服务。我能够看到kubectl
和Kubernetes仪表板的配置,但curl
到该端口(例如curl http://192.168.0.100:8090
)会引发连接被拒绝错误。
我不确定这里有什么问题。我是否需要确保在节点或容器内运行任何代理服务?
答案 0 :(得分:17)
获取kubernetes服务的IP,然后点击8090;它会工作。 nodePort表示服务绑定到端口31000上的节点。
这些是可行的3件事:
curl <node-ip>:<node-port> # curl <node-ip>:31000
curl <service-ip>:<service-port> # curl <svc-ip>:8090
curl <pod-ip>:<target-port> # curl <pod-ip>:80
现在,让我们看看3种情况:
<强> 1。你在kubernetes集群内(你是一个pod)
<service-ip>
和<pod-ip>
以及<node-ip>
将有效。
<强> 2。您在节点上
<service-ip>
和<pod-ip>
以及<node-ip>
将有效。
第3。您在节点之外
假设<node-ip>
可以访问,只有<node-ip>
才有效。
答案 1 :(得分:0)
由于我假设您尝试从群集外部访问服务,因此行为符合预期。这意味着只有port
将服务公开给集群外的世界。 load-balancer:80
指的是容器上的端口,由容器内的容器暴露。这通常是期望的行为,以支持通常由负载均衡器表示的服务集群。因此,负载均衡器将公开您所需的服务端口(例如service-name:service-port
)并转发到所有节点上的nodePort以分配负载。
如果您从群集内部访问该服务,则应该可以通过{{1}}访问该服务,这要归功于内置的DNS。
可以在docs找到更详细的信息。