Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kubernetes Port Forwarding - Connection refused

I am getting the following error when forwarding port. Can anyone help?

mjafary$ sudo kubectl port-forward sa-frontend 88:82

Forwarding from 127.0.0.1:88 -> 82
Forwarding from [::1]:88 -> 82

The error log :

Handling connection for 88
Handling connection for 88
E1214 01:25:48.704335   51463 portforward.go:331] an error occurred forwarding 88 -> 82: error forwarding port 82 to pod a017a46573bbc065902b600f0767d3b366c5dcfe6782c3c31d2652b4c2b76941, uid : exit status 1: 2018/12/14 08:25:48 socat[19382] E connect(5, AF=2 127.0.0.1:82, 16): Connection refused

Here is the description of the pod. My expectation is that when i hit localhost:88 in the browser the request should forward to the jafary/sentiment-analysis-frontend container and the application page should load

mjafary$ kubectl describe pods sa-frontend

Name:         sa-frontend
Namespace:    default
Node:         minikube/192.168.64.2
Start Time:   Fri, 14 Dec 2018 00:51:28 -0700
Labels:       app=sa-frontend
Annotations:  <none>
Status:       Running
IP:           172.17.0.23
Containers:
  sa-frontend:
    Container ID: docker://a87e614545e617be104061e88493b337d71d07109b0244b2b40002b2f5230967
    Image:          jafary/sentiment-analysis-frontend
    Image ID:       docker-pullable://jafary/sentiment-analysis-frontend@sha256:5ac784b51eb5507e88d8e2c11e5e064060871464e2c6d467c5b61692577aeeb1
    Port:           82/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Fri, 14 Dec 2018 00:51:30 -0700
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
  /var/run/secrets/kubernetes.io/serviceaccount from default-token-mc5cn (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          True 
  PodScheduled   True 
Volumes:
  default-token-mc5cn:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-mc5cn
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
             node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>
like image 448
Jaf Avatar asked Dec 16 '18 05:12

Jaf


3 Answers

The reason the connection is refused is that there is no process listening on port 82. The dockerfile used to create the nginx image exposes port 80, and in your pod spec you have also exposed port 82. However, nginx is configured to listen on port 80.

What this means is your pod has two ports that have been exposed: 80 and 82. The nginx application, however, is actively listening on port 80 so only requests to port 80 work.

To make your setup work using port 82, you need to change the nginx config file so that it listens on port 82 instead of 80. You can either do this by creating your own docker image with the changes built into your image, or you can use a configMap to replace the default config file with the settings you want

like image 143
Patrick W Avatar answered Sep 19 '22 14:09

Patrick W


As @Patric W said, the connection is refused because there is no process listening on port 82. That port hasn't been exposed.

Now, to get the port on which your pod is listening to, you can run the commands

NB: Be sure to change any value in <> with real values.

  • First, get the name of the pods in the specified namespace kubectl get po -n <namespace>
  • Now check the exposed port of the pod you'll like to forward.
kubectl get pod <pod-name> -n <namespace>  --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}' 

Now use the resulting exposed port above to run port-forward with the command

  • kubectl port-forward pod/<pod-name> <local-port>:<exposed-port>

where local-port is the port from which the container will be accessed from the browser ..localhost:<local-port> while the exposed-port is the port on which the container listens to. Usually defined with the EXPOSE command in the Dockerfile

Get more information here

like image 23
Eyong Kevin Enowanyo Avatar answered Sep 20 '22 14:09

Eyong Kevin Enowanyo


As Patrick pointed out correctly. I had this same issue which plagued me for 2 days. So steps would be:

  1. Ensure your Dockerfile is using your preferred port (EXPOSE 5000)
  2. In your pod.yml file ensure containerPort is 5000 (containerPort: 5000)
  3. Apply the kubectl command to reflect the above:

kubectl port-forward pod/my-name-of-pod 8080:5000

like image 35
Tech helps the brain Avatar answered Sep 17 '22 14:09

Tech helps the brain