Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GKE Ingress not respecting rewrite rule

Running a cluster on Google Container engine.

Expect it to respect rewrite rule. Running the debug echo server it shows it's not respecting the http-rewrite rule as documented here in kubernetes ingress docs.

Works locally on minikube just fine. The realpath parameter still has debug attached although rewrite is on to strip after match. Expect /foo/bar/ vs /debug/foo/bar.

Attached

URL + response

http://homes.stanzheng.com/debug/foo/bar

CLIENT VALUES:
client_address=10.12.2.1
command=GET
real path=/debug/foo/bar
query=nil
request_version=1.1
request_uri=http://homes.stanzheng.com:8080/debug/foo/bar

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding=gzip, deflate
accept-language=en-US,en;q=0.8
connection=Keep-Alive
cookie=__cfduid=dfd6a6d8c2a6b361a3d72e3fc493295441494876880; _ga=GA1.2.5098880.1494876881
host=homes.stanzheng.com
upgrade-insecure-requests=1
user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
via=1.1 google
x-cloud-trace-context=1586885dcac2d537189444861a8a462c/1232314719683944914
x-forwarded-for=204.154.44.39, 35.190.78.5
x-forwarded-proto=http
BODY:
-no body in request-

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: rewrite
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: minikube.homes
    http:
      paths:
      - path: /debug/*
        backend:
          serviceName: echoserver
          servicePort: 8080
like image 623
StanleyZheng Avatar asked Aug 24 '17 18:08

StanleyZheng


2 Answers

rewrite-target is not supported by Google Container Engine Ingress. See this page for a comparison of features:

https://github.com/kubernetes/ingress/blob/master/docs/annotations.md

like image 198
Janos Lenart Avatar answered Oct 03 '22 22:10

Janos Lenart


You could use an Nginx ingress controller as explained in this blog:

http://rahmonov.me/posts/nginx-ingress-controller/

Once you follow those steps, you need to add the following annotation to your ingress yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: rewrite
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: minikube.homes
    http:
      paths:
      - path: /debug/*
        backend:
          serviceName: echoserver
          servicePort: 8080
like image 23
Ovi Avatar answered Oct 03 '22 22:10

Ovi