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에 올리지 않고 따로 보관함.