서론
Kubernetes에서 환경변수를 파드에 직접 삽입이 가능했으나 이는 파드의 갯수가 많아 질 경우 관리하기 힘들다.
따라서 ConfigMap을 사용하여 환경변수 데이터를 중앙화 하였다.
ConfigMap은 이러한 환경변수를 텍스트 형태로 저장한다.
따라서 아이디나 비밀번호와 같은 민감한 정보를 텍스트 형태로 저장하는 것은 보안에 취약하다.
이를 위해 Kubernetes는 Secrets 리소스를 제공한다.
이 장에서는 Secret의 개념, 생성 방법, 사용 방식에 대해 다룬다.
Secret
필요성
ConfigMap은 평문으로 데이터를 저장하므로, 민감한 정보 저장에는 적합하지 않다.
따라서 Secret은 민감한 정보를 base64로 인코딩된 형태로 저장하여 기본적인 보호 기능 제공한다.


생성방법
- 명령형(Imperative)
--from-literal을 반복하여 여러 key-value 추가 가능하다.kubectl create secret generic app-secret --from-literal=DB_HOST=mysql
- 선언형 (Declarative)
- data 필드는 base64 인코딩 필수이다.
echo -n 'mysql' | base64명령어로 인코딩 가능하다.
apiVersion: v1 kind: Secret metadata: name: app-secret type: Opaque data: DB_PASSWORD: bXlzcWw= # base64 인코딩된 'mysql'
- 인코딩된 값을 다시 디코딩 가능하다

Type
secret 타입에는 여러가지가 존재한다.
| 타입 | 용도 | 비고 |
| Opaque | 일반적인 키-값 쌍 저장용 (기본값) | 암호, API 키 등 |
| kubernetes.io/service-account-token | 서비스 어카운트 토큰 | 자동으로 생성됨 |
| kubernetes.io/dockerconfigjson | Docker 이미지 풀 시크릿(JSON) | ~/.docker/config.json 구조 |
| kubernetes.io/basic-auth | 기본 인증용 (username/password) | 키 이름 username, password |
| kubernetes.io/ssh-auth | SSH 키 저장용 | 키 이름 ssh-privatekey |
| kubernetes.io/tls | TLS 인증서/키 저장용 | tls.crt, tls.key 키 필요 |
View Secret

Secrets in Pods
Secret을 파드에 활용하는 방법은 총 3가지가 존재한다.
1. 이름으로 참조
scret을 하나 만들고 그 이름을 파드안에 넣어준다.
envFrom:
- secretRef:
name: app-secret

2. 단일 키를 개별 주입
ConfigMap의 단일키 맵핑과 유사하다.
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
3. Volume mount
시크릿 파일을 만들어 실행하고 이를 볼륨에다가 삽입하는 형태이다.
볼륨에 삽입하는 경우 mountPath에 값들이 부여되어있다.
volumes:
- name: secret-volume
secret:
secretName: app-secret
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"

주의사항
Secret은 암호화되지 않고 인코딩(base64)만 되어 있음으로 누구든 디코딩으로 내용확인이 가능하다.
etcd에도 기본적으로 암호화되지 않다.
encryptionConfig 파일을 작성하고 kube-apiserver에 전달하여 암호화 설정 가능하다.
GitHub 등 저장소에 Secret 정의 파일 업로드하면 안된다.
RBAC 설정으로 네임스페이스 내 권한 제한 필요하다.
Comment