在 CentOS VM 上安装最新的 OpenShift CodeReady 容器,然后在 OpenShift 上运行由 Java 编写的 TCP 服务器应用程序。TCP 服务器正在侦听端口 7777。
运行应用程序并使用 NodePort 将其公开为服务,似乎一切运行良好。Pod 端口为 7777,服务端口为 31777。
$ oc get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tcpserver-57c9b44748-k9dxg 1/1 Running 0 113m 10.128.0.229 crc-2n9vw-master-0 <none> <none>
$ oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tcpserver-ingres NodePort 172.30.149.98 <none> 7777:31777/TCP 18m
然后获取节点IP,命令显示为192.168.130.11,我可以在我的虚拟机上成功ping这个ip。
$ oc get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
crc-2n9vw-master-0 Ready master,worker 26d v1.14.6+6ac6aa4b0 192.168.130.11 <none> Red Hat Enterprise Linux CoreOS 42.81.20191119.1 (Ootpa) 4.18.0-147.0.3.el8_1.x86_64 cri-o://1.14.11-0.24.dev.rhaos4.2.gitc41de67.el8
现在,运行位于我的 VM 中的客户端应用程序,因为我可以 ping OpenShift Node IP,因此我认为我可以成功运行客户端应用程序。结果是连接超时,我的客户端无法连接在 OpenShift 上运行的服务器。
请提供有关如何解决问题的建议,或对问题的任何想法。
我理解你的问题。按照您的描述,我可以看到您的节点端口31777
。
调试此问题的最佳方法是逐步进行。
第 1 步: 检查您是否能够使用 pod IP 和端口(即从集群中的一个节点curl 10.128.0.229:7777/endpoint
(访问您的应用程序服务器。这有助于您检查 pod 是否正常工作。即使kubectl describe pod
给你一切。
第 2 步: 之后,在部署 Pod 的节点上,即在此节点上192.168.130.11
尝试使用curl localhost:31777/endpoint
访问您的应用程序服务器。如果这有效,则可以访问 Nodeport,即您的服务运行良好,没有任何问题。
第 3 步: 之后,尝试使用运行客户端服务器的 VM 中的curl 192.168.130.11:31777/endpoint
连接到节点。只是为了让你知道,192。是 A 类私有 IP,所以我假设您的客户端位于同一网络中并且能够与 192.169.130.11:31777 通信 或者确保将相应的 31777 端口 192.169.130.11 打开到具有客户端服务器的 VM IP。
这是调试服务和 pod 问题的小过程。但最好是使用入口和入口控制器,这将帮助您使用 url 而不是 IP 地址和端口号与应用服务器通信。但是,即使使用入口和入口控制器,调试所有部件按预期工作的最佳方法是执行以下步骤。
如有任何问题,请随时告诉我。
谢谢及时回答。
关于步骤1, 我不知道我可以在哪里在集群内运行"curl 10.128.0.229:7777/endpoint",但我通过进入内部 pod 来检查 pod 的状态,端口 777 正在按预期侦听。
$ oc rsh tcpserver-57c9b44748-k9dxg
sh-4.2$ netstat -nap | grep 7777
tcp6 0 0 127.0.0.1:7777 :::* LISTEN 1/java
关于第 2 步, 在部署 Pod 的节点上运行命令"curl localhost:31777/endpoint",它失败了。
$ curl localhost:31777/endpoint
curl: (7) Failed to connect to localhost port 31777: Connection refused
这意味着,OpenShift似乎没有打开31777。
您是否知道如何检查为什么 OpenShift 没有打开 31777。
有关服务定义的详细信息:
apiVersion: v1
kind: Service
metadata:
name: tcpserver-ingress
labels:
app: tcpserver
spec:
selector:
app: tcpserver
type: NodePort
ports:
- protocol: TCP
port: 7777
targetPort: 7777
nodePort: 31777
服务状态:
$ oc describe svc tcpserver-ingress
Name: tcpserver-ingress
Namespace: myproject
Labels: app=tcpserver
Annotations: <none>
Selector: app=tcpserver
Type: NodePort
IP: 172.30.149.98
Port: <unset> 7777/TCP
TargetPort: 7777/TCP
NodePort: <unset> 31777/TCP
Endpoints: 10.128.0.229:7777
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>