context path를 변경하여 서버에 라우팅을 할때는 다음과 같이 Ingress를 정의해야한다.
metadata.annotations.nginx.ingress.kubernetes.io/rewrite-target
rewrite-target은 nginx의 Annotation중의 하나이다. ingress에 정의된 경로로들어온 요청을 호출경로를 재정의 하는것이다.
예를들어 http://test.armyost.com/api/test1/insertUserdata.do 를 아래의 정책으로 rewrite하면 ingress를 지나 서버에서는 http://test.armyost.com/insertUserdata.do 로 전달됩니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/cors-allow-headers: Keep-Alive, User-Agent, X-Requested-With,
X-Forwarded-For, Cache-Control, Content-Type, Authorization
nginx.ingress.kubernetes.io/rewrite-target: /$2
generation: 1
name: ${APP_NAME}-ingress
spec:
rules:
- host: test.armyost.com
http:
paths:
- path: /api/test1(/|$)(.*)
pathType: Prefix
backend:
service:
name: test1-service
port:
number: 80
- host: test.armyost.com
http:
paths:
- path: /api/test2(/|$)(.*)
pathType: Prefix
backend:
service:
name: test2-service
port:
number: 80
여기서 내가 가장 많이 삽질한 것은...
/api/test1/service .. 이렇게 Context가 아무리 길어도 이걸 모두 날리려면 그냥 rewrite-target: /$2 로 써야 한다는 것입니다.
처음에는 컨텍스트 4번째 부터 살리려면 $4라던지 해야하는지 알고 삽질을 무지했음...
(/|$) 를 Group1로 보고 (.*)를 Group2로 봅니다.
그리고 Regular Expression에 따르면
(/|$) : /api/test1(뒤에 뭐없이 끝나거나) 또는 /api/test1/ 인 경우 Match
(.*) : 그뒤에 char가 뭐가 오던(심지어 없어도) Match
그리고 ingress도 거의(아닌경우도 있음) nginx 모듈을 사용하여 아래의 nginx tester를 사용하면 좋다. Regex(Regular Expression)를 점검해보기에 좋다.
https://nginx.viraptor.info/
nginx.viraptor.info
'PaaS > Kubernetes' 카테고리의 다른 글
Kubernetes Resource가 잘 안지워질때 (0) | 2023.11.15 |
---|---|
Kubernetes Dashboard를 외부로 노출시키기 위한 Ingress 작업 (1) | 2023.11.13 |
운영환경에 활용하기 좋은 k8s 리소스 YAML (0) | 2023.11.09 |
OIDC 인증으로 특정 Service Account에 대해 Kubelet API 호출하기 (1) | 2023.11.08 |
k8s 보안, 최소권한으로 특정 NameSpace에 대한 권한만 부여하기 (0) | 2023.11.08 |