본문 바로가기

카테고리 없음

쿠버네티스 nginx lb 패턴

개요

쿠버네티스에서 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/