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

MLOps

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

Suya_03 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

    반응형