Consul에서 Raft 스토리지로 마이그레이션하기
Consul에서 Raft 스토리지로 마이그레이션하기
이 절차는 Kubernetes 환경에 Consul 스토리지로 구성된 Vault 클러스터가 배포되어 있다고 가정합니다. Consul 클러스터를 그대로 둔 채 스토리지 마이그레이션을 수행할 수 있습니다. Consul 클러스터에 대한 유일한 변경은 마이그레이션 중 Vault가 쓰는 잠금 파일입니다.
이 가이드는 기본 예시와 기본 Vault 구성을 사용합니다. 설명 목적이며, 환경과 관련된 특정 구성에 맞게 조정이 여전히 필요합니다.
중요: 마이그레이션을 시도하기 전에 항상 데이터를 백업하세요! 이것은 오프라인 작업이고 위험이 낮지만, 진행하기 전에 Consul 클러스터에서 최근 스냅샷을 만드는 것이 좋습니다.
출처: 문서
본문
개요 (Overview)
이 가이드는 중간 Helm 구성을 사용해 스토리지 마이그레이션을 수행할 init 컨테이너를 도입한 뒤, Raft 스토리지 백엔드를 사용하는 단일 Vault 서버를 시작해 결과를 검증합니다. 그런 다음 Helm 구성을 업데이트해 init 컨테이너를 제거하고 Vault 복제본을 시작합니다.
Vault 및 Kubernetes 설정
다음 vault status 출력과 Vault용 Helm 차트 값을 고려하세요.
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.14.8+ent
Build Date 2023-12-05T01:49:39Z
Storage Type consul
Cluster Name vault-cluster-68870bf8
Cluster ID cd18c692-f2e3-77a5-fba3-28f06f41f375
HA Enabled true
HA Cluster https://vault-0.vault-internal:8201
HA Mode active
Active Since 2024-04-10T02:45:33.367042122Z
Last WAL 52
Helm 차트 값:
global:
enabled: false
server:
enabled: true
image:
repository: hashicorp/vault-enterprise
tag: 1.14.8-ent
enterpriseLicense:
secretName: vault-license
secretKey: vault.hclic
ha:
enabled: true
replicas: 3
config: |
ui = true
service_registration "kubernetes" {}
listener "tcp" {
address = ":8200"
cluster_address = ":8201"
tls_disable = 1
}
storage "consul" {
path = "vault"
address = "http://HOST_IP:8500"
}
마이그레이션 절차
- Helm으로 Vault를 제거합니다.
$ helm uninstall vault
배포된 StatefulSet은 최초 배포 후 특정 속성을 수정할 수 없습니다. 따라서 StatefulSet 배포는 완전히 교체되어야 합니다.
Consul 스토리지를 사용하는 Vault 서버는 기본적으로 무상태(stateless)입니다. 명시적으로 구성하지 않는 한 Vault 서버 StatefulSet은 PVC(Persistent Volume Claim)나 다른 산출물을 만들지 않습니다. Vault의 인덱스는 상태를 보유하며, 이는 완전히 Consul 서버 StatefulSet의 영구 볼륨에 저장됩니다.
주의: Helm이나 다른 오케스트레이션 플랫폼을 통해 관리되는 상태 정보에 대해 Vault 배포 구성을 검토하고 적절한 백업을 만드는 것을 강력히 권장합니다.
- 스토리지 마이그레이션 구성을 포함하는 ConfigMap을 만듭니다.
$ cat > vault-storage-migration-configmap.yml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app.kubernetes.io/instance: vault
app.kubernetes.io/name: vault
name: storage-migration
namespace: default
data:
migrate.hcl: |-
storage_source "consul" {
address = "http://consul-server.default.svc.cluster.local:8500"
path = "vault/"
}
storage_destination "raft" {
path = "/vault/data"
}
cluster_addr = "https://vault-0.vault-internal:8201"
EOF
종종 Vault 서버는 Consul 클라이언트 에이전트를 통해 Consul과 통신해야 합니다. 이 예시는 Kubernetes에 배포된 Consul 서버의 서비스 엔드포인트를 사용하지만, Kubernetes 외부에 배포된 Consul 서버 클러스터에서도 작동할 수 있습니다.
- ConfigMap을 적용합니다.
$ kubectl create -f vault-storage-migration-configmap.yml
- Raft 마이그레이션 스토리지 구성으로 Vault를 Helm 배포로 설치합니다.
$ cat > vault-migration-values.yml <<EOF
global:
enabled: false
server:
enabled: true
image:
repository: hashicorp/vault-enterprise
tag: 1.14.8-ent
enterpriseLicense:
secretName: vault-license
secretKey: vault.hclic
extraInitContainers:
- name: vault-storage-migration
image: hashicorp/vault-enterprise:1.14.8-ent
command:
- "/bin/sh"
- "-ec"
args:
- "/bin/vault operator migrate -config /vault/storage-migration/migrate.hcl"
volumeMounts:
- name: storage-migration
mountPath: "/vault/storage-migration"
- name: data
mountPath: "/vault/data"
volumeMounts:
- name: storage-migration
mountPath: "/vault/storage-migration"
volumes:
- name: storage-migration
configMap:
name: storage-migration
dataStorage:
enabled: true
size: "1Gi"
ha:
enabled: true
replicas: 1
raft:
enabled: true
config: |
ui = true
service_registration "kubernetes" {}
listener "tcp" {
address = ":8200"
cluster_address = ":8201"
tls_disable = 1
}
storage "raft" {
path = "/vault/data"
retry_join {
auto_join_scheme = "http"
auto_join = "provider=k8s"
}
}
EOF
구성 참고:
storage "raft"구성: 원래 구성에서 Raft DB의 경로(/vault/data기본값)와retry_join매개변수를 지정합니다. 이 예시는auto_join을 사용해 Kubernetes API를 통해 Raft 피어를 자동으로 찾습니다. 자세한 내용은 retry_join 문서를 참고하세요.dataStorage구성: Helm 오버라이드 값에서 Vault StatefulSet이 만들 PVC의 매개변수를 지정합니다.extraInitContainers: 스토리지 마이그레이션 ConfigMap과 데이터 볼륨을 마운트하는 init 컨테이너를 시작하며, 이를 사용해 스토리지 마이그레이션을 실행합니다.replicas: 1: 이 설정은 마이그레이션 목적의 임시 설정입니다. 단일 복제본의 새 Vault StatefulSet으로 init 컨테이너가 마이그레이션을 완료했는지 확인하고 새 스토리지 백엔드로 Vault를 봉인 해제합니다.
- 이 구성을 적용합니다.
$ helm install vault hashicorp/vault -f vault-migration-values.yml
- 마이그레이션 로그를 검토합니다.
$ kubectl logs vault-0 -c vault-server-migration
- Vault를 봉인 해제합니다.
$ kubectl exec -it vault-0 -- vault operator unseal
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.14.8+ent
Build Date 2023-12-05T01:49:39Z
Storage Type raft
Cluster Name vault-cluster-68870bf8
Cluster ID cd18c692-f2e3-77a5-fba3-28f06f41f375
HA Enabled true
HA Cluster https://vault-0.vault-internal:8201
HA Mode active
Active Since 2024-04-10T04:20:23.707098402Z
Raft Committed Index 157
Raft Applied Index 157
Last WAL 55
- Vault Helm 배포를 Raft 스토리지 구성으로 업데이트합니다.
$ cat > vault-raft-values.yml <<EOF
global:
enabled: false
server:
enabled: true
image:
repository: hashicorp/vault-enterprise
tag: 1.14.8-ent
enterpriseLicense:
secretName: vault-license
secretKey: vault.hclic
dataStorage:
enabled: true
size: "1Gi"
ha:
enabled: true
replicas: 5
raft:
enabled: true
config: |
ui = true
service_registration "kubernetes" {}
listener "tcp" {
address = ":8200"
cluster_address = ":8201"
tls_disable = 1
}
storage "raft" {
path = "/vault/data"
retry_join {
auto_join_scheme = "http"
auto_join = "provider=k8s"
}
}
EOF
구성 참고:
replicas: 5: 최종 Raft 스토리지 구성으로 Helm 배포를 제자리 업그레이드하고, extraInitContainer와 스토리지 마이그레이션 ConfigMap을 제거하며, 복제본 수를 늘립니다. 새 Vault 서버 복제본이 자동으로 클러스터에 조인하는 데 사용하는retry_join매개변수.
- 구성을 적용합니다.
$ helm upgrade vault hashicorp/vault -f vault-raft-values.yml
- Vault를 봉인 해제합니다.
$ for i in {1..4} ; do kubectl exec -it vault-0 -- vault operator unseal ; done
- Raft 피어가 정족수를 형성했는지 확인합니다.
$ kubectl exec -it vault-0 -- vault operator raft list-peers
Node Address State Voter
---- ------- ----- -----
24c166d8-a8bb-3ac7-f8a0-12bd066a34bb vault-0.vault-internal:8201 leader true
626434d1-170b-575a-2a04-af4f2e90820b vault-1.vault-internal:8201 follower true
1dfbba31-9b5b-2d16-18ce-bfa7b6c0ead6 vault-2.vault-internal:8201 follower true
3f333082-1a64-7559-0142-e4f1658a28f3 vault-3.vault-internal:8201 follower true
9ca5a15e-3ddc-d132-0b46-5b895f3828dc vault-4.vault-internal:8201 follower true
롤백 절차 (Rollback procedure)
원래 구성을 되돌리려면 Helm 배포를 삭제하고 Consul 스토리지 구성을 지정하는 오버라이드 값으로 다시 배포하기만 하면 됩니다.
참고: Raft 스토리지를 사용하는 기본 Vault Helm 차트 구성은 생성된 PVC를 유지합니다. Vault는 Consul 스토리지로 구성된 동안 이를 사용하지 않습니다. 마이그레이션을 다시 시도하기 전에 PVC를 제거해야 합니다.
- Helm으로 Vault를 제거합니다.
$ helm uninstall vault
- 이전 Consul 스토리지 구성으로 Vault를 Helm으로 설치합니다.
$ helm install vault hashicorp/vault -f vault-consul-values.yml
- Vault를 봉인 해제하고 스토리지가 Consul로 되돌아갔는지 확인합니다.
$ kubectl exec -it vault-0 -- vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.14.8+ent
Build Date 2023-12-05T01:49:39Z
Storage Type consul
Cluster Name vault-cluster-68870bf8
Cluster ID cd18c692-f2e3-77a5-fba3-28f06f41f375
HA Enabled true
HA Cluster https://vault-0.vault-internal:8201
HA Mode active
Active Since 2024-04-10T04:44:12.516016652Z
Last WAL 54
참고 자료 (References)
- Vault operator migrate command
- Helm Chart configuration
- Vault on Kubernetes deployment guide
- Vault Helm Chart configuration
- kubectl commands
- Kubernetes storage volumes
- Create a Pod that has an Init Container
- Helm docs