쿠버네티스 - 디플로이먼트(deployment)를 이용해 MySQL 배포
쿠버네티스 데이터 엔지니어링을 시작한지 1년 정도가 지난 것 같습니다.
지금까지 학습하며 경험한 내용을 바탕으로 지식을 정리하면서 관련 포스팅을 시작하려고 합니다.
이론적인 내용도 다루겠지만, 시간이 되면 실제 운용 사례 기반으로 내용을 작성하려고 합니다.
이번 MySQL 배포도, 실제 서비스의 메타 데이터로 활용해봤는데 큰 문제가 없었습니다.
관리형 DB(예를 들어 AWS RDS 등) 를 사용하시는 분들께서 비용절감의 고민이 있으시다면, 게다가 쿠버네티스 환경이 준비된 분들이라면 스테이트풀셋을 이용한 MySQL 파드를 배포해서 사용하시는 것을 추천드립니다.
스테이트풀셋을 이용해 MySQL 을 배포하는 방법도 가능합니다만 이번 글에서는 디플로이먼트를 이용해보겠습니다.
1. 준비 과정
- 데이터 영속성을 보장하기 위해 영구 볼륨 (PersistentVolume)생성
- MySQL 애플리케이션 배포를 위한 디플로이먼트 생성
- MySQL 파드를 외부로 노출하기 위한 Service(쿠버네티스의 서비스) 생성
** 아시는 것 처럼 쿠버네티스의 모든 리소스는 yaml 파일로 작성할겁니다.
2. 디플로이먼트를 이용해 MySQL 배포
a. 데이터 영속성을 보장하기 위해 영구 볼륨 (PersistentVolume)생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-study-mysql
namespace: work
spec:
accessModes:
- ReadWriteOnce
storageClassName: gp3
resources:
requests:
storage: 1Gi
** pvc 를 동적 볼륨 프로비저닝 하기 위해서는 스토리지클래스 에 provisioner 를 명시해줘야 합니다. 저는 미리 만들어둔 스토리지 클래스를 사용했고, 이 내용은 다음에 자세히 다루겠습니다.
b. MySQL 애플리케이션 배포를 위한 디플로이먼트 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: study-mysql
namespace: work
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
volumes:
- name: study-volume
persistentVolumeClaim:
claimName: pvc-study-mysql
containers:
- name: study-mysql
image: mysql:latest
env:
- name: MYSQL_ROOT_PASSWORD
value: root
- name: MYSQL_DATABASE
value: test
ports:
- containerPort: 3306
volumeMounts:
- name: study-volume
mountPath: /var/lib/mysql
c. MySQL 파드를 외부로 노출하기 위한 Service(쿠버네티스의 서비스) 생성
apiVersion: v1
kind: Service
metadata:
name: svc-study-mysql
namespace: work
spec:
selector:
app: mysql
ports:
- port: 3306
d. 서비스 노출 확인을 위한 파드 생성과 통신 테스트
apiVersion: v1
kind: Pod
metadata:
name: mysql-client
namespace: work
labels:
app: mysql-client
spec:
containers:
- name: mysql-client
image: mysql:latest
command: [ "sleep", "infinity" ] # 파드가 무기한으로 동작하도록 설정
** 위 3개의 리소스 yaml 파일을 kubectl 을 이용해 배포해줍니다.
3. 서비스 확인
a.파드의 상태 확인
b.통신테스트를 위해 띄운 파드에 쉘에 진입해 서비스 노출 확인
c.mysql 파드에 쉘에 진입해 데이터베이스 확인
4. 마치며
configmap 을 이용해서 database 의 설정을 동적으로 적용하며 운영을 할 수 있습니다.
stastefulset 으로 배포하면 운영의 안정성을 높일 수 있습니다. ( 파드의 고유성이 부여되고 영구적인 호스트 이름이 부여됩니다.)
다음에는 statefulset 을 이용해 엘라스틱 서치를 배포해보겠습니다.