GitOps와 Secret
GitOps는 단일 진실의 원천(SSOT)으로 Git 저장소를 사용합니다. (링크)
Secret 객체는 암호화와 전혀 상관없는 base64로 인코딩된 값으로 되어 있습니다.
그렇기 때문에 민감한 정보가 들어있는 Secret을 Git 저장소에 저장하면 위험합니다. (private 저장소라고 해도 누군가와 공유하는 순간 유출될 위험이 있습니다.)
이번 포스팅은 이 문제를 해결해주는 SealedSecret을 사용하는 방법에 대해 다룹니다.
GitHub Repository: https://github.com/bitnami-labs/sealed-secrets
SealedSecret
SealedSecret은 공개된 저장소에도 안전하게 Secret을 저장할 수 있도록 암호화를 해줍니다.
클러스터 내에 있는 SealedSecret 컨트롤러만 복호화가 가능하며, (원 작성자 포함) 누구도 복호화를 할 수 없습니다.
동작 방식
- `kubeseal cli`를 통해 Secret을 SealedSecret으로 암호화합니다. (SealedSecret 인증서 필요)
- 암호화된 SealedSeacret을 Git 저장소에 저장합니다.
- GitOps에 의해 SealedSecret이 쿠버네티스 클러스터에 배포됩니다.
- SealedScret Controller가 개인 키로 복호화를 합니다. 다른 파드에서 복호화된 Secret을 사용할 수 있게 됩니다.
사용 하기
설치
SealedSecret은 cluster-side 컨트롤러와 client-side 유틸리티로 구성되어 있습니다.
릴리즈 버전은 https://github.com/bitnami-labs/sealed-secrets/releases 에서 확인할 수 있습니다.
Cluster-side
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.3/controller.yaml
Client-side
brew install kubeseal
kubeseal로 Secret 암호화
Secret 리소스인 `mysecert.yaml` 파일을 `kubeseal`을 이용해 암호화합니다.
이때 `kubeseal`은 클러스터 내에 있는 SealedSecret 컨트롤러의 인증서(공개 키)를 이용해 `SealedSecret` 리소스를 만듭니다.
cat mysecret.yaml | kubeseal --controller-name=sealed-secrets --controller-namespace=default -oyaml > mysealed-secret.yaml
Git 저장소에 커밋
생성된 `sealed-secret.yaml` 파일을 Git 저장소에 올리면 GitOps에 의해 배포가 되고, 클러스터 내에 있는 SealdedSecret 컨트롤러가 자동으로 복호화합니다.
kubectl get secret
# 실행 결과
NAME TYPE DATA AGE
mysecret Opaque 1 1m
만약 컨트롤러의 인증서를 추출해 로컬에서 적용하는 방법은 커피고래님 블로그를 참고해주시면 됩니다.
참고
'DevOps' 카테고리의 다른 글
Argo Rollouts를 이용한 Blue-Green 배포 전략 적용하기 (0) | 2025.01.07 |
---|---|
GitHub Actions + ArgoCD로 k8s 클러스터 환경에서 CI/CD 구축하기 (0) | 2025.01.05 |
GitOps와 ArgoCD (1) | 2025.01.04 |