[Vault] Vault helm으로 설치하기


Vault를 helm으로 설치하는 것 자체는 그리 어렵지 않았다.

다만 설정을 해주는 부분들과 values.yaml을 파악하는 부분이 조금 어색했다.

일단 내가 설치한 방식대로 기록했다.





$ 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 -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 생성 및 사용하는 과정에 대해서 작성해야겠다.