Goal

  • 쿠버네티스 클러스터에 mysql pod를 설치할 수 있다.
  • 쿠버네티스 PersistentVolume 과 PersistentVolumeClaim을 이해한다.
  • mysql pod를 port forward 시켜서 원격으로 접속 할 수 있다

쿠버네티스 클러스터에 MySQL 설치하기

persistentVolume 과 persistentVolumeClaim

  pod에 부하가 걸리거나, 이상 징후가 있을경우 pod가 재시작되기 때문에 모든 데이터가 초기화 됩니다.
따라서, mysql 컨테이너를 쿠버네티스 pod를 통해서 구동시킬때, persistent volume을 설정해야 합니다. persistent volume 과 persistent volume claim에 대해서 알아보도록 하겠습니다.

1. persistent volume 이란?

쿠버네티스에는 volume이라는 저장공간이 있습니다. pod가 생성될 때 volume이 만들어 지고, pod를 삭제할 때 volume도 삭제 됩니다.
pod가 재시작될 때는 volume을 계속 참조 하기 때문에 데이터 영속성을 제공합니다.

2. volume type

  • emptyDir - 임시저장할 데이터를 보관하는 volume
    image.png
  • hostPath - worker node의 파일시스템에 mounting 시키는 volume
    image.png
  • gitRepo - Git repository에 mountint 시키는 volume
    image.png

3. persistent volume claim 이란?

  persistent storage에 동적으로 프로비젼 시키는 설정 인데, volume을 pod에게 할당하는 과정을 알아 보겠습니다.

  • 3.1) 사용자가 pod에서 사용할 persistent volume이 필요할 경우 kubernets를 통해서PersistentVolumeClaim을 생성 합니다.
  • 3.2) 그리고 Kubernetes API server에게 PersistentVolumeClaim을 넘겨 줍니다.
  • 3.3) Kubernetes는 적합한 PersistentVolume을 찾고 PersistentVolumeClaim과 바인딩 시킵니다. 그리고 나서 pod에서는 PersistentVolumeClaim을 통해서 volume을 설정할 수 있습니다.
    image.png

mysql에 사용할 persistentVolume과 persistentVolumeClaim 설정하기

1. persistentVolue, persistentVolumeClaim 생성

파일명은 mysql-pv.yaml으로 하였습니다. 먼저 PersistentVolume을 생성 하겠습니다. volume이름은 mysql-pv-volume으로 지정 하였습니다. hostPath타입으로 volume을 생성하고, worker node의 /mnt/data 경로에 mysql 파일이 저장되록 설정 하였습니다. PersistentVolumeClaim에서는 위에서 생성한 mysql-pv-volume을 참조하도록 설정 하였습니다.

kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

persistent volume 생성 요청

kubectl apply -f mysql-pv.yaml

2. mysql pod생성

 deployment 와 service를 이용해서 mysql pod를 생성하도록 하였습니다. containers항목에서 volumeMounts을 확인할 수 있습니다. mysql-persistent-storage라는 이름으로 volume으로 '/var/lib/mysql'(컨테이너 내부에서 실제로 저장되는 경로) 디렉토리를 마운트 시킨다고 설정 되어 있습니다.

 다음은, volumes항목 입니다. 이전에 생성한 mysql-pv-claim을 참조하여서 PersistentVolume을 이용하고 있습니다.

apiVersion: v1
kind: Service
metadata:
  name: mysql-cluster-ip-service
spec:
  clusterIP: 10.101.204.217
  ports:
  - port: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      nodeName: kube-node-1
      containers:
      - image: mysql:5.6
        name: mysql
        env:
          # Use secret in real usage
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

mysql pod 생성하기

kubectl apply -f mysql-deployment.yaml

3. 정상적으로 mount 되는지 확인해보기

mysql pod에 bash를 이용해 접속 하겠습니다.

kubectl exec -it [mysql pod 이름] - bash

mysql 접속하기

mysql -u root -p 초기 패스워드

test라는 데이터베이스 생성하기

CREATE DATABASES test;

test 데이터베이스 사용하기

USE test;

dept라는 테이블 생성하기

 CREATE TABLE dept (
    ->   dept_no INT(11) unsigned NOT NULL,
    ->   dept_name VARCHAR(32) NOT NULL,
    ->   PRIMARY KEY (dept_no)
    -> );

mysql 종료

exit

mysql pod에서 빠져나오기

exit

minikube를 사용하는 경우

minikube ssh

다른 클러스터를 사용하는경우
https://velog.io/@pa324/쿠버네티스-worker-node-ssh-접속

worker node에 접속해서 /mnt/data 디렉토리 확인해 보면 정상적으로 dept테이블이 파일로 존재합니다.

※ nodejs app에서 mysql pod에 접근하기 위해서는 mysql pod에 들어가서 권한부여를 먼저 해야 합니다.

mysql pod 포트포워딩

mysql server에서 작업을 하기 불편하므로 mysql pod를 포트포워딩 시키는 방법을 알아 보도록 하겠습니다.

1.kubectl port-forward 를 이용해서 포트포워딩

  1. localhost:3306 으로 포트포워딩 시키는 방법
    kubectl port-forward 'mysql pod 이름' 3306:3306
  2. 모든ip:3306 으로 포트포워딩 시키는 방법
    kubectl port-forward 'mysql pod 이름' 3306:3306 --address 0.0.0.0

image.png

2. ubuntu 에서 mysql server(pod) 접속해보기

  1. 우분투에 mysql client 설치
    sudo apt install mysql-client-core-5.7
  2. 우분투에서 다른 터미널을 열어서 mysql 서버(mysql pod)에 접속
    mysql --host=localhost --protocol tcp --port=3306 -u '사용자명' -p
  3. 패스워드 입력 후 정상접속 확인
    image.png

3. window workbench에서 mysql server(pod) 접속

  1. 윈도우에서 workbench 설치 및 실행

  2. ubuntu 서버주소 확인

    ifconfig

    image.png

  3. window 워크벤치에서 우분투 ip 주소로 접속

image.png

  1. workbench를 통해서 원격에서 k8s 클러스터의 mysql server에 접속 완료