Kubernetes - ConfigMap, Secrets
쿠버네티스 ConfigMap 사용법
ConfigMap은 쿠버네티스에서 키-값 쌍 형태의 Config 데이터를 관리하는 데 사용됩니다.
이는 환경 변수를 통해 Pod의 컨테이너에 주입되거나, 파일로 마운트될 수 있습니다.
ConfigMap을 사용하는 주요 단계는 다음과 같습니다.
1. ConfigMap 생성
ConfigMap을 생성하는 방법에는 명령어를 사용하는 방법과 정의 파일을 사용하는 방법 두 가지가 있습니다.
1.1 명령어를 사용한 생성
명령어를 통해 ConfigMap을 생성할 수 있습니다.
키-값 쌍을 직접 지정하거나 파일을 통해 지정할 수 있습니다.
•
키-값 쌍을 직접 지정
kubectl create configmap app-config --from-literal=app.color=blue --from-literal=app.mode=production
Shell
복사
여러 키-값 쌍을 지정하려면 --from-literal 옵션을 여러 번 사용할 수 있습니다.
•
파일을 통해 지정
kubectl create configmap app-config --from-file=path/to/config-file
Shell
복사
이 방법을 통해 파일의 내용을 ConfigMap에 추가할 수 있습니다.
1.2 정의 파일을 사용한 생성
ConfigMap을 정의 파일로 생성할 수도 있습니다.
•
configmap.yaml 파일 예제
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.color: blue
app.mode: production
YAML
복사
•
정의 파일을 사용하여 ConfigMap 생성
kubectl apply -f configmap.yaml
Shell
복사
2. ConfigMap을 Pod에 주입
ConfigMap을 생성한 후, 이를 Pod에 주입하여 환경 변수로 사용하거나 파일로 마운트할 수 있습니다.
2.1 환경 변수로 주입
Pod 정의 파일에서 envFrom 속성을 사용하여 ConfigMap을 환경 변수로 주입할 수 있습니다.
•
Pod 정의 파일 예제
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
name: web-app
image: nginx
envFrom:
configMapRef:
name: app-config
YAML
복사
•
Pod 생성
kubectl apply -f pod.yaml
Shell
복사
2.2 파일로 마운트
Config Map의 데이터를 파일로 마운트할 수도 있습니다.
•
Pod 정의 파일 예제
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- name: web-app
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
YAML
복사
•
Pod 생성
kubectl apply -f pod.yaml
Shell
복사
3. Config Map 조회 및 설명
생성된 Config Map을 조회하고 내용을 확인할 수 있습니다.
•
Config Map 조회
kubectl get configmaps
Shell
복사
•
특정 Config Map 조회
kubectl get configmap app-config -o yaml
Shell
복사
•
Config Map 설명
kubectl describe configmap app-config
Shell
복사
정리
1.
ConfigMap을 생성하는 방법에는 명령어를 사용하거나 정의 파일을 사용하는 두 가지 방법이 있습니다.
2.
생성된 ConfigMap은 Pod에 환경 변수로 주입하거나 파일로 마운트할 수 있습니다.
3.
ConfigMap을 조회하고 설명하여 내용을 확인할 수 있습니다.
쿠버네티스 Secrets
쿠버네티스에서 비밀 데이터를 안전하게 관리하는 방법을 살펴보겠습니다.
아래 예제에서는 Python 웹 애플리케이션이 MySQL 데이터베이스에 연결되는 과정을 예시로 들어 비밀 데이터를 안전하게 다루는 방법을 설명합니다.
비밀 데이터의 중요성
비밀 데이터는 데이터베이스 비밀번호, API 키 등과 같이 민감한 정보를 포함하며, 이를 안전하게 관리하는 것이 매우 중요합니다. 비밀 데이터를 안전하게 관리하지 않으면 데이터 유출의 위험이 커집니다.
ConfigMap과 Secret의 차이
•
ConfigMap: Config 데이터를 일반 텍스트로 저장합니다.
호스트 이름과 사용자 이름을 저장하기에 적합하지만 비밀번호와 같은 민감한 정보를 저장하는 데는 적합하지 않습니다.
•
Secret: 민감한 정보를 인코딩된 형식으로 저장합니다. 비밀번호나 키와 같은 정보를 저장하기 위해 사용됩니다. ConfigMap과 유사하지만, Base64로 인코딩되어 저장된다는 점이 다릅니다.
Secret 데이터 생성 방법
Secret 데이터를 생성하는 방법은 두 가지가 있습니다.
명령적 접근
명령줄에서 secret 데이터를 생성하는 방법입니다.
kubectl create secret generic db-secret --from-literal=username=myuser --from-literal=password=mypassword
Shell
복사
이 명령을 통해 db-secret이라는 이름의 secret 객체를 생성하고, 사용자 이름과 비밀번호를 지정합니다.
선언적 접근
secret 정의 파일을 작성하여 secret 데이터를 생성하는 방법입니다.
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
username: bXl1c2Vy
password: bXlwYXNzd29yZA==
YAML
복사
여기서 username과 password는 Base64로 인코딩된 값입니다. 일반 텍스트를 Base64로 인코딩하려면 다음 명령을 사용합니다:
echo -n 'myuser' | base64 echo -n 'mypassword' | base64
Shell
복사
secret 데이터를 Pod에 주입하기
secret 데이터를 Pod에 주입하는 방법은 환경 변수로 주입하는 방법과 볼륨으로 마운트하는 방법이 있습니다.
환경 변수로 주입
Pod 정의 파일에 환경 변수를 추가하여 Secret 데이터를 주입합니다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
envFrom:
- secretRef:
name: app-secret
YAML
복사
이렇게 하면 app-secret의 secret 데이터가 Pod의 환경 변수로 주입됩니다.
볼륨으로 마운트
Secret 데이터를 파일로 마운트하여 Pod에서 사용할 수 있도록 합니다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
volumeMounts:
- name: secret-volume
mountPath: /etc/secrets
volumes:
- name: secret-volume
secret:
secretName: app-secret
YAML
복사
이렇게 하면 app-secret의 secret 데이터가 /etc/secrets 경로에 파일로 마운트됩니다.
비밀 데이터 보호 모범 사례
1.
Secret 정의 파일을 소스 코드 저장소에 체크인하지 않기
a.
Secret 데이터가 포함된 파일을 소스 코드 저장소에 업로드하지 않도록 주의해야 합니다.
2.
REST 암호화 사용
a.
etcd에 저장된 비밀 데이터를 암호화하여 저장하도록 설정합니다.
3.
역할 기반 액세스 제어(RBAC) 설정
a.
비밀 데이터에 접근할 수 있는 권한을 제한합니다.
추가 보안 고려사항
•
암호화 구성:
◦
휴지 상태(데이터가 디스크나 데이터베이스와 같은 저장 매체에 저장될 때 암호화된 상태로 저장되는 것)의 시크릿 데이터를 암호화하도록 설정 가능.
◦
예시:
kind: EncryptionConfiguration
apiVersion: apiserver.config.k8s.io/v1
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: base64-encoded-secret
- identity: {}
YAML
복사
외부 비밀 관리 도구
•
Helm Secrets
•
HashiCorp Vault
•
Azure Key Vault
•
Google Cloud Secret Manager
위의 도구를 사용하면 쿠버네티스 외부에서 비밀 데이터를 안전하게 관리할 수 있습니다.
Base64
쿠버네티스에서 secret 데이터는 Base64 형식으로 인코딩되어 저장됩니다.
하지만 Base64 인코딩된 secret은 쉽게 디코딩할 수 있으므로 안전하지 않다고 할 수 있습니다.
쿠버네티스 문서와 여러 블로그에서는 secret 데이터를 저장하는 "안전한 옵션"으로 언급되지만,
이는 평문으로 저장하는 것보다 비밀번호와 같은 민감한 데이터를 노출할 위험을 줄이기 때문입니다.
실제로 secret 자체가 안전한 것은 아니며, secret을 안전하게 사용하는 방법이 중요합니다.
위에서 언급하긴 했지만 secret을 안전하게 사용하는 몇 가지 모범 사례는 다음과 같습니다:
•
secret 객체 정의 파일을 소스 코드 저장소에 체크인하지 않기.
•
secret 데이터를 암호화하여 저장하기 위해 REST 암호화를 활성화하기.
쿠버네티스가 secret을 처리하는 방법도 안전성을 높이는 데 기여합니다.
예를 들어:
•
secret은 해당 secret을 필요로 하는 Pod가 있는 노드에만 전송됩니다.
•
Kubelet은 비밀을 디스크에 쓰지 않고 tmpfs에 저장합니다.
•
비밀을 필요로 하는 파드가 삭제되면 Kubelet도 로컬에서 비밀 데이터를 삭제합니다.
Secret 사용의 보호 및 위험에 대한 자세한 내용은 관련 문서를 참조하세요.
또한, 헬름 시크릿(Helm Secrets), 해시코프 볼트(HashiCorp Vault)와 같은 도구를 사용하여 비밀번호와 같은 민감한 데이터를 처리하는 더 나은 방법도 있습니다.