쿠버네티스 상태 저장 애플리케이션 배포
서론
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 데 강력한 기능을 제공합니다. 대부분의 애플리케이션은 상태를 저장하지 않는 무상태 애플리케이션(Stateless Application)으로 구성되지만, 데이터베이스나 파일 스토리지처럼 상태를 유지해야 하는 상태 저장 애플리케이션(Stateful Application)도 있습니다. 이번 포스팅에서는 상태 저장 애플리케이션을 쿠버네티스에 배포하고 관리하는 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.
본론
상태 저장 애플리케이션이란?
상태 저장 애플리케이션은 데이터베이스, 파일 시스템 등과 같이 실행 중에 데이터를 저장하고 이를 유지해야 하는 애플리케이션을 의미합니다. 이들 애플리케이션은 데이터의 지속성이 필요하기 때문에, 컨테이너가 재시작되더라도 데이터가 유지되어야 합니다. 쿠버네티스는 이를 위해 퍼시스턴트 볼륨(Persistent Volume)과 스테이트풀셋(StatefulSet)이라는 기능을 제공합니다.
퍼시스턴트 볼륨(Persistent Volume)
퍼시스턴트 볼륨(PV)은 클러스터 관리자가 프로비저닝한 스토리지 리소스로, 노드의 생명 주기와 독립적으로 유지됩니다. PV는 퍼시스턴트 볼륨 클레임(Persistent Volume Claim, PVC)을 통해 접근할 수 있습니다. PV와 PVC의 개념과 사용법에 대해서는 이전 포스팅을 참고해주세요.
스테이트풀셋(StatefulSet)
스테이트풀셋(StatefulSet)은 상태 저장 애플리케이션을 관리하기 위한 쿠버네티스 리소스입니다. 스테이트풀셋은 다음과 같은 특징을 가집니다.
- 각 파드는 고유한 네트워크 ID를 가집니다.
- 파드는 순차적으로 생성되고 종료됩니다.
- 각 파드는 자체 퍼시스턴트 스토리지를 가질 수 있습니다.
상태 저장 애플리케이션 배포 예시: MySQL
이제 상태 저장 애플리케이션의 대표적인 예시인 MySQL 데이터베이스를 쿠버네티스에 배포해보겠습니다. MySQL은 데이터베이스로서 상태를 유지해야 하므로, 스테이트풀셋과 퍼시스턴트 볼륨을 사용하여 배포합니다.
1. 퍼시스턴트 볼륨(PV) 정의
먼저, MySQL 데이터를 저장할 퍼시스턴트 볼륨을 정의합니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
이 YAML 파일을 사용하여 퍼시스턴트 볼륨을 생성합니다.
kubectl apply -f mysql-pv.yaml
2. 퍼시스턴트 볼륨 클레임(PVC) 정의
다음으로, 퍼시스턴트 볼륨 클레임을 정의합니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
이 YAML 파일을 사용하여 퍼시스턴트 볼륨 클레임을 생성합니다.
kubectl apply -f mysql-pvc.yaml
3. MySQL 스테이트풀셋(StatefulSet) 정의
MySQL 데이터를 저장할 퍼시스턴트 볼륨과 클레임을 정의한 후, MySQL 스테이트풀셋을 정의합니다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql"
replicas: 1
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "mypassword"
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 5Gi
이 YAML 파일을 사용하여 MySQL 스테이트풀셋을 생성합니다.
kubectl apply -f mysql-statefulset.yaml
4. MySQL 서비스(Service) 정의
마지막으로, MySQL 파드에 접근하기 위한 서비스를 정의합니다.
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
이 YAML 파일을 사용하여 서비스를 생성합니다.
kubectl apply -f mysql-service.yaml
상태 저장 애플리케이션 관리
상태 저장 애플리케이션을 관리할 때는 다음과 같은 사항을 고려해야 합니다.
백업 및 복구
데이터의 지속성을 유지하기 위해 정기적인 백업과 복구 계획을 수립해야 합니다. 쿠버네티스는 스냅샷 기능을 통해 퍼시스턴트 볼륨의 데이터를 백업할 수 있습니다. 예를 들어, AWS EBS를 사용한다면 EBS 스냅샷을 생성하여 데이터를 백업할 수 있습니다.
모니터링
상태 저장 애플리케이션의 성능과 상태를 모니터링하는 것이 중요합니다. Prometheus와 Grafana를 사용하여 MySQL의 성능 메트릭을 수집하고 시각화할 수 있습니다. MySQL Exporter를 사용하면 MySQL 메트릭을 Prometheus에 수집할 수 있습니다.
kubectl apply -f https://raw.githubusercontent.com/prometheus/mysqld_exporter/main/deploy/kubernetes/mysqld_exporter.yaml
스케일링
상태 저장 애플리케이션의 스케일링은 무상태 애플리케이션보다 복잡합니다. 스테이트풀셋을 사용하면 파드를 순차적으로 스케일링할 수 있습니다. 이를 통해 데이터 일관성을 유지하면서 스케일링할 수 있습니다.
상태 저장 애플리케이션 배포의 모범 사례
- 데이터 일관성 유지: 데이터베이스와 같은 상태 저장 애플리케이션에서는 데이터 일관성이 매우 중요합니다. 데이터 일관성을 유지하기 위해 스테이트풀셋을 사용하고, 각 파드에 고유한 퍼시스턴트 볼륨을 할당합니다.
- 적절한 리소스 할당: 상태 저장 애플리케이션은 일반적으로 많은 리소스를 소비합니다. 적절한 리소스 요청과 제한을 설정하여 애플리케이션이 안정적으로 실행되도록 합니다.
- 보안 강화: 데이터베이스와 같은 민감한 데이터를 다루는 애플리케이션의 경우, 네트워크 보안 및 접근 제어를 강화해야 합니다. 네트워크 정책을 사용하여 파드 간의 통신을 제한하고, 시크릿(Secret)을 사용하여 민감한 정보를 안전하게 저장합니다.
결론
쿠버네티스에서 상태 저장 애플리케이션을 배포하고 관리하는 것은 복잡하지만, 퍼시스턴트 볼륨과 스테이트풀셋을 사용하면 이를 효과적으로 처리할 수 있습니다. 이번 포스팅에서는 MySQL 데이터베이스를 예시로 들어 상태 저장 애플리케이션을 배포하는 방법을 자세히 설명했습니다. 이를 통해 상태 저장 애플리케이션을 쿠버네티스에서 안정적으로 운영할 수 있기를 바랍니다.