[TIL] Kubernetes 스토리지 & 보안 정리-2025.09.01

2025. 9. 1. 16:37대외활동/인공지능사관학교

728x90
반응형
SMALL

1. PV와 PVC (PersistentVolume / PersistentVolumeClaim)

  • 필요성: 컨테이너는 기본적으로 상태가 없는(stateless) 구조라 데이터가 사라짐 → DB, MQ 등은 영속 스토리지가 필요.
  • 개념
    • PV: 관리자가 제공한 실제 스토리지 리소스 (NFS, AWS EBS, iSCSI 등).
    • PVC: 사용자가 필요한 스토리지 요청 (용량, 접근 모드, StorageClass).
  • 바인딩 조건: 용량, 접근 모드, VolumeMode, StorageClass, Selector, VolumeName 등이 일치해야 함.
  • 실습 예제: hostPath 기반 MariaDB
    • mariadb-pv.yaml (PV 생성), mariadb-pvc.yaml (스토리지 요청),
    • mariadb-deployment.yaml에서 /var/lib/mysql 마운트,
    • 파드 삭제 후에도 데이터 유지 확인.
  • 주의점: hostPath는 학습/테스트용 → 프로덕션에서는 클라우드 블록 스토리지나 분산 파일 시스템 권장.

 

2. NFS 기반 스토리지 실습

  • NFS 서버 구성
    • Master 노드(server-a)에 /mnt/nfs/html 또는 /mnt/nfs/db_data 공유.
    • exports 설정 후 exportfs -a로 반영.
  • NFS 클라이언트 설정
    • Worker 노드(server-b, server-c)에서 /mnt/nfs/...를 마운트.
    • /etc/fstab 등록해 부팅 시 자동 마운트.
  • NGINX 예제 (nfs-exam)
    • nfs-pv.yaml (RWX PV), nfs-pvc.yaml, nfs-deployment.yaml (3개 파드), nfs-service.yaml (NodePort).
    • 웹 브라우저에서 NodePort 접속 → NFS 서버의 index.html 출력 확인.
  • MariaDB 예제 (mariadb-nfs)
    • RWX 모드의 PV/PVC, mariadb-deployment.yaml에서 /var/lib/mysql 마운트.
    • 파드 재시작 후에도 DB 데이터(Charlie, David) 유지됨을 검증.

 

3. 동적 프로비저닝 (Dynamic Provisioning)

  • 개념: PVC가 생성될 때 Kubernetes가 자동으로 PV를 생성 → 관리 효율성↑, 낭비↓.
  • 핵심 구성 요소
    • StorageClass: 프로비저닝 방식 정의 (provisioner, reclaimPolicy, volumeBindingMode).
    • Provisioner: 실제 스토리지 생성 담당 (AWS EBS, GCE PD, NFS, local-path 등).
  • 실습 예제 (local-path-provisioner)
    • local-storage-class.yaml: provisioner = rancher.io/local-path.
    • dynamic-pvc.yaml: 1Gi 요청, StorageClass 지정.
    • dynamic-pod.yaml: NGINX가 PVC를 /usr/share/nginx/html에 마운트.
  • 검증 포인트
    • PVC 생성 시 Pending 상태 → Pod가 스케줄링되면 PV 자동 생성 후 Bound.
    • 데이터는 파드 삭제 후에도 유지, PVC 삭제 시 PV까지 자동 삭제.

 

4. Kubernetes 보안: 인증 & 인가

  • 인증(Authentication): “너 누구냐?” → X.509 인증서, ServiceAccount, OIDC 토큰 등.
  • 인가(Authorization): “뭐 할 수 있냐?” → RBAC(Role-Based Access Control).
  • RBAC 핵심 리소스
    • Role / ClusterRole: 권한 정의.
    • RoleBinding / ClusterRoleBinding: 권한과 사용자 연결.
  • 예제 1: dev-user에 파드 조회 권한 부여
    • pod-reader-role.yaml: get, list, watch 권한.
    • dev-user-binding.yaml: dev-user와 Role 연결.
    • kubectl auth can-i list pods --as dev-user → yes 확인.
  • 예제 2: X.509 기반 dev-user 인증
    • 개인 키 생성 → CSR 제출 → 관리자 승인 → dev-user.crt 발급.
    • kubeconfig에 dev-user 추가, context 전환 후 권한 검증.
    • 파드 조회는 가능, Deployment/Service 생성은 거부됨.
  • 핵심 원칙: 최소 권한 원칙(Principle of Least Privilege) + 멀티테넌시 보장.

 

핵심 

  1. 스토리지 계층:
    • PV/PVC로 파드와 스토리지를 분리해 데이터 영속성 확보.
    • NFS로 멀티 노드 환경에서 공유 스토리지 구현 가능.
    • StorageClass 기반 동적 프로비저닝으로 자동화된 관리 가능.
  2. 보안 계층:
    • 인증/인가를 명확히 분리 → RBAC으로 세밀한 권한 제어.
    • 실제 환경에서는 기업 계정(OIDC) + RBAC 조합이 일반적.
  3. 실무적 감각:
    • hostPath는 학습용, 프로덕션에서는 RWX 가능한 NFS/클라우드 스토리지 권장.
    • 보안 설정은 단순한 접근 제어가 아니라 멀티테넌시 환경 안정성 확보에 직결됨.
728x90
반응형
LIST