본문 바로가기

쿠버네티스

Kubernetes에서 Object Storage 사용하는 법: S3 연동부터 코드 예시까지

쿠버네티스(Kubernetes)를 사용하다 보면 애플리케이션의 데이터를 어디에 저장할지 고민하게 됩니다. 대부분의 경우 볼륨을 마운트해서 데이터를 저장하는 방식이 익숙하지만, 대용량 로그, 이미지, 백업 파일처럼 파일 크기가 크고 자주 변경되지 않는 데이터는 Object Storage(오브젝트 스토리지)를 사용하는 것이 적합합니다.

이 글에서는 Kubernetes에서 Object Storage를 어떻게 사용하는지, Block/File Storage와의 차이점, AWS S3를 활용한 실전 예시까지 알아보겠습니다.

 

목 차
  1. 1. Kubernetes에서 Object Storage와 File Storage 사용법 비교
  2. 2. Object Storage 사용 방법과 구성 방식
  3. 3. AWS S3를 사용하는 예시: 로그 관리 서비스 구성
  4. 4. S3를 파일시스템처럼 마운트하고 싶다면?
  5. 5. AWS CLI를 활용한 간단한 파일 업로드
  6. 6. 요약 정리

 

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의 initContainerJob 리소스 안에서 간단한 작업을 처리할 때 유용하게 활용됩니다.

 

6. 요약 정리

  • Kubernetes에서 Object Storage는 마운트하지 않고 API로 직접 접근합니다.
  • AWS S3와 같은 오브젝트 스토리지는 boto3, aws-sdk, aws-cli 등으로 접근하며, 애플리케이션이 직접 제어합니다.
  • Secret과 ConfigMap을 이용해 인증 정보와 설정값을 Pod에 주입할 수 있습니다.
  • PersistentVolumeClaim은 블록 또는 파일 스토리지에 사용하며, 오브젝트 스토리지에는 사용하지 않습니다.
  • 특별한 목적이 아니라면 S3를 마운트해서 쓰는 방식은 권장되지 않습니다.

초보자라면 처음에는 어렵게 느껴질 수 있지만, Object Storage는 확장성과 유연성이 뛰어나기 때문에 잘 익혀두면 다양한 Kubernetes 워크로드에서 강력한 무기가 됩니다.