Kubernetes Object [Part 04]
지난 포스팅에 이어 Object에 대해 마지막 포스팅이 될 것 같습니다.
이 외에도 여러 Object가 있지만 대표적인 것들을 기본적으로 다루어보았고,
추 후에는 이 Object들을 묶어서
하나의 Side Project를 진행하려고 합니다 :)
01. ConfigMap
- 워크로드에 필요한 설정 정보를 key-value 형태로 저장할 수 있는 데이터 오브젝트
- 간단한 환경변수 부터 nginx.conf 와 같은 설정 파일도 저장 가능.

💁♂️ 주요 특징
1. 설정 데이터 저장
- 환경 변수, 명령줄 인자, 설정 파일 등 다양한 형태의 설정 정보를 저장할 수 있다.
2. 애플리케이션과 분리
- 설정을 코드와 분리하여 관리함으로써 동일한 App의 Image를 여러 환경(prod, dev, stg)에서 다르게 설정 O
3. 네임스페이스 단위 관리
- ConfigMap은 특정 네임스페이스에 속하며, 같은 namespace내의 Pods에서 참조 가능.
■ ConfigMap 생성
# 직접 cli 형태로 값을 지정하여 생성
kubectl create configmap --save-config test2-config --from-literal=app=blue --from-literal=connection.max=100
kubectl get configmap test2-config -o yaml | yq .data
# file에서 값을 참고하여 생성 (nginx.conf 파일이 존재했을 때 가정)
kubectl create configmap --save-config test3-config --from-file=nginx.conf
kubectl get configmap test3-config -o yaml | yq .data
위 이미지를 참고하였을때, ConfigMap을 생성 후 Pods에 Mount하여 사용할 수 있다.
02. Secret
- 워크로드에 필요한 민감 정보를 key-value 형태로 저장할 수 있는 데이터 오브젝트
- 예) DB정보, 인증서, API token 등.
- base64 incording 상태로 저장한다.

💁♂️ 사용하는 이유
애플리케이션 개발에서 민감한 정보를 Source code에 직접 하드코딩 하거나, Container Image에 포함하는 것은
보안상 매우 위험하다. Secret은 이러한 취약점을 해결해준다 !!!
- 보안 강화: 민감한 데이터가 코드나 설정 파일에 노출되는 것을 방지합니다.
- 재사용성: 동일한 Secret을 여러 파드에서 재사용할 수 있습니다.
- 관리 용이성: 모든 민감한 정보를 중앙 집중식으로 관리할 수 있어 보안 정책 적용 및 감사에 용이합니다.
- 개발/운영 분리: 개발자는 애플리케이션 로직에 집중하고, 민감한 정보는 Secret을 통해 운영 환경에서 관리
■ 데이터 저장 방식
Base64 방식으로 incording 되어 저장되며, 완전한 암호화 방식이 아니라 단순히 사람이 읽을 수 없는 형태임.
echo -n 'my-secret-password' | base64
# 결과: 'bXktdGlwb2RrLXVhc3N3b3Jk'
💁♂️ 보안 관리 필요!
1. etcd 암호화
- 쿠버네티스 클러스터의 상태 정보가 저장되는 etcd는 기본적으로 암호화되지 않습니다. etcd 데이터를 안전하게 보호하려면 etcd 스토리지를 암호화하거나, 데이터를 안전하게 저장하는 방법을 구현해야 한다.
2. 권한 관리 (RBAC 방식)
- Secret은 Pod와 마찬가지로 쿠버네티스 RBAC(Role-Based Access Control)에 의해 보호됩니다. 특정 사용자나 서비스 계정만이 Secret에 접근할 수 있도록 적절한 권한을 부여해야 한다.
3. 외부 서드파티 솔루션 활용
- Sealed Secrets, HashiCorp Vault와 같은 서드파티 솔루션을 사용하여 Secret에 대해 생성, 회전(Rotation), 감사(Audit) 등 더욱 강력하게 암호화하고 관리하는 것이 좋다.
■ Secret 생성
# 직접 cli 형태로 값을 입력하여 생성
kubectl create secret generic --save-config test2-secret --from-literal password=test123
kubectl get secret test2-secret -o yaml | yq .data
# 디코딩
echo -n '<인코딩 된 secret>' | base64 -d
# file에서 값을 참고하여 생성
vi db-secret.txt
data:
DB_HOST: test
DB_PASSWORD: test123
kubectl create secret generic --save-config test3-secret --from-env-file db-secret.txt
kubectl get secret test3-secret -o yaml | yq .data
03. Volume
- 스토리지 볼륨을 추상화하여 pod와 느슨하게 결합시킨 Resource
- 미리 생성이 되어있는 사용가능한 볼륨을 Pod에서 정적으로 정의하여 사용한다.
- Container-Level 에서 사용된다.
💁♂️ Volume 이란?
Kubernetes에서 Container는 임시적이다. 즉, Container가 재시작될 때마다 새로운 상태로 시작되며,
내부에 있는 모든 데이터가 사라지게 됩니다. 이런 Container의 휘발성 때문에 영구적인 Data 저장 공간이 필요하며
이 목적 달성을 위해 Kubernetes에서 Volume 이라는 추상화 개념을 제공하게 되었다.
또한, 동일한 Pod내에 여러 Container들이 동일한 file이나 data를 공유해야할 때가 있다.
예를들어 웹서버와 로그 수집 Agent가 같은 Volume을 공유하여 서로간에 접근 및 공유가 가능하다 !!
■ 주요 Volume Type
1. emptyDir
- Pod가 생성될 때 함께 생성되는 빈 Directory.
- Pod가 존재할때만 유효하며, Pod가 종료되면 emptyDir의 내용도 함께 사라진다.
- 주로 Pod내 Container간 임시 데이터 공유 공간으로 사용됨.

