DevOps/K8S

[Kubernetes] MySQL 서비스 및 디플로이먼트 생성하기

IT록흐 2023. 10. 13. 17:49
반응형
 

[Kubernetes] 프론트엔드, 백엔드 서비스 및 디플로이먼트 생성하기

[Kubernetes] Minikube 설치 및 인그레스 설치 및 설정하기 [Docker] Nginx - React - Nodejs - Mysql 연동 실습하기 이번 포스팅에서 구현할 시스템의 구성도는 위와 같다. Ngnix, React, NodeJS, MySQL을 도커 컨테이너

lordofkangs.tistory.com

 

 

지난 포스팅에서 미니큐브로 구성한 쿠버네티스 클러스터에 프론트엔드, 백엔드 서비스 및 디플로이먼트를 생성해보았다. 이번 포스팅에서는 MySQL 서비스 및 디플로이먼트를 생성하여 백엔드와 연동시켜보겠다.

 

MySQL 서비스 ( Service )

 

mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql-db
  ports:
    - protocol: TCP
      port: 3306 # 서비스포트
      targetPort: 3306 #컨테이너포트

 

MySQL 서비스를 생성하는 yaml 파일이다. 3306 포트를 열고 있는 'mysql-db'라는 레이블을 가진 컨테이너들에게 트래픽을 로드밸런싱할 수 있는 서비스이다. 컨테이너의 3306 포트를 서비스 오브젝트의 3306포트와 포워딩한다. 그 이유는 백엔드 어플리케이션의 mysql 모듈이 mysql 서비스 3306포트로 트래픽을 전달하기 때문이다. 

 

 

Secret 환경변수

 

MySQL 컨테이너를 띄우려면 MYSQL_ROOT_PASSWORD 환경변수를 설정해주어야 한다. 디플로이먼트 yaml 파일에 정적으로 설정해줄 수도 있지만 패스워드는 중요하고 보안에 민감한 데이터이다. 쿠버네티스가 제공하는 시크릿 오브젝트를 생성하여 그곳에 MySQL 패스워드를 저장해보자. 

 

kubectl create secret generic db-secret --from-literal='DB_Password=1234' --dry-run -o yaml > secret-mysql.yaml

 

kubectl create secret : secret 오브젝트를 생성해라

generic : Opaque 시크릿 타입

db-secret : 시크릿 오브젝트 이름

--from-literal='DB_Password=johnahn'  : 환경변수 데이터 

--dry-run : 쿠버네티스 명령을 실제로 실행하지 않고 결과만 출력

-o yaml : 출력형식을 yaml로 지정

> secret-mysql.yaml : 출력된 결과를 yaml 파일로 생성

 

secret-mysql.yaml

apiVersion: v1
data:
  DB_Password: am9obmFobg==
kind: Secret
metadata:
  creationTimestamp: null
  name: db-secret

 

DB패스워드가 인코딩 된 yaml 파일 하나가 생성되었다. 그럼 yaml 파일을 실행하여 시크릿 오브젝트를 생성해보자. 

 

kubectl apply -f secret-mysql.yaml

 

위와 같이, 시크릿 객체 생성을 확인할 수 있다. 

그럼 디플로이먼트를 생성하여 시크릿 객체를 가져와 환경변수를 설정해보자.

 

 

MySQL 디플로이먼트 ( Deployment )

 

mysql-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-db
spec:
  replicas: 1 # 생성할 POD 개수
  selector:
    matchLabels:
      app: mysql-db
  template:
    metadata:
      labels:
        app: mysql-db
    spec:
      containers:
        - name: mysql-db
          image: lordofkangs/mysql_db # 컨테이너 도커 이미지
          ports:
            - containerPort: 3306 # 컨테이너 포트
          env:
            - name: MYSQL_ROOT_PASSWORD # DB패스워드 환경변수
              valueFrom: 
                secretKeyRef: # 시크릿 키 참조
                  name: db-secret
                  key: DB_Password
            - name: MYSQL_DATABASE # 사용할 DB명
              value: myapp

 

