Welcome to the Linux Foundation Forum!

Ingress not working

Ingress is not working and I am not sure why.

Details:

I have two deployments running four pods:

i@cp:~$ k get pods -n prod
NAME                          READY   STATUS    RESTARTS   AGE
hello-dep-58d75f88f-75j9w     1/1     Running   0          6m47s
hello-dep-58d75f88f-tsjq6     1/1     Running   0          2d4h
hello2-dep-6df5f875d6-fjlgx   1/1     Running   0          2d4h
hello2-dep-6df5f875d6-rg8xf   1/1     Running   0          6m47s

And their respective services:

i@cp:~$ k get svc -n prod
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
hello-srv    ClusterIP   10.107.219.251   <none>        80/TCP    2d4h
hello2-srv   ClusterIP   10.110.36.35     <none>        80/TCP    2d4h

I have created an ingress:

i@cp:~$ k get ing -n prod
NAME            CLASS   HOSTS       ADDRESS   PORTS   AGE
hello-ingress   nginx   hello.com             80      2d4h

i@cp:~$ k describe ing -n prod
Name:             hello-ingress
Labels:           <none>
Namespace:        prod
Address:
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host        Path  Backends
  ----        ----  --------
  hello.com
              /v1   hello-srv:80 (192.168.0.121:8080,192.168.0.144:8080)
              /v2   hello2-srv:80 (192.168.0.244:8080,192.168.0.49:8080)
Annotations:  <none>
Events:
  Type    Reason  Age    From                      Message
  ----    ------  ----   ----                      -------
  Normal  Sync    3m48s  nginx-ingress-controller  Scheduled for sync

Curling any of the addresses works just fine:

i@cp:~$ curl 192.168.0.121:8080
Hello, world!
Version: 1.0.0
Hostname: hello-dep-58d75f88f-tsjq6

But the port 80 is closed:

i@cp:~$ curl hello.com
curl: (7) Failed to connect to hello.com port 80 after 0 ms: Connection refused

i@cp:~$ curl hello.com/v1
curl: (7) Failed to connect to hello.com port 80 after 0 ms: Connection refused

i@cp:~$ curl localhost
curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused

i@cp:~$ ping hello.com
PING hello.com (192.168.138.129) 56(84) bytes of data.
64 bytes from k8scp (192.168.138.129): icmp_seq=1 ttl=64 time=0.083 ms

i@cp:~$ curl k8scp
curl: (7) Failed to connect to k8scp port 80 after 0 ms: Connection refused

i@cp:~$ curl 192.168.138.129
curl: (7) Failed to connect to 192.168.138.129 port 80 after 0 ms: Connection refused

I thought it was a problem of a lack of an Ingress Controller, so I installed one:

i@cp:~$ helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
myingress       default         1               2024-09-23 22:03:56.346203937 +0000 UTC deployed        ingress-nginx-4.11.2    1.11.2

i@cp:~$ k get pods
NAME                                       READY   STATUS    RESTARTS        AGE
myingress-ingress-nginx-controller-bxwpv   1/1     Running   0               47h
myingress-ingress-nginx-controller-xrlxc   1/1     Running   2 (8m59s ago)   47h

But the result is the same.

What can be happening? Do I have to link the ingress Controller to my ingress somehow?

Thanks.

Comments

  • curl -H "Host: hello.com" $CLUSTER_IP/v1

  • ilmx
    ilmx Posts: 18

    The cluster IPs work. What I need is to access the ingress.
    I have "hello.com" configured to point to the control plane.

  • chrispokorni
    chrispokorni Posts: 2,340

    Hi @ilmx,

    For external access, either use a NodePort Service for the ingress controller, or enable the hostPort on the myingress ingress controller Pods.

    Regards,
    -Chris

  • ilmx
    ilmx Posts: 18

    Thanks @chrispokorni What does it mean "enable the hostPort on the myingress ingress controller Pods"? How can I do that?
    In other clusters I have used (already installed), ingress used to work automatically so probably I am missing some step

  • ilmx
    ilmx Posts: 18

    Mmmm... I have tried to create a NodePort, but I am not sure I understood how it should be created:

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-nodeport
      namespace: prod
    spec:
      type: NodePort
      ports:
      - appProtocol: http
        name: http
        nodePort: 80
        port: 80
        protocol: TCP
        targetPort: http
      - appProtocol: https
        name: https
        nodePort: 443
        port: 443
        protocol: TCP
        targetPort: https
      selector:
        app.kubernetes.io/name: myingress-ingress-nginx-controller
    

    This fails with:

     Invalid value: 80: provided port is not in the valid range. The range of valid ports is 30000-32767
    

    But I would like to use port 80 to access the ingress service that will route to my cluster IP.

  • strego
    strego Posts: 1

    @ilmx, don't set the nodePort value. Kubernetes will allocated a port in the range 30000-32767 for you. If you want to specify a port make sure it is in the range.

  • chrispokorni
    chrispokorni Posts: 2,340

    Hi @ilmx,

    In order to expose your ingress controller on port 80 you would need to verify that hostPort: 80 is declared in the myingress-ingress-nginx-controller manifest. If it is not, then declare it. Assuming you closely followed the ingress deployment and selected the DaemonSet controller in the chart's values.yaml manifest, you could simply edit the controller object with:

    kubectl edit daemonset myingress-ingress-nginx-controller
    

    Otherwise you could enable the hostPort in the chart's values.yaml manifest.

    The hostPort set on the ingress controller Pod allows the ingress proxy to capture traffic on port 80 and forward it to either of the Services web-one or web-two exposing their respective webserver Deployments. This method allows Pods to directly map to a port of the host, without the need for the NodePort Service.

    Discover more about the hostPort:

    kubectl explain --recursive pod.spec.containers.ports
    kubectl explain --recursive pod.spec.containers.ports.hostPort
    

    Regards,
    -Chris

Categories

Upcoming Training