k8s 이용해서 웹 서버 구축하기 - 1부. install k3s with Calico
k8s 이용해서 웹 서버 구축하기 - 2부. setup nginx-ingress, ipvs, metalb
k8s 이용해서 웹 서버 구축하기 - 3부. deploy nextjs (with. bun.js)
k8s 이용해서 웹 서버 구축하기 - 4부. nginx ingress 에 https 적용 (cert-manager 이용)
👉 k8s 이용해서 웹 서버 구축하기 - 5부. MariaDB 배포 및 연동
k8s 이용하서 웹 서버 구축하기 - 5-1부. (번외편) PostgreSQL 배포 및 연동
개요Namespace 생성ConfigMap 생성Secret 생성PV (PersistentVolume) 생성PVC (PersistentVolumeClaim) 생성Deployment 생성Service 생성Ingress 생성default namespace 에 external service 생성ExternalName 서비스와 연동하여 Ingress 생성Nginx Ingress 의 TCP/UDP Port Forward 를 이용팁! 한글 베이스 OS 이미지 만들어 사용하기
개요
MariaDB 를 이용하여, K8s 에 DB를 구축해볼 것이다. 그 전에 아래 공식문서를 먼저 살펴보도록 하자.
Namespace 생성
kubectl create ns mariadb
ConfigMap 생성
DB 의 기본적인 환경변수는 ConfigMap 으로 관리한다.
단, 보안이 필요한 정보는 아래와 같이 secret 으로 관리해야 한다.
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 을 생성한다.
kubectl create -f mariadb-configmap.yaml
Secret 생성
DB 의 접속 정보 (이름, 유저네임, 아이디, 비밀번호 등) 와 같은 보안이슈가 있는 값은 secret 으로 생성하고 관리하는 것이 좋다. 이 값은 나중에 deployment 를 정의할 때 사용할 것이다.
먼저, 아래 내용을 env 파일 등으로 작성해두자.
MYSQL_HOST=% MYSQL_PORT=3306 MYSQL_ROOT_PASSWORD=root_password MYSQL_DATABASE=database MYSQL_USER=user MYSQL_PASSWORD=user_password
작성한 env 파일을 이용하여 secret 을 생성할 것이다.
kubectl create secret generic mariadb-secret --from-env-file env -n mariadb
사용한 파일은 지워도 무방하다.
파일을 작성하기 싫다면, secret 을 생성할 때
--from-literal
키워드를 이용하거나 값을 직접 입력할 수 있다.PV (PersistentVolume) 생성
PV 는 클러스터 리소스이며, 스토리지 자원이다. PV 에 저장된 데이터는 클러스터의 종료, 삭제와 무관하게 별도로 관리되는 자원이므로 항상 데이터를 유지하고자 할 때 사용할 수 있다.
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 를 생성한다.
kubectl apply -f mariadb-pv.yaml
PVC (PersistentVolumeClaim) 생성
PVC 는 사용자의 스토리지에 대한 요청을 처리하는 자원이다. PVC 는 PV 리소스를 사용하며, Deployment 와 연결된다.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mariadb-pvc namespace: mariadb spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 80Gi
정의한 파일을 실행하여, PVC 를 생성한다.
kubectl apply -f mariadb-pvc.yaml
Deployment 생성
MariaDB 이미지를 이용하고, 이전에 생성했던 secret, pvc 를 함께 정의한다.
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 를 생성한다.
kubectl apply -f mariadb-deployment.yaml
Service 생성
MariaDB pod 은 생성되었으나, pod 외부에서 접근하기위해 Service 도 함께 정의한다.
apiVersion: v1 kind: Service metadata: name: mariadb-service namespace: mariadb spec: ports: - protocol: TCP name: mariadb port: 3306 targetPort: 3306 selector: app: mariadb
정의한 파일을 실행하여, service 를 생성한다.
kubectl apply -f mariadb-service.yaml
여기까지가 데이터 베이스를 생성하고, 클러스터 내부에서 DB 에 접근하는 방법이다.
이하 내용은 외부에서 DB 에 직접 접근하는 방식이다.
보안상 취약점이 많기 때문에, 실제 배포할 때는 추천하지 않는 방법이다.
Ingress 생성
주의! 위 MariaDB 는 namespace 가 mariadb 이다. 이를 default 와 같이 다른 namespace 의 ingress 에 연동하려 한다면 ingress 와 같은 namespace, 여기서는 default, 이 곳에 다음과 같은 서비스를 하나 더 생성해주어야 한다.
default namespace 에 external service 생성
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 생성
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 를 생성한다.
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 에서도 적용할 수 있다. 참고하여 만들어 사용하자.