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 # <-