Object Storage는 대규모 데이터를 효율적으로 저장하고 관리하는 데 필수적인 요소입니다.
이번 글에선 AWS S3를 Kubernetes Cluster에 연동하는 방법과 PV, PVC를 사용하여 데이터를 저장하는 방법에 대해 자세히 설명합니다.
목 차
1. Object Storage 개요
Object Storage는 대량의 비정형 데이터를 저장하기 위한 스토리지 시스템으로, 다음과 같은 특징을 가집니다.
- 스케일 아웃 가능성: 대량의 데이터를 저장하고 처리할 수 있도록 설계되었으며, 용량 확장이 용이합니다.
- 파일 및 블록 스토리지와 차이점: Object Storage는 데이터를 개별 오브젝트(객체)로 저장하며, 각 오브젝트는 고유한 식별자(URI)를 가집니다.
- 메타데이터 지원: 각 객체는 사용자 정의 메타데이터를 포함할 수 있어, 데이터 관리 및 검색이 용이합니다.
- HTTP 기반 접근: API를 통해 HTTP(S) 프로토콜로 데이터를 읽고 쓸 수 있으며, S3 호환 API를 제공하는 서비스가 많습니다.
- 고가용성 및 내구성: 다중 데이터 센터 또는 리전 간 복제 기능을 지원하여 높은 가용성을 보장합니다.
대표적인 Object Storage 솔루션으로는 AWS S3, MinIO, Ceph, Google Cloud Storage 등이 있습니다. Kubernetes 환경에서는 MinIO나 Ceph를 자주 사용합니다.
2. Kubernetes에서 Object Storage 사용 방법
Kubernetes에서 Object Storage를 사용하기 위해서는 외부 스토리지 서비스를 활용하거나 자체적으로 구축해야 합니다. 보편적으로 사용되는 방법은 다음과 같습니다.
- 클라우드 기반 Object Storage 사용: AWS S3, Google Cloud Storage, Azure Blob Storage와 같은 클라우드 서비스를 Kubernetes에서 직접 연동하여 사용합니다.
- 자체 구축 Object Storage 사용: Kubernetes 내부에 MinIO, Ceph RADOS Gateway(RGW) 등을 배포하여 내부적으로 Object Storage 서비스를 운영할 수도 있습니다.
- CSI (Container Storage Interface) 드라이버 활용: Kubernetes에서 외부 Object Storage를 PVC(Persistent Volume Claim)로 마운트하여 사용할 수 있도록 하는 CSI 드라이버를 사용합니다.
3. Kubernetes에서 AWS S3를 활용한 애플리케이션 배포
3.1 Persistent Volume 및 Persistent Volume Claim 설정
아래는 AWS S3를 Persistent Volume으로 설정하는 예제 YAML 파일입니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: s3-pv
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: s3.csi.k8s.io
volumeHandle: my-s3-bucket
volumeAttributes:
bucketName: my-s3-bucket
region: us-east-1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: s3-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Gi
volumeName: s3-pv
3.2 AWS S3를 사용하는 애플리케이션 배포
아래는 S3 PVC를 마운트하여 사용할 수 있는 간단한 애플리케이션 배포 예제입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: s3-app
spec:
replicas: 1
selector:
matchLabels:
app: s3-app
template:
metadata:
labels:
app: s3-app
spec:
containers:
- name: s3-container
image: my-app-image:latest
volumeMounts:
- mountPath: "/data"
name: s3-storage
env:
- name: AWS_REGION
value: "us-east-1"
- name: S3_BUCKET_NAME
value: "my-s3-bucket"
volumes:
- name: s3-storage
persistentVolumeClaim:
claimName: s3-pvc
3.3 AWS S3 사용 전 확인해야 할 사항
AWS S3를 Persistent Volume으로 사용하기 전에 다음 사항을 확인해야 합니다.
- Kubernetes 클러스터의 CSI 지원 여부
- s3.csi.k8s.io 드라이버가 클러스터에서 지원되는지 확인해야 합니다.
- 지원되지 않는 경우 Kubernetes 클러스터에 S3 CSI 드라이버를 설치해야 합니다.
- AWS IAM 권한 설정
- Kubernetes 클러스터에서 S3 버킷을 접근할 수 있도록 IAM 역할을 설정해야 합니다.
- s3:PutObject, s3:GetObject, s3:ListBucket 등의 권한이 필요합니다.
- AWS S3 버킷 및 리전 설정
- 사용하려는 S3 버킷이 존재하는지 확인하고, Kubernetes 클러스터와 같은 리전에 있는지 검토해야 합니다.
- 네트워크 연결 확인
- Kubernetes 클러스터에서 AWS S3에 대한 네트워크 연결이 정상적으로 이루어지는지 확인해야 합니다.
- 프록시 또는 방화벽 규칙이 S3 통신을 차단하는지 확인합니다.
- 스토리지 클래스 및 CSI 드라이버 매칭
- Kubernetes에서 AWS S3를 활용하려면 S3 CSI 드라이버를 지원하는지 확인해야 합니다.
- 대표적인 S3 CSI 드라이버로는 s3.csi.k8s.io, ceph-csi, minio.csi.k8s.io 등이 있습니다.
- 클러스터에서 지원하는 CSI 드라이버를 확인한 후, 적절한 스토리지 클래스를 설정해야 합니다.
위 사항을 점검한 후 PV 및 PVC를 적용하면 AWS S3를 안전하고 효율적으로 사용할 수 있습니다.
4. Kubernetes 애플리케이션에서 Object Storage 활용
Kubernetes 애플리케이션이 Object Storage를 효과적으로 활용할 수 있도록 하기 위해 몇 가지 중요한 설정과 확인 과정이 필요합니다.
4.1 Object Storage 연동을 위한 환경 변수 설정
애플리케이션이 AWS S3와 같은 Object Storage에 접근하려면, 적절한 환경 변수를 설정해야 합니다. 아래는 S3 연결을 위한 환경 변수 예제입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: file-uploader
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: file-uploader
template:
metadata:
labels:
app: file-uploader
spec:
containers:
- name: uploader
image: my-file-uploader:latest
env:
- name: S3_ENDPOINT
value: "https://s3.amazonaws.com"
- name: S3_ACCESS_KEY
valueFrom:
secretKeyRef:
name: s3-secrets
key: accessKey
- name: S3_SECRET_KEY
valueFrom:
secretKeyRef:
name: s3-secrets
key: secretKey
- name: S3_BUCKET_NAME
value: "my-s3-bucket"
4.2 데이터 업로드 및 확인 방법
애플리케이션에서 Object Storage에 데이터를 업로드한 후 이를 확인하는 방법을 소개합니다.
(1) 애플리케이션에서 데이터 업로드 수행
아래는 Python의 boto3 라이브러리를 활용하여 S3에 파일을 업로드하는 예제입니다.
import boto3
s3 = boto3.client(
's3',
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key'
)
# 파일 업로드
s3.upload_file("local-file.txt", "my-s3-bucket", "uploaded-file.txt")
print("파일이 성공적으로 업로드되었습니다.")
(2) S3에서 업로드된 데이터 확인
AWS CLI를 활용하여 업로드된 파일이 있는지 확인할 수 있습니다.
aws s3 ls s3://my-s3-bucket/
출력 예시:
2024-03-07 12:00:00 1024 uploaded-file.txt
(3) Kubernetes 애플리케이션에서 데이터 다운로드 수행
애플리케이션에서 Object Storage에 저장된 데이터를 다운로드하는 방법은 다음과 같습니다.
s3.download_file("my-s3-bucket", "uploaded-file.txt", "downloaded-file.txt")
print("파일이 성공적으로 다운로드되었습니다.")
5. Kubernetes에서 Object Storage를 활용할 때 고려할 사항
5.1 보안 설정
- IAM 역할 및 권한 관리: Kubernetes의 ServiceAccount와 AWS IAM 역할을 연동하여 최소 권한 원칙(Least Privilege)을 준수해야 합니다. 이를 통해 특정 애플리케이션만 S3 버킷에 접근할 수 있도록 설정할 수 있습니다.
- TLS 암호화 사용: 데이터 전송 중 보호를 위해 HTTPS를 활성화해야 하며, S3 버킷 정책에서 s3:SecureTransport를 true로 설정하여 암호화되지 않은 요청을 차단할 수 있습니다.
- 네트워크 보안: Kubernetes NetworkPolicy를 사용하여 애플리케이션이 S3에 접근할 때 필요한 네트워크 트래픽만 허용하도록 설정합니다. 또한, VPC 엔드포인트를 사용하여 S3 접근을 내부 네트워크에서만 허용할 수 있습니다.
- S3 버킷 정책 및 ACL 설정: S3 버킷의 퍼블릭 액세스를 차단하고, 특정 Kubernetes 애플리케이션 또는 서비스 계정만 접근할 수 있도록 정책을 구성해야 합니다.
5.2 데이터 백업 및 복구
- S3 버킷 버저닝 활성화: 실수로 인한 데이터 손실을 방지하기 위해 S3 버킷 버저닝을 활성화하면, 파일 변경 이력을 추적하고 복구할 수 있습니다.
- 라이프사이클 정책 적용: 데이터 저장 비용을 절감하기 위해, 사용 빈도가 낮은 데이터를 Infrequent Access (IA) 스토리지 클래스로 이동하거나, 오래된 데이터를 자동으로 삭제하는 정책을 설정할 수 있습니다.
- 정기적인 백업 수행: Kubernetes에서 백업 전략을 적용하여 S3 데이터를 다른 스토리지로 정기적으로 복제하고, 필요 시 복구할 수 있도록 합니다.
- 멀티 리전 복제 설정: 중요한 데이터는 여러 리전에 복제하여 장애 발생 시 데이터 손실을 방지할 수 있습니다.
5.3 성능 최적화
- S3 스토리지 클래스 선택: 애플리케이션의 사용 패턴에 맞게 적절한 S3 스토리지 클래스를 선택해야 합니다. 예를 들어, 자주 액세스하는 데이터는 Standard, 장기 보관용 데이터는 Glacier를 사용할 수 있습니다.
- S3 Transfer Acceleration 활성화: 글로벌 사용자가 많은 경우, S3 Transfer Acceleration을 활성화하면 데이터를 더 빠르게 업로드할 수 있습니다.
- 멀티파트 업로드 사용: 대용량 파일을 업로드할 때 멀티파트 업로드 기능을 활용하면 성능이 향상됩니다.
- 캐싱 및 CDN 활용: CloudFront와 같은 CDN을 사용하면 Object Storage에서 데이터를 보다 빠르게 제공할 수 있습니다.
- Kubernetes 내부에서 로컬 캐시 적용: 애플리케이션이 자주 사용하는 데이터를 Kubernetes 내부 볼륨에 캐싱하여 S3 요청을 최소화할 수 있습니다.
6. 요약 정리
- Object Storage 개요: 스케일 아웃 가능성, HTTP 기반 접근, 메타데이터 지원 등의 특징을 설명했습니다.
- Kubernetes에서 Object Storage 사용 개요: 클라우드 기반 및 자체 구축 방식의 Object Storage 사용 방법을 소개했습니다.
- AWS S3를 활용한 애플리케이션 배포: PV/PVC 설정 및 애플리케이션 배포 방법을 설명했습니다.
- AWS S3 사용 전 확인 사항: Kubernetes 클러스터의 CSI 지원 여부, IAM 설정, 네트워크 연결 등을 점검해야 합니다.
- Object Storage 활용: 애플리케이션에서 AWS S3를 사용하여 파일을 업로드하고 저장된 데이터를 확인하는 방법을 설명했습니다.
- 보안, 백업 및 성능 최적화 고려사항: IAM 권한, 데이터 복구 전략, 네트워크 및 성능 최적화에 대한 내용을 다루었습니다.
'쿠버네티스' 카테고리의 다른 글
helm Chart로 생성한 object 수동 삭제하기 (0) | 2025.03.15 |
---|---|
PV, PVC, StorageClass 실습 (0) | 2025.03.13 |
externalTrafficPolicy 활용 하기 (0) | 2025.03.06 |
Storage 3대장 이해하기 (3/4) - File Storage (0) | 2025.02.26 |
kubectl 사용자 별 권한 설정하기 (0) | 2025.02.24 |