configMap은 데이터를 일반 텍스트, 즉 평문으로 저장하기 때문에 암호를 저장하여 사용하기에는 적절하지 않다. 암호와 같은 민감정보를 저장해 사용할 때는 secret을 사용한다.
Secret
암호나 키와 같은 중요한 정보를 저장할 때 사용한다.
해쉬 형식으로 인코딩 되어 저장된다는 것을 제외하면 configMap과 유사한다.
configMap과 마찬가지로, 생성한 뒤 Pod에 주입되어 데이터를 전달한다.
생성 방법
- 명령형 방법으로 생성
명령어로 직접 키-값 쌍을 지정할 수 있다.
여러 키-값 쌍을 지정할 때에는 --from-literal 옵션을 여러 번 사용한다. 데이터가 많아져 복잡해지는 경우에는 파일로 데이터를 저장한 뒤, 해당 경로를 지정한다.
kubectl create secret generic <secret-name> --from-literal=<key>=<value> # --from-literal : 키-값 쌍 지정에 사용 kubectl create secret generic <secret-name> --from-file=<path-to-file> # --from-file : 필요 데이터가 저장된 파일 경로 지정
- 정의 파일을 이용하여 생성
hash 형식으로 암호화하여 값을 지정하도록 한다.
apiVersion: v1 kind: Secret metadata: name: app-secret data: # DB_Host: mysql # DB_User: root # DB_Password: paswrd DB_Host: bXlzcWw= DB_User: cm9vdA== DB_Password: cGFzd3Jk
- 리눅스에서는 아래 명령어를 이용하면 값을 암호화할 수 있다.
echo -n <VALUE> | base64
Secret 확인
kubectl get secrets
kubectl describe secrets
decribe로 다른 개체를 확인할 때와는 다르게, secret 내 각 속성의 값은 보이지 않을 것이다. 값까지 확인하고 싶다면 아래와 같이 get 명령에 -o yaml 옵션을 주어 확인할 수 있다.
kubectl get secret <SECRET_NAME> -o yaml
- 확인한 값을 평문으로 복호화할 때는 암호화할 때의 명령어에 decode 옵션을 준다.
echo -n '암호문' | base64 --decode
Secret 주입
pod 정의 파일에 envFrom 속성을 추가하여 환경변수를 전달할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
labels:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
envFrom:
- secretRef:
name: <SECRET_NAME>
envFrom 속성은 list이기 때문에 많은 환경변수를 전달할 수 있으며, list의 각 항목이 secret에 해당한다.