Kubernetes로 서비스를 옮기면서 Secret 관리 방식을 정리함.
처음에는 Secret YAML을 직접 만들고 kubectl apply -f로 적용했음.
코드와 일반 배포 YAML은 Git으로 관리하면 되는데, 비밀번호나 Registry 인증정보가 들어간 Secret은 그대로 올릴 수 없음.
그래서 SOPS와 age를 사용해서 Secret 파일을 암호화한 상태로 Git에 두는 방식으로 진행함.
age 키 생성.
# age 키를 생성한다.
age-keygen -o age.key
age 공개키를 .sops.yaml에 등록함.
# SOPS 암호화 규칙을 작성한다.
vi .sops.yaml
creation_rules:
- path_regex: .*secret.*\.ya?ml$
age: age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Secret 파일은 평문 YAML로 먼저 작성함.
# Kubernetes Secret 원본 파일을 작성한다.
vi secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: rhymix-db-secret
namespace: 3009-yeonghoon-kim
type: Opaque
stringData:
MYSQL_DATABASE: rhymix
MYSQL_USER: rhymix
MYSQL_PASSWORD: 변경필요
MYSQL_ROOT_PASSWORD: 변경필요
작성한 Secret 파일을 SOPS로 암호화함.
# .sops.yaml 규칙을 기준으로 Secret 파일을 암호화한다.
sops -e -i secret.yaml
이후 Git에는 암호화된 secret.yaml만 올림.
복호화가 필요할 때는 age 개인키를 사용함.
# age 개인키로 Secret 파일을 복호화해서 내용을 확인한다.
SOPS_AGE_KEY_FILE=./age.key sops -d secret.yaml
Kubernetes에 적용할 때는 복호화 결과를 바로 kubectl apply로 넘김.
# 암호화된 Secret을 복호화해서 Kubernetes에 적용한다.
SOPS_AGE_KEY_FILE=./age.key sops -d secret.yaml | kubectl apply -f -
Secret 생성 확인.
# Secret 리소스가 생성되었는지 확인한다.
kubectl get secret rhymix-db-secret -n 3009-yeonghoon-kim
이제 Secret 값은 평문으로 Git에 남지 않음.
배포 파일은 Git으로 관리하고, Secret은 SOPS 파일을 이용해서 암호화/복호화하는 식으로 정리함.
age 개인키는 Git에 올리지 않고 따로 보관함.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 19 | DGX Kubernetes 구성 계획 | 김영훈 | 2026.06.08 | 25 |
| 18 | Kubernetes 기본 클러스터, ingress-nginx 설치 | 김영훈 | 2026.06.09 | 15 |
| 17 | Docker Compose 서비스를 Kubernetes로 이전(깃랩 도커 저장소 필요) [2] | 김영훈 | 2026.06.10 | 20 |
| 16 | yeonghoon.kim 배포 파일을 Helm Chart로 전환 [1] | 김영훈 | 2026.06.12 | 18 |
| » | SOPS age로 Kubernetes Secret 암복호화 | 김영훈 | 2026.06.15 | 23 |
| 14 | ArgoCD와 GitOps 구조 준비 | 김영훈 | 2026.06.16 | 16 |
| 13 | CoreDNS로 GitLab Registry 내부 주소 고정 | 김영훈 | 2026.06.17 | 19 |
| 12 | 복구 런북 초반 누락 사항 정리 | 김영훈 | 2026.06.17 | 15 |
| 11 | SOPS Secret 복구와 ArgoCD root Application 적용 | 김영훈 | 2026.06.18 | 28 |
| 10 | 관측 스택과 앱 배포 저장소 구조 정리 | 김영훈 | 2026.06.19 | 23 |
| 9 | ArgoCD 복구 중 GitLab 접근 문제 정리 | 김영훈 | 2026.06.22 | 26 |
| 8 | ImagePullBackOff와 registry pull secret 누락 | 김영훈 | 2026.06.22 | 17 |
| 7 | worker 재부팅 전 drain 절차 정리 | 김영훈 | 2026.06.26 | 20 |
| 6 | control-plane 장애 시나리오 관찰 | 김영훈 | 2026.06.27 | 12 |
| 5 | OutOfSync와 Degraded 구분하기 | 김영훈 | 2026.06.28 | 25 |
| 4 | Git revert는 기록을 지우는 게 아니라 되돌리는 기록을 남기는 것 | 김영훈 | 2026.06.29 | 19 |
| 3 | Stateful과 Stateless 구분해보기 | 김영훈 | 2026.07.02 | 23 |
| 2 | GitLab Registry PAT 만료로 이미지 Pull 실패 | 김영훈 | 2026.07.08 | 14 |
| 1 | yeonghoon.kim php 업그레이드 | 김영훈 | 2026.07.09 | 0 |