지난 포스팅에서 미니큐브로 구성한 쿠버네티스 클러스터에 프론트엔드, 백엔드 서비스 및 디플로이먼트를 생성해보았다. 이번 포스팅에서는 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 > K8S' 카테고리의 다른 글
[Kubernetes] MySQL PV, PVC 적용하기 (0) | 2023.10.16 |
---|---|
[Kubernetes] ClusterIP, NodePort, LoadBalancer의 차이 (0) | 2023.10.13 |
[Kubernetes] 프론트엔드, 백엔드 서비스 및 디플로이먼트 생성하기 (0) | 2023.10.12 |
[Kubernetes] Minikube 설치 및 인그레스 설치 및 설정하기 (0) | 2023.10.12 |
[Kubernetes] 인그레스(Ingress)란 무엇인가? (0) | 2023.10.11 |