윈도우 개발환경

윈도우 쿠버네티스 개발환경 ; 2. MySQL 배포하기

기억하는 개발자 2024. 11. 17. 20:53

윈도우 쿠버네티스 개발환경

1. PostgreSQL 배포하기

2. MySQL 배포하기

 

아직도 가장 많이 사용되는 오픈소트 데이터베이스는 통계에서 보듯 MySQL이다. PostgreSQL이 많이 따라잡긴 했지만, 처음 사용하기에는 MySQL 워크벤치와 같은 편리한 도구를 제공하는 무료 소프트웨어인 MySQL이 아무래도 가장 사용하기 편할 뿐 아니라 성능면에서도 뒤지지 않는다.

 

출처 Statista) 2024년 6월 기준

그래서 이전에 PostgreSQL에서 했던 것처럼 Helm Chart를 사용하지 않고 MySQL을 쿠버네티스 환경에 설치하는 작업을 순서대로 진행해 봤다. PostgreSQL와 MySQL의 Helm Chart다 다음번에 같이 만들어서 올리는 글을 작성할 예정이다.

 

Docker에 MySQL을 설치하는 방법은 이전에 글을 참고하면 된다.

 

윈도우에 만드는 리눅스 개발 환경; 5. Docker로 MySQL시작하기

윈도우에 만드는 리눅스 개발 환경 목차1. 우분투 리눅스 설치 (윈도우 10)2. 윈도우에 Docker 설치3. 속도 개선 후 node.js 설치4. VSCode 설치 후 리눅스 연결5. Docker로 MySQL시작하기6. Docker로 MongoDB 시작

front-it.tistory.com

1. Minikube 개발환경에 MySQL 배포

a. MySQL을 위한 PV(Persistent volume) 만들기

먼저, MySQL의 data가 저장된 공간을 PV(Persistent Volume)로 만든다. PV에 대한 설명은 이전 글 "PostgreSQL설치하기"에 설명되어 있다.

 

윈도우 쿠버네티스 개발환경 ; 1. PostgreSQL 설치하기 (1)

윈도우 쿠버네티스 개발환경1. PostgreSQL 설치하기 (1) DevOps 환경이 구축이 되었으니, 이제 만들어진 쿠버테티스 클러스터에 프로젝트에 필요한 프로그램을 설치하는 방법을 정리해 보기로 했다.

front-it.tistory.com

이전 글에서도 설명했듯이 VirtualBox로 만든 minikube환경에서 윈도우 드라이브, 예를 들어  "/c/", 에 만들어진 폴더에 대한 권한 오류문제가 있어 minikube가상머신 내에 MySQL이 사용할 PV공간을 만든다.

 

minikube ssh
mkdir -p /home/docker/mysql/data

 

PV를 생성하는 Yaml파일을 생성하고 kubectl apply로 적용하면 MySQL이 사용할 PV가 생성된다.

 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
    type: local
    app: mysql
spec:
  storageClassName: mysql-storage
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /home/docker/mysql/data

 

b. PV공간을 Deployment에서 사용하기 위해 Claim

물리적으로 할당된 공간을 Claim을 통해 사용할 수 있게 할당한다. Deploy 할 때 volume으로 잡을 수 있는 것이 Claim이기 때문에 아래와 같이 Claim을 생성한다.

 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: mysql
spec:
  storageClassName: mysql-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

 

c. Deployment; MySQL Pod생성

MySQL DB의 데이터를 저장할 공간이 만들어지고 Claim 되었으니 Deployment로 Pod를 만들고 MySQL을 접속해 보자.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: 'mysql'
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: somepassword
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mysqldata
      volumes:
        - name: mysqldata
          persistentVolumeClaim:
            claimName: mysql-pv-claim

 

Deploy의 상태를 확인해 보고 정상적으로 생성되고 동작하고 있으면 Pod의 MySQL서버에 접속해 본다.

 

kubectl.exe exec -it mysql-6fc4768d49-f8ptx -- mysql -U root --password

 

기본적으로 MySQL의 root계정은 외부에서 접속되지 않도록 되어 있어서 접속이 되지 않았다. 이제 Pod로 들어가서

 

kubectl.exe exec -it mysql-6fc4768d49-f8ptx /bin/bash

 

MySQL을 실행하고 아래와 같이 외부에서 접근할 수 있도록 개발에 사용할 DB와 계정을 만든다.

 

create database devdb;
create user devuser identified by 'password';
grant all on devdb.* to 'devuser'@'%';

 

d. service로 네트워크를 연다.

마지막으로 NodePort로 Service를 만들면 VirtualBox로 실행되는 Minikube는 Port Forwarding 없이 외부에서 바로 접속이 가능하다.

 

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: mysql
spec:
  type: NodePort
  ports:
    - port: 3306
  selector:
    app: mysql

 

연결되는지 확인하기 위해 MySQL 워크벤치로 테스트해 본다. 포트는 3306대신 NodePort로 할당된 31497을 사용한다.