반갑습니다. 저는|기업가이자, 엔지니어입니다.
k8s 이용해서 웹 서버 구축하기 - 5부. MariaDB 배포 및 연동

k8s 이용해서 웹 서버 구축하기 - 5부. MariaDB 배포 및 연동

Tags
k8s
k3s
mariadb
Published
발행일 - 2022년 9월 5일
Author
Eugene Jeon (전유진)
AuthorLink

 
 

개요

MariaDB 를 이용하여, K8s 에 DB를 구축해볼 것이다. 그 전에 아래 공식문서를 먼저 살펴보도록 하자.
 

Namespace 생성

(yaml)
kubectl create ns mariadb
 

ConfigMap 생성

DB 의 기본적인 환경변수는 ConfigMap 으로 관리한다.
단, 보안이 필요한 정보는 아래와 같이 secret 으로 관리해야 한다.
(yaml)
apiVersion: v1 kind: ConfigMap metadata: name: mariadb-configmap namespace: mariadb labels: app: mariadb # version: "5.7" # 사용할 버전을 직접 입력해도 좋다. data: service-master.cnf: | [mysqld] bind-address = 0.0.0.0 character-set-server=utf8mb4 collation-server=utf8mb4_bin default-storage-engine=INNODB max_allowed_packet=256M innodb_log_file_size=2GB transaction-isolation=READ-COMMITTED max_connections = 600 read_buffer_size = 1048576 net_read_timeout = 360 net_write_timeout = 360
 
작성한 파일을 이용하여 configmap 을 생성한다.
(yaml)
kubectl create -f mariadb-configmap.yaml
 

Secret 생성

DB 의 접속 정보 (이름, 유저네임, 아이디, 비밀번호 등) 와 같은 보안이슈가 있는 값은 secret 으로 생성하고 관리하는 것이 좋다. 이 값은 나중에 deployment 를 정의할 때 사용할 것이다.
 
먼저, 아래 내용을 env 파일 등으로 작성해두자.
(plain text)
MYSQL_HOST=% MYSQL_PORT=3306 MYSQL_ROOT_PASSWORD=root_password MYSQL_DATABASE=database MYSQL_USER=user MYSQL_PASSWORD=user_password
 
작성한 env 파일을 이용하여 secret 을 생성할 것이다.
(bash)
kubectl create secret generic mariadb-secret --from-env-file env -n mariadb
 
💡
사용한 파일은 지워도 무방하다. 파일을 작성하기 싫다면, secret 을 생성할 때 --from-literal 키워드를 이용하거나 값을 직접 입력할 수 있다.
 

PV (PersistentVolume) 생성

PV 는 클러스터 리소스이며, 스토리지 자원이다. PV 에 저장된 데이터는 클러스터의 종료, 삭제와 무관하게 별도로 관리되는 자원이므로 항상 데이터를 유지하고자 할 때 사용할 수 있다.
(yaml)
apiVersion: v1 kind: PersistentVolume metadata: name: mariadb-pv namespace: mariadb labels: type: local spec: storageClassName: manual capacity: storage: 80Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data"
 
정의한 파일을 실행하여, PV 를 생성한다.
(bash)
kubectl apply -f mariadb-pv.yaml
 

PVC (PersistentVolumeClaim) 생성

PVC 는 사용자의 스토리지에 대한 요청을 처리하는 자원이다. PVC 는 PV 리소스를 사용하며, Deployment 와 연결된다.
(yaml)
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mariadb-pvc namespace: mariadb spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 80Gi
 
정의한 파일을 실행하여, PVC 를 생성한다.
(bash)
kubectl apply -f mariadb-pvc.yaml
 

Deployment 생성

MariaDB 이미지를 이용하고, 이전에 생성했던 secret, pvc 를 함께 정의한다.
(yaml)
apiVersion: apps/v1 kind: Deployment metadata: name: mariadb namespace: mariadb spec: selector: matchLabels: app: mariadb strategy: type: Recreate template: metadata: labels: app: mariadb spec: containers: - image: mariadb:latest name: mariadb envFrom: - secretRef: name: mariadb-secret ports: - containerPort: 3306 name: mariadb volumeMounts: - name: mariadb-volume mountPath: /var/lib/mysql - name: mariadb-config-volume mountPath: /etc/mysql/conf.d volumes: - name: mariadb-volume persistentVolumeClaim: claimName: mariadb-pvc - name: mariadb-config-volume configMap: name: mariadb-configmap
 
정의한 파일을 실행하여, deployment 를 생성한다.
(bash)
kubectl apply -f mariadb-deployment.yaml
 

Service 생성

MariaDB pod 은 생성되었으나, pod 외부에서 접근하기위해 Service 도 함께 정의한다.
(yaml)
apiVersion: v1 kind: Service metadata: name: mariadb-service namespace: mariadb spec: ports: - protocol: TCP name: mariadb port: 3306 targetPort: 3306 selector: app: mariadb
 
정의한 파일을 실행하여, service 를 생성한다.
(bash)
kubectl apply -f mariadb-service.yaml
 
 

💡
여기까지가 데이터 베이스를 생성하고, 클러스터 내부에서 DB 에 접근하는 방법이다. 이하 내용은 외부에서 DB 에 직접 접근하는 방식이다. 보안상 취약점이 많기 때문에, 실제 배포할 때는 추천하지 않는 방법이다.

 

Ingress 생성

주의! 위 MariaDB 는 namespace 가 mariadb 이다. 이를 default 와 같이 다른 namespace 의 ingress 에 연동하려 한다면 ingress 와 같은 namespace, 여기서는 default, 이 곳에 다음과 같은 서비스를 하나 더 생성해주어야 한다.

default namespace 에 external service 생성

(yaml)
apiVersion: v1 kind: Service metadata: name: mariadb-service namespace: default spec: type: ExternalName # 자세한 사항은 아래 참고 링크를 확인하자. externalName: mariadb-service.mariadb.svc.cluster.local # k8s style reference ports: - port: 3306 targetPort: 3306
 

ExternalName 서비스와 연동하여 Ingress 생성

(yaml)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: mariadb-ingress annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: / # nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: ingressClassName: nginx # created default class rules: - host: {IP}.sslip.io http: paths: - path: "/" pathType: Prefix backend: service: name: mariadb-service port: number: 3306
 
작성한 파일을 실행하여, ingress 를 생성한다.
(bash)
kubectl apply -f mariadb-ingress.yaml
 

Nginx Ingress 의 TCP/UDP Port Forward 를 이용

이 방법은 추천하지 않지만, 필요한 분들을 위해 따로 링크를 걸어 두겠다.
Nginx Ingress 설정하는 방법을 담은 페이지이다. 하단의 TCP/UDP 포트 추가하는 내용을 참고하면된다.
 

팁! 한글 베이스 OS 이미지 만들어 사용하기

LC_ALL, LANG 등을 ko_KR.UTF-8 등으로 한글 Locale 을 적용하기 위해서는 OS 에서부터 설정이 되어 있어야 한다.
아래 링크는 PostgreSQL 베이스에 한글 Locale 적용하는 방법이지만, MariaDB 에서도 적용할 수 있다. 참고하여 만들어 사용하자.

Loading Comments...