2. hostPath
- Node의 file system 경로를 Pod에 Mount하여 사용된다.
- Pod내의 Container는 Node의 특정 Directory에 접근 가능하다.
- Pod가 다른 Node로 스케줄링되면 이전에 저장했던 데이터에 접근할 수 없으므로 주의해야함.

■ Volume의 한계
- 컨테이너 자신만 접근 가능한 비영구적 볼륨이기 때문에 컨테이너가 재시작할때 유지할 수 없다.
- kubernetes 클러스터 레벨에서 볼륨을 관리하기 어려움
- volume이 변경될때마다 해당 volume을 사용하는 모든 파드의 설정 변경이 필요함
3-1. Persistent Volume (PV)
- Kubernetes에서 영구 스토리지를 사용하는 표준적인 방법.
- 추상화된 가상의 Volume Object로 별도로 정의 및 생성하여 Pod와 연결한다.
- Pods-Level에서 사용된다.
💁♂️ PV 란?
Cluster 관리자가 프로비저닝 하거나, StorageClass를 통해 동적으로 프로비저닝되는 Cluster Storage Resource.
예시로 AWS EBS, Azure Disk, NFS 등이 있다고 참고하자.
💁♂️ PVC 란?
- Persistent Volume Claim이라고 하며 사용자가 PV를 요청하고 binding 하기 위한 Resource.
- Pod가 Storage를 필요로할 때 PVC를 통해 원하는 스토리지 용량, 접근모드 등을 선언하여 요청한다.
- 접근 모드에는 ReadWriteOnce, ReadOnlyMany, ReadWriteMany가 있음.
■ 동작 방식
사용자가 PVC를 생성 → Kubernetes는 해당 요구사항을 만족하는 PV를 찾아 자동으로 Binding →
Pods는 PVC를 참조하여 Storage를 사용하게 된다.
3-2. StorageClass
- PV를 조금 더 효율적으로 사용하는 방법이며 동적 스토리지 프로비저닝을 위한 오브젝트
💁♂️ SC 란?
관리자가 다양한 유형의 스토리지 (HDD, SSD, 고성능, 저비용 등)를 정의해놓으면, 사용자가 PVC에서
특정 StorageClass를 지정하여 해당 속성에 맞는 PV를 자동으로 생성할 수 있다.
■ SC 정의

즉, 동적 프로비저닝을 사용하려면?
조건 01.Cluster 내에 StorageClass 리소스가 정의되어 있어야 한다.
조건 02. StorageClass에 정의된 프로비저너가 Cluster에 배포되어 실행중이어야 한다.
조건 03. 이 프로비저너는 Cloud 제공업체의 API등을 호출하여 실제 Storage 볼륨을 생성하고 PV 리소스로
추상화하는 역할을 한다.
PV와 SC 관계 요약
- Kubernetes 스토리지 모델의 핵심 목표는 스토리지 제공자(infra 팀), 사용자(Application 개발자)의 역할을 분리하고 추상화 하는 것이다.
💁♂️ 스토리지 제공자 (Cluster 관리자 / infra 팀)
- 다양한 유형의 스토리지(SSD, HDD, 네트워크 파일 시스템 등)를 클러스터에 연결하고 설정.
- 이러한 스토리지 유형을 StorageClass 라는 리소스로 정의합니다. (예: gold-ssd, silver-hdd, nfs-shared). 각 StorageClass는 해당 스토리지의 특징, 성능, 그리고 실제 스토리지를 생성하는 방법(Provisioner)을 담고 있다.
- 정적 프로비저닝의 경우, 미리 PV를 생성해두기도 합니다.
💁♂️ 스토리지 사용자 (Application 개발자)
- 자신이 개발하는 애플리케이션(파드)이 데이터를 저장하기 위해 필요한 스토리지 "요구사항"을 명세한다.
- 이 요구사항을 PersistentVolumeClaim (PVC) 이라는 리소스로 정의합니다. PVC는 단순히 "나 (예: 10Gi) 만큼의 공간이 필요해, (예: gold-ssd 같은) 고성능 스토리지가 좋아" 와 같은 추상적인 요청입니다. 개발자는 스토리지의 실제 물리적 위치나 복잡한 설정에 대해 알 필요가 없다 !!!
Kubernetes Object Part를 읽어봐주셔서 감사드리며,
기본적인 내용을 담고 있으므로 추 후 Deep한 내용으로 Project에서 찾아뵙겠습니다 :)