istio의 Virtual Service 간략한 소개
우선 사전 지식을 함양하기 위해 Virtual Service에 대한 간략한 소개를 하겠습니다.
istio를 사용하는 경우 특정 도메인 접근 시 쿠버네티스에서 어떤 서비스 자원에 진입시킬 지 정의할 수 있습니다.
k edit vs -n istio-system my-virtual-service
- corsPolicy:
allowHeaders:
- content-type
- access-control-allow-origin
allowMethods:
- GET
- POST
- PATCH
- PUT
- DELETE
- OPTIONS
allowOrigins:
- exact: '*'
headers:
request:
set:
Authorization: Bearer %REQ(x-auth-request-access-token)%
match:
- uri:
prefix: /v1/my-first-pod
route:
- destination:
host: my-first-svc.project.svc.cluster.local
port:
number: 8080
virtual service 자원 내에 위와 같이 /v1/my-first-pod로 진입시 my-first-svc라는 서비스에 연결하도록 설정할 수 있습니다.
서비스 연결 순서와 우회 계획
기존의 연결 방식은 사용자가 요청 시 OAuth2 -> my-first-svc -> my-second-svc 의 순서로 요청되는 형태라고 가정해봅시다.
OAuth2로 항상 인증을 거치고 그 다음에 my-first-svc에 진입합니다.
우리는 이 OAuth2 인증과 my-first-svc를 거치지 않고 바로 my-second-svc로 진입하게 만들어 볼 것 입니다.
istio의 AuthorizationPolicy에서 OAuth2 인증 패스
Virtual Service가 특정 경로로 진입하는 것을 도와주는 역할이었다면 AuthorizationPolicy에서는 특정 경로로 진입 시 특정 기능을 거치지 않게 할 수 있습니다.
k edit authorizationpolicies.security.istio.io -n istio-system auth-admin-policy
spec:
action: CUSTOM
provider:
name: oauth2-proxy-admin
rules:
- to:
- operation:
hosts:
- my-site.com
notPaths:
- /auth
- /v1/my-first-pod/bypass
/v1/my-first-pod/bypass로 진입하면 이제 OAuth2 인증을 제외 시킬 수 있습니다.
특정 파드 진입 패스
이제 OAuth2는 통과를 했으니 virtual service를 수정해서 my-first-svc를 통과시켜보겠습니다.
match:
- uri:
prefix: /v1/my-first-pod
route:
- destination:
host: my-first-svc.project.svc.cluster.local
port:
number: 8080
match:
- uri:
prefix: /v1/my-first-pod/bypass
route:
- destination:
host: my-second-svc.project.svc.cluster.local
port:
number: 8080
/v1/my-first-pod/bypass로 진입시 my-second-svc로 바로 연결할 수 있도록 설정합니다.
문제의 원인과 해결
위와 같이 설정을 하면 /v1/my-first-pod/bypass 라는 특정 경로로 진입하는 경우 my-second-svc로 바로 연결할 수 있는 것처럼 보이기 때문에 정상작동 할 것이라고 예상할 수 있습니다.
하지만 문제는 my-second-svc가 아니라 my-first-svc부터 진입하게 되는데요.
이유는 Virtual Service의 설정에 있습니다.
match:
- uri:
prefix: /v1/my-first-pod/bypass
route:
- destination:
host: my-second-svc.project.svc.cluster.local
port:
number: 8080
match:
- uri:
prefix: /v1/my-first-pod
route:
- destination:
host: my-first-svc.project.svc.cluster.local
port:
number: 8080
/bypass로 진입하는 것을 더 위에 올려놔야 우선순위가 높이 적용 됩니다.
설정이 완료됐다면 rollout을 해서 적용시키면 올바르게 우회를 시킬 수 있습니다.
k rollout restart deployment -n istio-system istiod istio-gateway
'☸️ Kubernetes' 카테고리의 다른 글
개인 PC에 Kubernetes 환경 설치 (1) | 2024.01.07 |
---|---|
[Kubernetes] DNS (0) | 2024.01.05 |
[Kubernetes] Json (0) | 2024.01.04 |
[Kubernetes] ETCD Snapshot Backup (0) | 2024.01.03 |
[Kubernetes] Cluster Upgrade (0) | 2024.01.03 |