Kubernetes ingress rules for external service
There is a service that can echo my request back to me: https://postman-echo.com/, it will come useful later.Here is its ip and it will simulate your external service:
$ dig postman-echo.com +short107.23.20.188
It works as following:
$ curl 107.23.20.188/get | jq{ "args": {}, "headers": { "x-forwarded-proto": "http", "x-forwarded-port": "80", "host": "107.23.20.188", "x-amzn-trace-id": "Root=1-5ebced9c-941e363cc28bf3529b8e7246", "user-agent": "curl/7.52.1", "accept": "*/*" }, "url": "http://107.23.20.188/get"}
So as you can see it sends me a json with all headers that I sent to it and most importantly - url with path it receives.
Here is the ingress yaml I used:
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: external-service annotations: #kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: /$1spec: rules: - host: http: paths: - backend: serviceName: external-ip servicePort: 80 path: /es/(.*)
Service and Endpoint definition stays the same as yours with exception for endpoint IP. Here I used 107.23.20.188 (the postman-echo IP).
Now lets try to send some requests through nginx but first lets check whats ingress ip:
$ kubectl get ingressNAME HOSTS ADDRESS PORTS AGEexternal-service * 192.168.39.96 80 20h
The ip is 192.168.39.96
and its private IP because I am running it on minikube but it should not matter.
$ curl -s 192.168.39.96/es/get{ "args": {}, "headers": { "x-forwarded-proto": "http", "x-forwarded-port": "80", "host": "192.168.39.96", "x-amzn-trace-id": "Root=1-5ebcf259-6331e8c709656623f1a94ed4", "x-request-id": "d1545d1e8764da3cf57abb143faac4fb", "x-forwarded-host": "192.168.39.96", "x-original-uri": "/es/get", "x-scheme": "http", "user-agent": "curl/7.52.1", "accept": "*/*" }, "url": "http://192.168.39.96/get"}
so as you see I am sending request for path /es/get
and echo server is receiving /get
.
One thing I have noticed while writing this answer is that (maybe its just copy-paste error but) your quotes in annotations ”
are different than "
and this may be causing that nginx is not processing annotations as it should. Im my case for some reason when I was copy-pasting your yaml it it was working but so it did without your annotations so that may be the reason I haven't noticed it earlier.