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:

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

And their respective services:

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

I have created an ingress:

  1. i@cp:~$ k get ing -n prod
  2. NAME CLASS HOSTS ADDRESS PORTS AGE
  3. hello-ingress nginx hello.com 80 2d4h
  4.  
  5. i@cp:~$ k describe ing -n prod
  6. Name: hello-ingress
  7. Labels: <none>
  8. Namespace: prod
  9. Address:
  10. Ingress Class: nginx
  11. Default backend: <default>
  12. Rules:
  13. Host Path Backends
  14. ---- ---- --------
  15. hello.com
  16. /v1 hello-srv:80 (192.168.0.121:8080,192.168.0.144:8080)
  17. /v2 hello2-srv:80 (192.168.0.244:8080,192.168.0.49:8080)
  18. Annotations: <none>
  19. Events:
  20. Type Reason Age From Message
  21. ---- ------ ---- ---- -------
  22. Normal Sync 3m48s nginx-ingress-controller Scheduled for sync

Curling any of the addresses works just fine:

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

But the port 80 is closed:

  1. i@cp:~$ curl hello.com
  2. curl: (7) Failed to connect to hello.com port 80 after 0 ms: Connection refused
  3.  
  4. i@cp:~$ curl hello.com/v1
  5. curl: (7) Failed to connect to hello.com port 80 after 0 ms: Connection refused
  6.  
  7. i@cp:~$ curl localhost
  8. curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused
  9.  
  10. i@cp:~$ ping hello.com
  11. PING hello.com (192.168.138.129) 56(84) bytes of data.
  12. 64 bytes from k8scp (192.168.138.129): icmp_seq=1 ttl=64 time=0.083 ms
  13.  
  14. i@cp:~$ curl k8scp
  15. curl: (7) Failed to connect to k8scp port 80 after 0 ms: Connection refused
  16.  
  17. i@cp:~$ curl 192.168.138.129
  18. 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:

  1. i@cp:~$ helm list
  2. NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
  3. myingress default 1 2024-09-23 22:03:56.346203937 +0000 UTC deployed ingress-nginx-4.11.2 1.11.2
  4.  
  5. i@cp:~$ k get pods
  6. NAME READY STATUS RESTARTS AGE
  7. myingress-ingress-nginx-controller-bxwpv 1/1 Running 0 47h
  8. 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.

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Comments

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

  • 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.

  • 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

  • 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

  • Posts: 18

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

    1. ---
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: hello-nodeport
    6. namespace: prod
    7. spec:
    8. type: NodePort
    9. ports:
    10. - appProtocol: http
    11. name: http
    12. nodePort: 80
    13. port: 80
    14. protocol: TCP
    15. targetPort: http
    16. - appProtocol: https
    17. name: https
    18. nodePort: 443
    19. port: 443
    20. protocol: TCP
    21. targetPort: https
    22. selector:
    23. app.kubernetes.io/name: myingress-ingress-nginx-controller

    This fails with:

    1. 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.

  • 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.

  • Posts: 2,434

    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:

    1. 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:

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

    Regards,
    -Chris

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Categories

Upcoming Training