디플로이먼트 yaml 파일을 생성하여 디플로이먼트를 생성하고 POD를 배포해보자. 

 

replicas는 1로 설정하여 POD를 1개 배포할 것이다. 도커HUB에 저장된 컨테이너 이미지를 가져오고 컨테이너포트를 3306으로 설정해준다. 그리고 env 환경변수 옵션에는 valueFrom으로 앞에서 만든 시크릿 오브젝트를 참조하도록 설정한다. 이렇게 Deployment yaml 파일 생성도 완료되었다. 

 

그럼 MySQL 서비스와 디플로이먼트를 생성해보자. 

 

 

테스트해보기 

 

kubectl get svc

kubectl get deployment

kubectl get pods

 

mysql 서비스, 디플로이먼트, 파드가 정상적으로 생성되었다. 

 

 

위 화면이 그려지는 과정을 정리해보면, 

 

192.168.49.2:30261로 접근하면 Minikube노드(192.168.49.2)는 30261 포트로 들어온 트래픽을 인그레스 컨트롤러 서비스로 포워딩한다. 인그레스 컨트롤러 서비스는 인그레스 컨트롤러 파드로 포워딩하고 인그레스 컨트롤러는 '/' 경로로 들어온 요청은 리액트 프론트엔드 서비스로 포워딩한다. 프론트엔드 서비스는 프론트엔드 파드로 포워딩하고 프론트엔드는 리액트 화면을 클라이언트에 응답한다. 

 

클라이언트가 input폼에 데이터를 입력하고 확인버튼을 누르면 프론트엔드 파드는 POST방식으로 /api/value 요청을 한다. '/api' 로 시작하는 경로는 인그레스에 의해 백엔드서비스로 트래픽이 포워딩된다. 백엔드 서비스는 트래픽을 백엔드 파드로 포워딩하고 백엔드 파드는 /api/value 요청을 DB Insert 요청으로 변환하여 MySQL 서비스로 포워딩한다. MySQL 서비스는 MySQL 파드로 트래픽을 포워딩하면 MySQL DB에 데이터가 INSERT된다. 

 

요청이 완료되면 프론트엔드 파드는 /api/values 요청을 다시한다. '/api'로 시작하므로 백엔드 서비스로 트래픽이 들어가고 백엔드 파드는 /api/values 요청을 SELECT 요청으로 변환하여 MySQL 서비스로 포워딩한다. MySQL DB에서 SELECT 처리가 완료되면 조회된 데이터는 프론트엔드 파드로 전달되고 파드는 조회된 데이터가 출력된 화면을 클라이언트에게 응답한다. 

 

 

 

이렇게 MiniKube환경에서 Ingress-frontend-backend-DB 시스템을 구성해보았다.

 

여기서 한 가지를 더 구성해보려고 한다. MySQL 파드가 종료된다면 DB에 저장된 모든 데이터는 날아간다. 파드는 언제든 제거되었다가 다시 생성될 수 있으므로 파드가 종료되어도 데이터는 유지되어야 한다. 이를 위해, PV PVC 기술을 적용해야 한다. 이는 다음 포스팅에서 다루어 보겠다. 

 

 


 

 

참고자료

 

데브옵스(DevOps)를 위한 쿠버네티스 마스터 - 인프런 | 강의

컨테이너 기반 오픈 소스 가상화 프로젝트인 "쿠버네티스"를 이용한 컨테이너 환경의 분산 시스템을 탄력적으로 실행하기 위한 프레임 워크를 활용하는 방법을 입문부터 활용까지 다룹니다., [

www.inflearn.com

 

시크릿(Secret)

시크릿은 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너 이미지에 포함될 수 있다. 시크릿을 사용한다

kubernetes.io

 

예시: WordPress와 MySQL을 퍼시스턴트 볼륨에 배포하기

이 튜토리얼은 WordPress 사이트와 MySQL 데이터베이스를 Minikube를 이용하여 어떻게 배포하는지 보여준다. 애플리케이션 둘 다 퍼시스턴트 볼륨과 퍼시스턴트볼륨클레임을 데이터를 저장하기 위해

kubernetes.io

 

반응형