목차
이번 시간에는 쿠버네티스 클러스터에 데이터베이스를 추가해 보겠습니다.
데이터베이스를 쿠버네티스에서 운영할 때는 StatefulSet과 PersistentVolume을 사용하여 데이터의 영속성과 안정성을 보장하는 것이 중요합니다.
그리고 데이터베이스는 PostgreSQL을 이용하겠습니다.
1. PersistentVolume (PV) 및 PersistentVolumeClaim (PVC) 생성
먼저, 데이터를 영구적으로 저장할 PersistentVolume과 이 볼륨을 사용할 PersistentVolumeClaim을 정의합니다. PersistentVolume은 클러스터 리소스로서, 실제 스토리지 시스템에 대한 세부 정보를 포함합니다. PersistentVolumeClaim은 사용자가 이 볼륨을 사용하겠다는 요청입니다.
먼저 사용할때, path를 수정해주고 실행해야 합니다.
# postgres-pv.yaml
apiVersion: v1 # 쿠버네티스 API 버전
kind: PersistentVolume # 리소스 유형
metadata:
name: postgres-pv # PersistentVolume의 이름
spec:
capacity:
storage: 5Gi # 스토리지 용량
accessModes:
- ReadWriteOnce # 볼륨 접근 모드 (한 번에 한 노드에서만 읽기/쓰기 가능)
persistentVolumeReclaimPolicy: Retain # PV가 해제되었을 때의 데이터 처리 정책
storageClassName: "" # 동적 프로비저닝을 사용하지 않을 경우 빈 문자열 설정
hostPath:
path: /path/to/your/data # 노드의 경로, 여기에 데이터가 저장됩니다.
---
apiVersion: v1 # 쿠버네티스 API 버전
kind: PersistentVolumeClaim # 리소스 유형
metadata:
name: postgres-pvc # PVC의 이름
spec:
accessModes:
- ReadWriteOnce # 볼륨 접근 모드
resources:
requests:
storage: 5Gi # 요청 스토리지 용량
storageClassName: "" # 스토리지 클래스 이름
이 예제에서는 hostPath를 사용하여 노드의 경로를 PV로 매핑했습니다. 프로덕션 환경에서는 더 안정적인 스토리지 솔루션(예: 클라우드 볼륨, NFS 등)을 사용하는 것이 좋습니다.
2. StatefulSet 정의
StatefulSet을 정의하여 PostgreSQL 서버를 배포합니다. StatefulSet은 안정적인 스토리지(PersistentVolumeClaim 사용), 고유한 네트워크 식별자, 순차적인 배포 및 스케일링을 제공합니다.
# postgres-statefulset.yaml
apiVersion: apps/v1 # 쿠버네티스 API 버전
kind: StatefulSet # 리소스 유형
metadata:
name: postgres # StatefulSet의 이름
spec:
serviceName: "postgres" # 이 StatefulSet과 연결된 서비스의 이름
replicas: 1 # 파드 복제본의 수
selector:
matchLabels:
app: postgres # 파드 선택에 사용되는 라벨
template: # 파드 템플릿
metadata:
labels:
app: postgres # 파드에 적용될 라벨
spec:
containers:
- name: postgres # 컨테이너의 이름
image: postgres:latest # 사용할 이미지
ports:
- containerPort: 5432 # 컨테이너가 사용할 포트
env:
- name: POSTGRES_PASSWORD # 환경 변수
value: "yourpassword" # 데이터베이스 비밀번호
volumeMounts:
- name: postgres-storage # 볼륨 마운트 이름
mountPath: /var/lib/postgresql/data # 데이터베이스 데이터를 저장할 경로
volumeClaimTemplates: # 각 복제본에 대해 동적으로 PVC를 생성
- metadata:
name: postgres-storage # PVC의 이름
spec:
accessModes: [ "ReadWriteOnce" ] # 볼륨 접근 모드
resources:
requests:
storage: 5Gi # 요청 스토리지 용량
이 구성에서 volumeClaimTemplates는 StatefulSet이 각 복제본에 대해 별도의 PersistentVolumeClaim을 자동으로 생성하도록 합니다. 이는 각 PostgreSQL 인스턴스가 자신만의 독립된 스토리지를 갖게 됨을 의미합니다.
mountPath: /var/lib/postgresql/data는 컨테이너 내부의 경로를 지정합니다. 이 경로는 PersistentVolume이 컨테이너 내부에 마운트되는 위치를 나타냅니다.
3. 배포 실행
위에서 정의한 PV, PVC, 그리고 StatefulSet 구성 파일을 쿠버네티스에 적용합니다.
kubectl apply -f postgres-pv.yaml
kubectl apply -f postgres-statefulset.yaml
4. 서비스 생성
PostgreSQL 인스턴스에 접근하기 위한 쿠버네티스 서비스를 생성합니다. 이 서비스는 클러스터 내부 또는 외부에서 PostgreSQL 인스턴스에 접근할 수 있는 안정적인 방법을 제공합니다.
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
ports:
- port: 5432 # 서비스가 노출할 포트
targetPort: 5432 # 파드의 포트
selector:
app: postgres # 이 서비스로 라우팅할 파드를 선택하는 데 사용되는 라벨
type: LoadBalancer # 서비스 타입 (외부에서 접근 가능한 LoadBalancer로 변경)
이후, 서비스를 적용합니다.
kubectl apply -f postgres-service.yaml
데이터베이스가 실행되고 있는지 아래 명령어로 확인한다.
kubectl get pods -l app=postgres
5. 데이터베이스 접속해보기
5.1. kubectl Port Forwarding 사용하기
쿠버네티스 클러스터 외부에서 내부의 서비스나 파드에 접근하려면, kubectl port-forward 명령어를 사용하여 포트 포워딩을 설정할 수 있습니다. 이 방법은 로컬 머신의 특정 포트를 파드의 포트에 바인딩하여, 로컬 머신에서 데이터베이스에 접속하는 것처럼 만듭니다.
포트포워딩 설정
kubectl port-forward pod/postgres-0 5432:5432
5.2. 데이터베이스 클라이언트 도구 사용하기
데이터베이스에 접속하기 위해서는 PostgreSQL 클라이언트 도구인 psql이 필요합니다. psql이 설치되어 있지 않다면, 로컬 시스템에 설치해야 합니다. 설치 후, 다음 명령어를 사용하여 데이터베이스에 접속할 수 있습니다
데이터베이스 실행
psql -h localhost -p 5432 -U postgres -d postgres
6. 데이터베이스 중지
kubectl delete pod postgres-0
'MLOps' 카테고리의 다른 글
백엔드 서버(FastAPI)를 쿠버네티스로 실행하기 (0) | 2024.04.09 |
---|---|
쿠버네티스(Kubernetes) 기본적인 사용 방법 (1) | 2024.03.28 |
쿠버네티스(Kubernetes) 설치와 실행 방법 (0) | 2024.03.19 |
쿠버네티스(Kubernetes)란! 왜 사용하는 것일까? (0) | 2024.03.19 |
MLflow 처음 시작하기 (0) | 2024.03.12 |