쿠버네티스(Kubernetes)를 사용하다 보면 애플리케이션의 데이터를 어디에 저장할지 고민하게 됩니다. 대부분의 경우 볼륨을 마운트해서 데이터를 저장하는 방식이 익숙하지만, 대용량 로그, 이미지, 백업 파일처럼 파일 크기가 크고 자주 변경되지 않는 데이터는 Object Storage(오브젝트 스토리지)를 사용하는 것이 적합합니다.
이 글에서는 Kubernetes에서 Object Storage를 어떻게 사용하는지, Block/File Storage와의 차이점, AWS S3를 활용한 실전 예시까지 알아보겠습니다.
목 차
1. Kubernetes에서 Object Storage와 File Storage 사용법 비교
쿠버네티스에서는 일반적으로 PersistentVolume(PV)와 PersistentVolumeClaim(PVC)을 이용하여 스토리지를 Pod에 마운트합니다. 이 방식은 Block Storage 또는 File Storage에 적합합니다. 예를 들어 AWS EBS, NFS, Ceph 같은 스토리지가 이에 해당합니다.
그러나 Object Storage는 마운트하는 방식이 아닙니다.
오브젝트 스토리지는 파일을 객체로 관리하며, HTTP API를 통해 데이터를 주고받습니다. 대표적으로 AWS S3, Google Cloud Storage, Azure Blob Storage 등이 있습니다. 따라서 Kubernetes에서는 Object Storage를 PVC로 연결하지 않고, Pod 내부 애플리케이션이 직접 API를 호출하여 사용합니다.
2. Object Storage 사용 방법과 구성 방식
Object Storage는 API 기반으로 동작하므로, Kubernetes에서는 일반적으로 다음과 같이 구성합니다.
- Secret: AWS S3 인증 정보(access key, secret key)
- ConfigMap 또는 환경변수: 버킷 이름, 리전(region), 엔드포인트(endpoint) 등 설정값
- 애플리케이션 코드 또는 SDK: boto3, aws-sdk 등 S3 API 호출 라이브러리
- Pod 템플릿: 위 정보들을 전달받아 API를 통해 파일 업로드/다운로드 처리
이런 구조를 통해 워커노드에 마운트하지 않아도 오브젝트 스토리지를 활용할 수 있습니다. 이 방식은 확장성과 독립성이 뛰어나며, 다양한 클라우드 환경에서도 일관되게 적용할 수 있습니다.
3. AWS S3를 사용하는 예시: 로그 관리 서비스 구성
AWS S3를 사용하는 구체적인 예시로, Kubernetes에서 실행되는 Python 기반 로그 수집기가 특정 이벤트 발생 시 로그 파일을 S3로 업로드하는 구조를 구성해보겠습니다.
Kubernetes에서 사용하는 환경 설정
apiVersion: v1
kind: Secret
metadata:
name: s3-secret
type: Opaque
data:
accessKey: BASE64\_ENCODED\_ACCESS\_KEY
secretKey: BASE64\_ENCODED\_SECRET\_KEY
---
apiVersion: v1
kind: Pod
metadata:
name: log-uploader
spec:
containers:
- name: app
image: python:3.10
command: \["python", "upload\_logs.py"\]
env:
- name: AWS\_ACCESS\_KEY\_ID
valueFrom:
secretKeyRef:
name: s3-secret
key: accessKey
- name: AWS\_SECRET\_ACCESS\_KEY
valueFrom:
secretKeyRef:
name: s3-secret
key: secretKey
- name: AWS\_DEFAULT\_REGION
value: ap-northeast-2
- name: S3\_BUCKET
value: my-log-bucket
Python 코드 예시 (upload_logs.py
)
import boto3 import os
s3 = boto3.client('s3')
bucket = os.environ\['S3\_BUCKET'\]
# 업로드할 파일 경로
local_path = "/app/logs/event.log"
s3_path = "logs/2025-03-25-event.log"
# 파일 업로드
s3.upload_file(local_path, bucket, s3_path)
print("로그 파일이 S3에 업로드되었습니다.")
이 예시는 간단하지만 실무에서도 유용하게 쓰일 수 있는 패턴입니다. 다양한 상황에 맞게 확장 가능하며, S3 버킷 정책을 통해 권한 제어도 할 수 있습니다.
4. S3를 파일시스템처럼 마운트하고 싶다면?
간혹 "그냥 S3를 마운트해서 쓰면 안 되나요?" 라는 질문을 받을 수 있습니다.
기술적으로는 s3fs
, goofys
같은 FUSE 기반 도구를 이용해 S3를 파일시스템처럼 마운트할 수 있습니다. 하지만 이 방식은 일반적인 파일 시스템과 달리 지연(latency)이 크고 쓰기 제한이 존재할 수 있으며, Pod의 lifecycle과 잘 맞지 않을 수 있습니다.
운영 환경에서는 이런 마운트 방식보다는 API를 통한 직접 접근 방식이 안정적이고 관리하기 쉽습니다.
5. AWS CLI를 활용한 간단한 파일 업로드
단순히 로그 파일 하나만 올리는 용도라면 애플리케이션에 SDK를 넣는 대신 aws-cli
를 Init Container에서 사용하는 방식도 가능합니다.
bash aws s3 cp /tmp/file.txt s3://my-bucket/logs/file.txt
이 명령은 Kubernetes의 initContainer
나 Job
리소스 안에서 간단한 작업을 처리할 때 유용하게 활용됩니다.
6. 요약 정리
- Kubernetes에서 Object Storage는 마운트하지 않고 API로 직접 접근합니다.
- AWS S3와 같은 오브젝트 스토리지는
boto3
,aws-sdk
,aws-cli
등으로 접근하며, 애플리케이션이 직접 제어합니다. - Secret과 ConfigMap을 이용해 인증 정보와 설정값을 Pod에 주입할 수 있습니다.
PersistentVolumeClaim
은 블록 또는 파일 스토리지에 사용하며, 오브젝트 스토리지에는 사용하지 않습니다.- 특별한 목적이 아니라면 S3를 마운트해서 쓰는 방식은 권장되지 않습니다.
초보자라면 처음에는 어렵게 느껴질 수 있지만, Object Storage는 확장성과 유연성이 뛰어나기 때문에 잘 익혀두면 다양한 Kubernetes 워크로드에서 강력한 무기가 됩니다.
'쿠버네티스' 카테고리의 다른 글
Kubernetes에서 L7 Load Balancer와 Ingress Controller로 SSL Offloading 설정하는 방법 (0) | 2025.04.04 |
---|---|
pause image 총 정리 - failed to pull image "registry.k8s.io/pause:3.9" (0) | 2025.04.02 |
Kubernetes Multi Cluster (0) | 2025.03.24 |
curl: (35) OpenSSL SSL_connect: Connection reset by peer (0) | 2025.03.22 |
helm uninstall시 일부 리소스가 남아 있는 이유 (0) | 2025.03.21 |