기존에 DB 데이터 암호화/복호화에 사용되는 Key, Password들을 Vault에 저장을 해서 썼다.
WAS들이 기동 시 Vault에 있는 값을 API를 통해 가져와서 사용하게끔 구축되어 있었다.
하지만 이제는 Kubernetes에 올라가 있는 Pod들이 Vault에 접근을 해야하기 때문에 Vault의 HA가 무엇보다 중요하게 느껴졌다.
고심하던 중, Kubernetes에서 Vault를 올려서 HA를 보장받자라는 생각으로 진행하게 되었다.
Vault in k8s
Kubernetes에서 올라가는 Vault에 대한 장단점도 뚜렷하고, 목적 또한 뚜렷하게만 느껴졌다.
기존 VM에 올려서 사용하던 Vault는 WAS에서 API를 통해 가져오기 떄문에 개발자들이 Vault에 대한 내용을 이해하고 있어야 했고, 의존성 및 소스코드 수정이 불가피했다.
다만 그만큼 초심자들도 구축하기 편한 축에 속하며, 개발자가 인프라를 어느 정도 다뤄야하는 포지션이라면 위의 방식도 충분히 고려할 수 있다고 생각한다.
이에 반해 k8s에 올리는 Vault는 개발자들의 입장에서는 Vault에 대한 내용을 이해하지 않아도 되며, 주어진 k8s의 Secret값만 사용하면 된다.
Helm Chart로 설치도 가능하지만, Kubernetes 자체에 대한 이해도가 필요하기에 개인적인 생각으로는 VM에 올리는 것이 더 쉽다고 느껴진다.
Vault Type in k8s
k8s에 올라가는 Vault에는 다양한 방식이 있다.
특히나 VM에 올리는 방식과 유사한 kind(kubernetes in docker)로 구축하는 방식도 있지만, 익숙하지만 흥미로운 기술은 아니기에 패스했다.
크게 3가지 방식정도가 존재하는 듯 했다.
1. Vault CSI Provider
외부에 존재하는 Vault에 있는 데이터들을 Pod에 CSI 드라이버를 이용해 pod에 마운트하는 방식
2. Vault Injection
Pod의 init Container와 Sidecar Container를 통해 Vault의 데이터를 동기화 후 pod에 secret을 마운트하는 방식
3. Vault Secrets Operator
Vault의 데이터를 가져와서 Kubernetes의 secret을 동기화 하여 사용하는 방식
각각의 방식의 특징과 차이점은 디테일하게 보면 더 많겠지만, 내가 이해한 바로는 위와 같은 느낌이다.
이 중 3번이 제일 무난하다고 판단해서 3번을 기준으로 구축을 해보기로 했다.
구축하는 과정에 대해서는 다음 게시글에 작성해야겠다.