Home > OS >  Nginx ingress can't find the service
Nginx ingress can't find the service

Time:12-07

I created a nginx ingress using this link using docker-desktop.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml

My service:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: be-assinaturas
  namespace: apps-space
  labels:
    tier: backend
    app: assinaturas
spec:
  selector:
    matchLabels:
      name: be-assinaturas
      app: assinaturas
  strategy:
    type: Recreate
  replicas: 2
  template:
    metadata:
      name: be-assinaturas
      labels:
        app: assinaturas
        name: be-assinaturas
    spec:
      containers:
        - name: be-assinaturas
          image: jedi31/assinaturas:latest
          imagePullPolicy: Always

---
kind: Service
apiVersion: v1
metadata:
  name: svc-assinaturas
  namespace: apps-space
spec:
  selector:
    name: be-assinaturas
    app: assinaturas
  type: ClusterIP
  ports:
    - name: be-assinaturas-http
      port: 80
      targetPort: 80

My ingress resource is defined as:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: 
  name: ingress-be-assinaturas
  namespace: apps-space
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - http:
        paths: 
        - path: /assinaturas
          pathType: Prefix
          backend:
            service:              
              name: svc-assinaturas
              port:
                number: 80

Running a kubectl get services --all-namespaces I get

NAMESPACE       NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
apps-space      svc-assinaturas                      ClusterIP      10.107.188.28    <none>        80/TCP                       12m
default         kubernetes                           ClusterIP      10.96.0.1        <none>        443/TCP                      66d
ingress-nginx   ingress-nginx-controller             LoadBalancer   10.102.238.173   localhost     80:32028/TCP,443:30397/TCP   5h45m
ingress-nginx   ingress-nginx-controller-admission   ClusterIP      10.98.148.190    <none>        443/TCP                      5h45m
kube-system     kube-dns                             ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP       66d

If I do a port forward on service, like this: kubectl port-forward -n apps-space service/svc-assinaturas 5274:80

I can acess my app using curl, like this: curl -v http://localhost:5274/hc/alive

and the response is:

*   Trying 127.0.0.1:5274...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 5274 (#0)
> GET /hc/alive HTTP/1.1
> Host: localhost:5274
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Date: Mon, 06 Dec 2021 23:22:40 GMT
< Server: Kestrel
< Transfer-Encoding: chunked
<
* Connection #0 to host localhost left intact
{"service":"Catalogo","status":"Alive","version":"bab4653"}

But if I try access the service using Ingress, it returns a 404. curl -v http://localhost/assinaturas/hc/alive

*   Trying 127.0.0.1:80...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /assinaturas/hc/alive HTTP/1.1
> Host: localhost
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Date: Mon, 06 Dec 2021 23:22:51 GMT
< Content-Length: 0
< Connection: keep-alive
<
* Connection #0 to host localhost left intact

What I'm doing wrong here? Why I can acess the service, but the ingress do not find it?

CodePudding user response:

this is because the prefix /assinaturas need to be omitted by an Nginx rewrite.. And that's explain why you got 404 (not found):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: 
  name: ingress-be-assinaturas
  namespace: apps-space
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$1 # <-            
  • Related