Vault를 helm으로 설치하는 것 자체는 그리 어렵지 않았다.
다만 설정을 해주는 부분들과 values.yaml을 파악하는 부분이 조금 어색했다.
일단 내가 설치한 방식대로 기록했다.
Vault 설치하기
$ helm repo add hashicorp https://helm.releases.hashicorp.com
먼저 hashicorp의 repo를 추가해준다.
$ wget https://github.com/hashicorp/vault-helm/blob/main/values.yaml
values.yaml을 다운받고 수정해주면 되는데, 여타 helm들이 그렇듯 values를 어떻게 요리하냐에 따라 활용성이 크게 달라진다.
tolerations:
- key: "pool"
operator: "Equal"
value: "extra-node-pool"
먼저 vault는 다른 Worker Node에 기동되길 원해서 tolerations를 설정했다.
ha:
enabled: true
replicas: 3
raft:
enabled: true
Kubernetes에 올리는 만큼 HA를 활성화 시켜준 후, raft 또한 활성화했다.
여기서 raft는 알고리즘 분산 합의 알고리즘으로 투표를 통해 leader를 선출하는 알고리즘이라고 간단하게 이해했다.
ui:
enabled: true
UI는 비개발자 및 담당자가 아닌 사람들에게 확인하기 쉬운 방법이기에 활성화했다.
이외에도 Ingress와 같은 몇몇 설정들을 수정했지만, 아직 Vault가 테스트 단계이기에 이정도로 충분하다고 판단했다.
그 후에는 작성한 values.yaml을 가지고 설치만 하면 된다.
helm install
$ helm -n vault upgrade --create-namespace --install vault hashicorp/vault -f values.yaml
주로 위의 명령어를 통해 설치를 하는데, helm install도 있지만 지속적으로 사용하기 편한 명령어로 upgrade를 자주 쓴다.
실제 업무에서는 위의 내용을 수행하기 전 –dry-run을 통해 변경사항을 추적해봐야한다.
$ kubectl get pod -n vault
NAME READY STATUS RESTARTS AGE
vault-0 0/1 Running 0 44s
vault-1 0/1 Running 0 43s
vault-2 0/1 Running 0 43s
vault-agent-injector-84ff5b7c68-8q4x7 1/1 Running 0 44s
vault pod 및 injector를 확인할 수 있다.
보면 STATUS는 Running이지만 READY가 되지 않은 것은 정상이다.
여기서 각 vault pod에 unseal 과정을 거쳐야하는데, 이 부분을 피할수도 있지만 꼭 필요한 과정인지 아닌지는 좀 더 고민해야겠다.
$ kubectl exec -it vault-0 -n vault -- /bin/sh
$ vault operator init
Unseal Key 1: GEM9KOGP3idf/QWERQWEWC8HuJGOQMmuD32XJw
Unseal Key 2: lyLfGraMXYKv9tqweqrqereqGtIS8k7BikBBS2VEt
Unseal Key 3: k6LjHUqweqrewtqwWEQqwEQW3Uvzc9qSSuQC
Unseal Key 4: ffE3TETTyaAEQWEQRWQRmAeSfqq4bAIRJ2TE
Unseal Key 5: 2qimewqrwtwrasdfgfdWEDi7ldd2GOMjBhsm1
Initial Root Token: hvs.MzdfgdasreqwrWAEWAckcqr1Ov6Zx
$ vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed true
Total Shares 5
Threshold 3
Unseal Progress 0/3
Unseal Nonce n/a
Version 1.17.2
Build Date 2024-07-05T15:19:12Z
Storage Type raft
HA Enabled true
$ vault operator unseal
Unseal Key (will be hidden):
# 위에서 받은 Unseal key를 입력해주고, unseal 과정을 3번 진행한다.
$ vault operator unseal
Unseal Key (will be hidden):
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 5
Threshold 3
Version 1.17.2
Build Date 2024-07-05T15:19:12Z
Storage Type raft
Cluster Name vault-cluster-539f65f4
Cluster ID 322ff178-4eef-16fb-b7aa-3af8c5590684
HA Enabled true
HA Cluster https://vault-0.vault-internal:8201
HA Mode active
Active Since 2024-09-24T01:08:53.231515211Z
Raft Committed Index 54
Raft Applied Index 54
# 마지막으로 unseal을 하게 되면 위와 같이 Sealed값이 false로 되어 있다.
위 과정을 거치게 되면 vault-0에 대한 unseal과정은 끝난다.
이런 방식을 vault-1, vault-2에도 해주면 되며, 추가적으로 vault-1과 vault-2는 join이 필요하다.
$ kubectl exec -it vault-1 -n vault -- /bin/sh
$ unseal 과정 필요
$ vault operator raft join http://vault-0.vault-internal:8200
Key Value
--- -----
Joined true
$ exit
$ kubectl exec -it vault-2 -n vault -- /bin/sh
$ unseal 과정 필요
$ vault operator raft join http://vault-0.vault-internal:8200
Key Value
--- -----
Joined true
$ exit
$ kubectl get all -n vault
NAME READY STATUS RESTARTS AGE
pod/cm-acme-http-solver-t796c 1/1 Running 0 10m
pod/vault-0 1/1 Running 0 10m
pod/vault-1 1/1 Running 0 10m
pod/vault-2 1/1 Running 0 10m
pod/vault-agent-injector-84ff5b7c68-8q4x7 1/1 Running 0 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/cm-acme-http-solver-548mg NodePort 34.118.230.10 <none> 8089:32008/TCP 10m
service/vault ClusterIP 34.118.234.193 <none> 8200/TCP,8201/TCP 10m
service/vault-active ClusterIP 34.118.236.198 <none> 8200/TCP,8201/TCP 10m
service/vault-agent-injector-svc ClusterIP 34.118.228.57 <none> 443/TCP 10m
service/vault-internal ClusterIP None <none> 8200/TCP,8201/TCP 10m
service/vault-standby ClusterIP 34.118.236.117 <none> 8200/TCP,8201/TCP 10m
service/vault-ui ClusterIP 34.118.239.57 <none> 8200/TCP 10m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/vault-agent-injector 1/1 1 1 10m
NAME DESIRED CURRENT READY AGE
replicaset.apps/vault-agent-injector-84ff5b7c68 1 1 1 10m
NAME READY AGE
statefulset.apps/vault 3/3 10m
위처럼 join 및 unseal을 하게 되면 정상적으로 모든 vault가 뜨는 것을 확인할 수 있다.
Vault 설치는 위와 같이 진행하면 될 것 같고, 뒤의 게시물에는 Vault의 key 생성 및 사용하는 과정에 대해서 작성해야겠다.