[k8s]MariaDB를 Pod로 설치하기(NFS PV에 DB생성)

쿠버네티스를 설치하고 NginX 웹서버를 Pod로 설치해 배포하는 테스트를 한 후 다음 테스트는 DB의 설치를 테스트 해야 한다. 그런데 Pod로 웹서버나 DBMS를 설치할 때 문제가 하나 있다.

바로 Pod(컨네이너도 마찬가지임)의 데이터는 정적이라는 것이다. 동적인 데이터의 변화가 있는 응용프로그램이나 DBMS를 Pod로 설치 및 배포할 경우 Pod를 중지하면 Pod 실행 중 발생한 Pod내에 추가,삭제,수정된 데이터의 변경은 모두 사라진다. 즉 Pod가 최초로 설치 및 배포되었을 때로 돌아가게 된다.

PV (Persistent Volume)

Pod의 정적인 특성으로 인해 발생하는 문제를 해결하기 위해서는 PV(퍼시스턴트 볼륨)을 사용해야 한다. PV를 생성한 다음 Pod에서 실행하는 응용프로그램의 특정 경로를 PV에 마운트하여 Pod 외부에 데이터를 저장하도록 해야 한다.

그다지 권고되지는 않지만 k8s가 실행중인 워커노드(Worker Node)의 로컬 파일시스템의 특정 볼륨이나 디렉토리를 PV로 선언하여 사용할 수 있다. 더 좋은 방법은 SAN 또는 NAS의 스토리지를 NFS 및 iSCSI 등의 구성을 통해 Pod에서 사용할 수 있는 PV로 선언하여 마운트하도록 하는 것이다.

이 포스트에서는 시놀로지 NAS의 NFS 볼륨을 PV로 선언하여 MariaDB의 Pod에 연결하여 데이터베이스 생성 및 저장 경로로 사용하는 과정을 설명한다.

시놀로지 NAS에 NFS 볼륨 생성하기

시놀로지 NAS의 DSM에 접속하여 “제어판”-“파일 서비스”-“NFS”에 접근하여 NFS 서비스를 활성화 시켜야 한다.

NFS 서비스가 활성화 되었으면 MariaDB Pod가 마운트(nfs mount)할 공유 폴더를 만들고 공유폴더의 편집을 통해 NFS 권한을 부여해야 한다.

NFS 권한은 NFS 클라이언트 즉 MariaDB Pod가 사용하는 IP를 등록하고 필요한 권한을 앞의 화면과 같이 설정해야 한다. 권한에는 “읽기/쓰기”, Squash는 “매핑 없음”, 보안은 “sys”로 설정해줘야 한다.

다만 두 개의 IP 대역이 등록되어 있는데 192.168.219.0/24는 워커노드의 IP 대역이고 10.0.1.0/24는 k8s가 Pod에 할당하는 내부 IP 대역이다. 어떤 이유인지는 알 수 없지만 이 두 IP 대역을 모두 등록해야 Pod에서 시놀로지 NAS의 공유폴더 (k8s-mariadb)에 접근할 수 있었다.

어쨌든 이 과정을 거치면 시놀로지 NAS에서의 준비는 끝난다.


마스터 노드에서 PV 및 PVC 생성하기

먼저 마스터 노드에서 다음과 같은 내용을 포함하는 PV를 생성하는 yaml 파일을 생성한다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mariadb-pv
spec:
  storageClassName: ""
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    server: 192.168.219.100
    path: /volume2/k8s-mariadb

PV의 이름은 mariadb-pv 이고 용량은 10G Byte이며 스토리지의 클래스는 nfs-storage이다. 그리고 NFS 서버는 시놀로지 NAS의 IP 주소이며 NFS 서버의 볼륨 경로는 /volume2/k8s-mariadb라는 것을 선언하고 있다. 그리고 이 파일을 mariadb-pv.yaml 로 저장하고 다음과 같이 Apply 한다.

$ kubectl apply -f mariadb-pv.yaml

PV가 정상적으로 생성되었다면 PVC를 생성한다. PV가 k8s 클러스터에서 사용할 볼륨을 k8s에 등록한 것이라면 PVC는 Pod가 PV를 사용하기 위해 k8s에 이러이러한 PV를 연결해줘라고 요청하는 PV 요청 명세라고 보면 된다. 그래서 이름도 PVC(Persistent Volume Claim)이다.

다음과 같이 mariadb-pvc.yaml 파일을 생성한다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mariadb-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: "nfs-storage"

이름은 mariadb-pvc 이며 용량은 10G Byte이다. 그리고 스토리지 클래스는 nfs-storage 라고 되어 있다. 구체적으로 어떤 PV를 요청하는지는 명시되지 않는다. k8s의 매뉴얼을 보면 k8s는 PVC의 내용에 가장 적합한 PV를 자동으로 찾아서 연결해준다는 식으로 언급하고 있다. 그러면서 요청하는 스토리지의 용량, 스토리지의 유형, 요청하는 권한 등을 고려하여 가장 적합한 PV를 회신한다고 되어 있다.

다음과 같이 PVC도 등록한다.

$ kubectl apply -f mariadb-pvc.yaml

PVC가 생성되면 Mariadb의 POD를 생성하는 yaml 파일을 만들어야 한다.

