정지용
기술스택 목록
도구

Sealed Secrets

프로젝트 1에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

쿠버네티스 시크릿을 공개 저장소에도 안전하게 커밋할 수 있도록 암호화하는 도구

Sealed Secrets는 쿠버네티스 클러스터 내에 설치되는 컨트롤러와 CLI(kubeseal)로 구성되어, 평문 Secret을 비대칭키로 암호화한 SealedSecret 리소스로 변환해준다. 일반 Kubernetes Secret은 base64 인코딩일 뿐 암호화가 아니어서 Git 저장소에 커밋하면 내용이 그대로 노출되는데, 이를 해결하기 위해 만들어졌다. 암호화된 SealedSecret은 클러스터에 설치된 개인키를 가진 컨트롤러만 복호화할 수 있어, GitOps 방식으로 시크릿을 코드와 함께 버전 관리하고 배포할 수 있게 한다.

이럴 때 사용합니다

  • 시크릿까지 Git으로 버전 관리하는 GitOps 워크플로우를 구성할 때
  • public 또는 공유 저장소에 배포 매니페스트를 커밋해야 할 때
  • 외부 시크릿 관리 서비스(Vault 등) 도입 없이 클러스터 내에서 간단히 해결하고 싶을 때

핵심 개념

SealedSecret
평문 Secret을 암호화한 결과물로, 일반 쿠버네티스 커스텀 리소스 형태이며 Git 저장소에 안전하게 저장할 수 있다.
controller
클러스터 내부에서 실행되며 개인키를 보관하고, SealedSecret을 감지해 원래의 Secret 오브젝트로 복호화·생성해주는 컴포넌트다.
kubeseal
평문 Secret을 SealedSecret으로 암호화할 때 사용하는 CLI 도구로, 컨트롤러의 공개키를 이용해 암호화를 수행한다.
asymmetric encryption
공개키로 암호화하고 클러스터 내부의 개인키로만 복호화하는 방식으로, 개인키가 없으면 외부에서 절대 내용을 알 수 없다.
scope (namespace/name binding)
기본적으로 SealedSecret은 특정 네임스페이스와 리소스 이름에 묶여서만 복호화되며, 이를 통해 다른 곳으로 복사·재사용되는 것을 막는다.

Secret을 SealedSecret으로 암호화하기

평문 Secret을 만든 뒤 kubeseal로 암호화해 SealedSecret 파일을 생성하고, 이를 클러스터에 적용해 원래 Secret으로 복원하는 과정이다.

Shell
# 평문 Secret 정의를 kubeseal로 암호화하여 SealedSecret yaml 생성
kubectl create secret generic mysecret \
  --dry-run=client -o yaml \
  --from-literal=password=supersecret > secret.yaml

kubeseal --format=yaml < secret.yaml > sealedsecret.yaml

# 이후 sealedsecret.yaml만 Git에 커밋하고,
# 클러스터에 적용하면 controller가 자동으로 Secret을 복원한다
kubectl apply -f sealedsecret.yaml

처음 쓸 때 흔한 함정

  • 컨트롤러의 개인키를 백업해두지 않으면 클러스터 재구성 시 기존 SealedSecret을 복호화할 수 없다.
  • 기본 설정은 네임스페이스와 이름이 일치해야 복호화되므로 다른 네임스페이스로 복사하면 실패한다.
  • SealedSecret 자체는 안전하지만 복호화된 결과인 Secret은 여전히 base64 수준이므로 클러스터 접근 권한 관리도 함께 필요하다.

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.