프로젝트 1주차 요약
쿠버네티스 환경에서의 DB 동작원리
Kubernetes 리소스 구조
1
2
3
4
5
6
7
- Pod
PostgreSQL은 Kubernetes에서 Pod 내에서 실행된다.
- StatefulSet
PostgreSQL과 같은 상태가 있는 애플리케이션을 배포할 때 StatefulSet을 사용한다. StatefulSet은 Pod의 고유성과 영속성을보장함.
데이터 저장
1
2
3
4
5
6
7
- 영속적인 스토리지
PostgreSQL 데이터는 일반적으로 PersistentVolumeClaim(PVC)을 통해 연결된 PersistentVolume(PV)에 저장된다. 이 PV는 EBS 볼륨 또는 다른 스토리지 옵션일 수 있음.
- 볼륨 마운트
PostgreSQL 컨테이너는 /var/lib/postgresql/data와 같은 경로에 PVC를 마운트하여 데이터베이스 파일을 저장한다.
초기화 및 설정
1
2
3
- 환경 변수
PostgreSQL 컨테이너는 환경 변수를 통해 초기 사용자와 비밀번호를 설정한다. POSTGRES_USER와 POSTGRES_PASSWORD 환경 변수를 사용해서 초기화 가능.
네트워크 구성
1
2
3
4
5
6
7
- Service
PostgreSQL에 접근하기 위해 Kubernetes의 Service 리소스를 정의해야한다. 이걸 통해 다른 Pod나 외부 애플리케이션이 PostgreSQL에 연결 가능.
- ClusterIP
기본적으로 Service는 ClusterIP 타입으로 설정되어 내부 클러스터에서만 접근 가능하게 할 수 있다. 필요에 따라서 LoadBalancer 또는 NodePort로 설정하면 외부 접근 허용이 가능하다.
데이터베이스 동작
1
2
3
- SQL 쿼리 처리
애플리케이션이 PostgreSQL에 SQL 쿼리를 보내면 PostgreSQL은 요청을 처리하고 결과를 반환한다. 이 과정에서 데이터는 PVC에 지장된 EBS 볼륨이나 다른 스토리지에 지속적으로 저장됨.
모니터링 및 관리
1
2
3
4
- 모니터링
Kubernetes 환경에서는 Prometheus, Grafana 사용해서 PostgreSQL의 상태 모니터링도 가능함.
백업 및 복구: 주기적인 백업을 위해서 pg_dump와 같은 도구를 사용할 수 있음. Kubernetes CronJob 통해서 자동으로 백업도 가능.
StatefulSet
상태가 있는 애플리케이션을 관리하는 Kubernetes 리소스. 고유한 네트워크 ID 및 지속적인 스토리지를 제공.
Headless Service
StatefulSet의 각 Pod에 대해 DNS 이름을 제공. Pod 간 통신을 가능하게 함.
사용법
환경 설정:
쿠버 클러스터 필요. kubectl 커맨드라인 도구 설치.
Headless Service 생성:
headless-service.yaml 파일을 작성하여 서비스 정의.
서비스 생성 명령:
1
kubectl apply -f headless-service.yaml
StatefulSet 생성:
statefulset.yaml 파일을 작성하여 StatefulSet 정의.
StatefulSet 생성 명령:
1
kubectl apply -f statefulset.yaml
결론
StatefulSet을 통해 상태가 있는 애플리케이션을 쉽게 관리하고 배포할 수 있다. Pod의 고유성, 순차적 배포 및 영속적인 스토리지 제공으로 안정적인 서비스 운영이 가능.
상태가 있다?
“상태가 있다” 는 것은 애플리케이션이나 서비스가 특정한 데이터를 저장하고 그 데이터가 시간이 지나도 유지된다는 것을 의미한다. ex) 사용자 로그인 상태, 시간, 활성 상태, 상품 재고 수량, 재고 위치 및 재고 변동 이력 등등..
애플리케이션이 실행되는 동안 그 상태를 기반으로 동작하고 이 상태가 중요한 역할을 한다는 것.
상태가 있는 어플리케이션은 데이터베이스가 있고, 없는 애플리케이션은 웹 서버 RESTful API 등등 서버 종류.
Redis 같은 캐시 서버도 상태가 없다고 한다.
PVC 자동생성?
쿠버가 자동으로 pvc를 생성해준다는데 이건 해봐야 알듯..
EBS의 경우
스토리지 클래스를 정의하고 PVC를 생성하면 Kubernetes가 자동으로 필요한 PV를 생성한다고 함..????
생성 코드 예시
스토리지 클래스 YAML 파일 작성
1 2 3 4 5 6 7 8 9 10
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ebs-sc provisioner: kubernetes.io/aws-ebs parameters: type: gp2 # EBS 타입 (gp2, io1, st1 등) fsType: ext4 # 파일 시스템 타입 reclaimPolicy: Delete # PVC 삭제 시 PV 삭제 여부 volumeBindingMode: WaitForFirstConsumer # PVC가 요청된 후에 PV 바인딩
스토리지 클래스 생성
1
kubectl apply -f [스토리지 클래스 이름].yaml
PVC 작성
1 2 3 4 5 6 7 8 9 10 11
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi # 요청하는 스토리지 크기 storageClassName: ebs-sc # 위에서 생성한 스토리지 클래스 이름
작성하고
1
kubectl apply -f [pvc이름].yaml
이렇게 적용..
# mlflow 세부설정 방법
helm upgrade 명령어를 통한 mlflow chart 변경
1 2 3 4 5 6 7
helm upgrade my-mlflow community-charts/mlflow --version 0.7.19 \ --set database.backend=postgres \ --set database.host=mlflow-postgres.default.svc.cluster.local \ --set database.port=5432 \ --set database.database=mlflow \ --set database.user=mlflow_user \ --set database.password=your_password
mlflow-postgres.default.svc.cluster.local??
- statefulset을 통해서 postgreSQL 배포 했을때 kubernetes 서비스 기반 DNS이름.
인스턴스 사망 시 storage 어떻게 돌아가는지 쿠버 내부 상황 알아보기