인공지능 개발자 수다(유튜브 바로가기) 자세히보기

MLOps

쿠버네티스(kubenetes)에 데이터베이스 추가하기

Suda_777 2024. 3. 28. 03:29
반응형

이번 시간에는 쿠버네티스 클러스터에 데이터베이스를 추가해 보겠습니다.

 

데이터베이스를 쿠버네티스에서 운영할 때는 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

반응형