무작정 Istio 사용해 보기
프로젝트에서 고객사의 요구사항을 맞추기 위해 Istio를 사용해야 할 일이 생겼습니다.
기존에는 NGINX Ingress Controller를 사용해 왔는데, 이를 대체하기 위한 작업이 필요했습니다.
Istio를 실무에서 사용해 본 적은 처음이어서 시행착오가 많았습니다.
이 과정에서 겪었던 과정들과 문제들을 정리해 보려고 합니다.
아쉽게도, Service Mesh와 Sidecar 관련 내용은 거의 다루지 않습니다.
이 부분은 기회가 되면 2편으로...
Istio?
Istio는 컨테이너 환경에서 사용할 수 있는 Service Mesh 솔루션입니다.
Istio는 Sidecar 패턴을 사용해 권한과 인증을 관리할 수 있고, L7 로드 밸런싱을 제공하여 gRPC나 HTTP/2 트래픽의 분산도 효과적으로 처리할 수 있습니다.
하지만 위에서 말한 것처럼 여기서는 NGINX Ingress Controller를 대체하여 서비스를 외부에 노출시키는 것이 Istio의 도입 목적이었습니다. 이를 위해 Istio를 설치하고, 추가로 Gateway와 VirtualService를 설정해 서비스를 노출시키는 과정을 진행했습니다.
Istio를 적용하며 겪은 문제들
정규식 Rewrite 문제
기존에 사용하던 NGINX Ingress Controller 설정에 경로를 정규식을 사용해 재작성하는 부분이 있었습니다. 이를 Istio에서 사용하려면 v1.19 이상의 버전을 사용해야 하는데, 최신 버전을 사용하기 위해서는 Helm chart를 통한 설치가 필요합니다.
Istio Helm chart는 총 3개가 있는데, 차례대로 설치가 필요합니다.
istio/base
: 기본 설정을 담당하는 Helm chart입니다.istio/istiod
: 컨트롤 플레인을 담당하는 Helm chart입니다.istio/gateway
: 게이트웨이를 담당하는 Helm chart입니다.
이후에는 알맞게 정규식 경로를 재작성해 주면 되는데, 자료를 찾아도 잘 나오지 않았고 해당 링크처럼 적용해 해결했습니다.
외부 노출은 어떻게 하지?
istio/gateway
까지 설치한 이후에는 외부에 노출시키기 위한 설정이 필요합니다.
통상적인 서비스 노출과 비슷하게 진행을 하면 되는데, 가장 확실한 방법은 istio/gateway
차트의 values.yaml
파일을 수정하는 것입니다.
# ...
defaults:
service:
type: LoadBalancer
loadBalancerIP: "여기에 외부용 IP 입력"
보통은 위와 같이 설정하거나, 클라우드 환경에 따라 Annotation을 추가하여 해결이 가능합니다.
아주 특수한 경우, externalIPs
를 사용해 IP를 지정하는 경우도 있었습니다.
Argo CD로 Istio 배포하기
실제 프로젝트에서는 Argo CD를 사용해 모든 앱을 배포했고, 당연히 Istio도 포함되었습니다.
하지만 앞에서 이야기한 것처럼 Istio Helm chart는 의존성이 있기 때문에 순차 배포를 위한 고민이 필요했습니다.
이를 위해 생각한 방법은 다음 2가지였습니다.
- Helmfile 사용해 의존성 부여하기
제가 생각하는 가장 확실한 방법입니다. 이 방법을 사용하면 의존성을 부여하여 Istio를 순서대로 배포할 수 있을 것 같았습니다. 하지만 검증 없이 도입하기에는 무리가 있어 채용하지 않았습니다. - Subchart 사용하기
Istio를 구성하는 3개의 Helm chart를 포함한 상위 Helm chart를 만들어 사용했습니다. Helm에서는 Chart dependency를 통해 특정 Subchart를 활성화 또는 비활성화할 수 있는데, 이 부분을 이용했습니다. 결국 최초 설치 때 문제가 있는 것이기 때문에 처음에는istio/base
만 활성화하여 설치하고, 이후에는values.yaml
파일을 수정해 차례대로 활성화하여 설치하는 방식으로 진행했습니다.
그 외
- TLS를 적용해야 하는 경우, TLS Secret을 Istio가 설치된 Namespace에 생성해 주어야 합니다.
(기본값은istio-system
)
공식 문서에도 적혀 있는데, 관련해서 시행착오가 조금 있었습니다. istio/gateway
차트의 이름은 Gateway 정의에서도 참조하기 때문에 주의해야 합니다. 이로 인해 네트워크 문제가 발생할 경우 이를 맞춰야 합니다.- Azure 환경에서 Argo CD로 Istio를 배포한 후에, 일부 리소스가 OutOfSync 상태가 되는 경우가 있었습니다. 관련된 이슈를 2건 찾아볼 수 있었는데, 대부분은 AKS와 Istio 자체 문제로 판단되었습니다. 따라서 이 부분은 임시로 OutOfSync 예외처리를 적용해 두었습니다.
마치며
위와 같은 과정을 거쳐, 현재는 2~3개 정도의 프로젝트에서 Istio를 사용하고 있습니다.
아직 고급 기능을 사용하는 단계는 아니지만, Istio는 잘 알려진 도구이고 기능 지원도 잘 되기 때문에 이후에도 무리 없이 유지할 수 있을 것 같습니다.
추후에 Istio를 더 깊게 사용해 볼 수 있다면, 더 많은 내용을 적어 보려고 합니다.