개요
쿠버네티스에서 nginx를 load balancer로 사용 하다 path에 따라 서버를 달리 해야 할 경우 매핑 하는 규칙
1. nginx.ingress.kubernetes.io/use-regex: "true"
이 옵션을 사용 하는 경우 정규식 패턴과 일치 하는 경우 해당 서버로 이동 시킨다.
해당 lb에 같이 있는 모든 lb에 대하여 정규식 패턴 매칭 형태로 매핑 된다.
우선 순위
첫 번째 매칭 우선 순위 인데, nginx에 경로를 작성 할때 긴 경로 순으로 정렬 되고 첫번째 일치 되는 것을 우선 한다.
정확한 패스와 매칭 되는 정규식이 있는 경우 정규식이 우선 하는 듯 하다.
(실제 테스트 결과)
A request to test.com/foo/bar/bar would match the ^/foo/bar/[A-Z0-9]{3} location block instead of the longest EXACT matching path.
쿠버네티스 페이지 발췌
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
요청주소 | path | nginx 표시 | 서버에 전달되는 주소 |
/foo/bar | /foo/bar | location ~* "^/foo/bar" { ... } | /foo/bar |
/foo/bar/ | /foo/bar/ | location ~* "^/foo/bar/" { ... } | /foo/bar/ |
/foo/bar/aa | /foo/bar/.+ | location ~* ^/foo/bar/.+ { ... } | /foo/bar/aa |
2. nginx.ingress.kubernetes.io/rewrite-target: /test/$1
이 옵션을 사용 하는 경우 패스를 수정하여 전달 한다.쿠버네티스의 nginx ingress의 nginx.conf (/etc/nginx/nginx.conf) 파일을 보면 아래와 같이 rewite가 추가 된것을 알 수 있다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress-3
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
--- nginx
location ~* "^/foo/bar" {
...
rewrite "(?i)/foo/bar" /test/$1 break;
...
}
location ~* "^/foo/bar/" {
...
rewrite "(?i)/foo/bar/" /test/$1 break;
...
}
location ~* "^/foo/bar/.+" {
...
rewrite "(?i)/foo/bar/.+" /test/$1 break;
...
}
location ~* "^/foo/bar/(.+)" {
...
rewrite "(?i)/foo/bar/(.+)" /test/$1 break;
...
}
요청 주소 | path | nginx 표시 | 비고 |
/foo/bar | /foo/bar | location ~* "^/foo/bar" { ... } | /test/ |
/foo/bar/ | /foo/bar/ | location ~* "^/foo/bar/" { ... } | /test/ |
/foo/bar/aa | /foo/bar/.+ | location ~* "^/foo/bar/" { ... } | /test/ |
/foo/bar/aa | /foo/bar/(.+) | location ~* ^/foo/bar/.+ { ... } | /test/aa |
두 옵션을 모두 적용 할 경우 rewrite 가 우선 되는 듯 하다.
임포탄트 노트라는데 해석이 잘 안된다.
정규식을 사용 할 경우 대소문자 구분을 하지 않는다.?
(//todo 향후에 좀더 테스트 필요)
IMPORTANT NOTES:
- If the use-regex OR rewrite-target annotation is used on any Ingress for a given host, then the case insensitive regular expression location modifier will be enforced on ALL paths for a given host regardless of what Ingress they are defined on.
출처
https://kubernetes.github.io/ingress-nginx/user-guide/ingress-path-matching/