NodePort doesn't work in OpenShift CodeReady Container

12/18/2019

Install a latest OpenShift CodeReady Container on CentOS VM, and then run a TCP server app written by Java on OpenShift. The TCP Server is listening on port 7777.

Run app and expose it as a service with NodePort, seems that everything runs well. The pod port is 7777, and the service port is 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

Then get node IP, the command shows as 192.168.130.11, I can ping this ip on my VM successfully.

$ 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

Now, run a client app which is located in my VM, because I can ping OpenShift Node IP, so I think I can run the client app successfully. The result is that connection time out, my client fails to connect server running on OpenShift.

Please give your advice how to troubleshoot the issue, or any ideas for the issue.

-- Joe
kubernetes
openshift

2 Answers

12/18/2019

I understood your problem. As per what you described, I can see your Node port is 31777.

The best way to debug this problem is going step by step.

Step 1: Check if you are able to access your app server using your pod IP and port i.e curl 10.128.0.229:7777/endpoint from one of your nodes within your cluster. This helps you with checking if pod is working or not. Even though kubectl describe pod gives you everything.

Step 2: After that, on the Node which the pod is deployed i.e 192.168.130.11 on this try to access your app server using curl localhost:31777/endpoint. If this works, Nodeport is accessible i.e your service is working fine without any issues.

Step 3: After that, try to connect to your node using curl 192.168.130.11:31777/endpoint from the vm running your client server. Just to let you know, 192. is class A private ip, so I am assuming your client is within the same network and able to talk to 192.169.130.11:31777 Or make sure you open your the respective 31777 port of 192.169.130.11 to the vm ip that has client server.

This is a small process of debugging the issue with service and pod. But the best is to use the ingress and an ingress controller, which will help you to talk to your app server with a url instead of ip address and port numbers. However, even with ingress and ingress controller the best way to debug all the parts are working as expected is following these steps.

Please feel free to let me know for any issues.

-- BinaryMonster
Source: StackOverflow

12/19/2019

Thanks prompt answer.

Regarding Step 1, I don't know where I could run "curl 10.128.0.229:7777/endpoint" inside cluster, but I check the status of pod via going to inside pod, port 777 is listening as expected.

$ oc rsh tcpserver-57c9b44748-k9dxg
sh-4.2$ netstat -nap | grep 7777
tcp6       0      0 127.0.0.1:7777      :::*     LISTEN      1/java   

Regarding Step 2, run command "curl localhost:31777/endpoint" on Node where pod is deployed, it failed.

$ curl localhost:31777/endpoint
curl: (7) Failed to connect to localhost port 31777: Connection refused

That means, it seems that 31777 is not opened by OpenShift.

Do you have any ideas how to check why 31777 is not opened by OpenShift.

More information about service definition:

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

Service status:

$ 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>
-- Joe
Source: StackOverflow