그리고 마지막으로 PV에서 사용하고 있는 시놀로지 NAS의 NFS 볼륨을 마운트하기 위해 다음과 같이 모든 노드에 NFS 공통 패키지를 설치해야 한다. 이 NFS 공통 패키지를 설치하지 않으면 MariaDB Pod를 생성하고 실행하면서 NFS 볼륨을 mount할 때 오류가 발생한다.

$ sudo apt-get install nfs-common

MariaDB Pod 생성하고 실행하기

PV와 PVC가 등록되면 MariaDB의 Pod를 생성할 때 PVC를 통해 PV를 할당받도록 다음과 같은 yaml 파일을 만든다. 파일명은 mariadb-pod.yaml로 했다. Deployment를 만들어 Pod를 생성할 수도 있지만 테스트의 편의를 위해 Pod를 만들었다.

apiVersion: v1
kind: Pod
metadata:
  name: mariadb-pod
spec:
  containers:
  - name: mariadb
    image: mariadb:latest
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: 1qaz2wsx
    volumeMounts:
    - name: mariadb-storage
      mountPath: /var/lib/mysql
      subPath: mariadb
  volumes:
  - name: mariadb-storage
    persistentVolumeClaim:
      claimName: mariadb-pvc

이름은 mariadb-pod 이고 컨테이너는 mariadb의 최신(latest) 버전 이미지를 사용하도록 한다고 되어 있다. 그리고 Pod를 생성할 때 환경변수로는 MariaDB의 root 비밀번호를 전달한다.

MariaDB의 Pod에서 Pod내 공간 외 추가로 사용할 볼륨의 이름을 mariadb-storage로 정의하고 경로는 /var/lib/mysql 디렉토리에 마운트하며 하위에 mariadb 디렉토리를 만들어 사용하도록 정의하고 있다. 그리고 mariadb-storage 볼륨은 mariadb-pvc라는 이름의 PVC를 통해 PV를 요청하여 사용하도록 정의하고 있다.

이렇게 MariaDB를 생성하기 위한 yaml 파일을 다음과 같이 실행한다.

$ kubectl apply -f mariadb-pod.yaml

만약 Pod를 Deployment(디플로이먼트)를 통해 만들고 싶다면 다음의 내용을 mariadb-deployment.yaml 파일에 작성하고 Apply 하면 된다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb-deployment
spec:
  replicas: 1  # 필요한 복제본 수 설정
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
      - name: mariadb
        image: mariadb:latest
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: 1qaz2wsx
        volumeMounts:
        - name: mariadb-storage
          mountPath: /var/lib/mysql
          subPath: mariadb
      volumes:
      - name: mariadb-storage
        persistentVolumeClaim:
          claimName: mariadb-pvc
  strategy:
    type: Recreate

디플로이먼트를 kubectl apply 명령을 통해 생성하거나 Pod를 만들거나 모두 결과적으로는 Deployment

여기까지 진행하면 MariaDB Pod가 생성되고 실행되어야 한다. 정상적으로 실행되었다면 다음의 명령을 통해 정상실행 여부를 확인하고 어느 워커노드에서 실행되는지도 확인할 수 있다. 테스트 환경에는 두 개의 워커노드가 있다.

$ kubectl get pod -A -o wide

다음과 같은 결과가 나온다면 정상적으로 MariaDB Pod가 생성되고 실행된 것이다.

MariaDB의 Pod 이름은 mariadb-pod 이고 상태는 Running 상태이고 IP는 10.0.1.76 이다. Running 상태가 일정시간 이상 지속된다면 정상적으로 실행중이라고 볼 수 있다.


NFS로 마운트된 /var/lib/mysql 확인

MariaDB의 설치 상태를 확인하는 방법 중 하나는 데이터가 저장되는 데이터베이스가 생성되는 경로로 사용하도록 mariadb-pod.yaml에서 정의하고 있는 NAS의 공유폴더에 데이터베이스가 정상적으로 생성되었는지 보면 된다. 즉 MariaDB Pod에 NFS 마운트되어 사용되는 시놀로지 NAS의 공유 폴더를 확인하는 것이다.

시놀로지 NAS의 DSM에 접속하여 MariaDB Pod에 NFS 마운트되어 사용되는 k8s-mariadb 라는 공유 폴더에 MariaDB의 데이터베이스가 생성된 것을 볼 수 있다.

그리고 워커노드에서 실행되고 있는 MariaDB Pod에 쉘 접속을 하여 확인하는 방법도 있다. 다음 명령을 통해 MariaDB Pod에 쉘 접속을 한다.

$ kubectl exec -it mariadb-pod -- /bin/bash

쉘 접속에 성공하면 다음과 같이 쉘 프롬프트가 바뀐다.

k8s 마스터노드에서 kubectl exec 명령을 통해 mariadb-pod에 접속하고 /bin/bash을 실행한 화면이다. 쉘 프롬프트가 maiadb-pod의 root 계정임을 알 수 있다.

앞 화면과 같이 MariaDB의 undo로그 파일, 트랜잭션로그 파일, mysql 데이터베이스 디렉토리 등 MariaDB가 필요로 하는 모든 파일들이 생성된 것을 확인할 수 있다.

물론 mariadb 명령 (구, mysql 명령)을 통해 MariaDB에 접속할 수도 있다. 기본적으로 MariaDB의 이미지에는 mariadb 명령이 포함되어 있기에 가능하다.

#k8s #mariadb #pod

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다