Kubernetes NodePort not listening

7/27/2020

I'm doing some tutorials using k3d (k3s in docker) and my yml looks like this:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:alpine
          ports:
          - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80

With the resulting node port being 31747:

:~$ kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP        18m
nginx        NodePort    10.43.254.138   <none>        80:31747/TCP   17m

:~$ kubectl get endpoints
NAME         ENDPOINTS         AGE
kubernetes   172.18.0.2:6443   22m
nginx        10.42.0.8:80      21m

However wget does not work:

:~$ wget localhost:31747
Connecting to localhost:31747 ([::1]:31747)
wget: can't connect to remote host: Connection refused
:~$

What have I missed? I've ensured that my labels all say app: nginx and my containerPort, port and targetPort are all 80

-- A G
k3s
kubernetes
nginx

3 Answers

7/28/2020

Turns out I didn't expose the ports when creating the cluster

https://k3d.io/usage/guides/exposing_services/

-- A G
Source: StackOverflow

2/10/2021

maybe, your pod is running on the other work node, not localhost. you should use the correct node ip.

-- zjw0606
Source: StackOverflow

7/28/2020

The question is, is the NodePort range mapped from the host to the docker container acting as the node. The command docker ps will show you, for more details you can docker inspect $container_id and look at the Ports attribute under NetworkSettings. I don't have k3d around, but here is an example from kind.

$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                       NAMES
1d2225b83a73        kindest/node:v1.17.0          "/usr/local/bin/entr…"   18 hours ago        Up 18 hours         127.0.0.1:32769->6443/tcp   kind-control-plane
$ docker inspect kind-control-plane
[
    {
        # [...]
        "NetworkSettings": {
            # [...]
            "Ports": {
                "6443/tcp": [
                    {
                        "HostIp": "127.0.0.1",
                        "HostPort": "32769"
                    }
                ]
            },
        # [...]
    }
]

If it is not, working with kubectl port-forward as suggested in the comment is probably the easiest approach. Alternatively, start looking into Ingress. Ingress is the preferred method to expose workloads outside of a cluster, and in the case of kind, they have support for Ingress. It seems k3d also has a way to map the ingress port to the host.

-- pst
Source: StackOverflow