Kubernetes ‐ Docker Desktop을 사용해 Kubernetes 적용하기 - dnwls16071/Backend_Summary GitHub Wiki
📚 Kubernetes 도입 계기
- Devops 컨테이너 기반 기술 스택으로 유명한 것이 바로 Docker와 Kubernetes였다.
- 여태까지 프로젝트를 하면서 Docker와 Docker-Compose, Volume 등 배운 개념을 활용하려고 부단히 노력했었다.
- 이번 부동산 실거래가 프로젝트를 진행하면서는 새로운 기술 스택에 대해서 적용해보기로 결정했는데 바로 Kubernetes이다.
- 개인 프로젝트에서 Kubernetes를 도입한다는 것은 상당한 오버엔지니어링이다.
- 허나 실무에서도 AWS EKS 등이 흔하게 사용되고 있고 실무에서의 이런 기술 스택을 빠르게 받아들이고 적응하기 위해서라면 나 또한 그에 발맞춰 적용하려는 시도가 필요하다고 보았다.
- 그래서 이번 프로젝트에서 MySQL을 Kubernetes로 띄워 개발을 진행하게 되었다.
📚 디플로이먼트 매니페스트 파일 작성
apiVersion: apps/v1
kind: Deployment
# Deployment 기본 정보
metadata:
name: mysql-deployment # Deployment 이름
# Deployment 세부 정보
spec:
replicas: 1 # 생성할 파드의 복제본 개수
selector:
matchLabels:
app: mysql-db # 아래에서 정의한 Pod 중 'app: backend-app'이라는 값을 가진 파드를 선택
# 배포할 Pod 정의
template:
metadata:
labels: # 레이블 (= 카테고리)
app: mysql-db
spec:
containers:
- name: mysql-container # 컨테이너 이름
image: mysql # 컨테이너를 생성할 때 사용할 이미지
ports:
- containerPort: 3306 # 컨테이너에서 사용하는 포트를 명시적으로 표현
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: mysql-config
key: mysql-database
# 컨테이너 내에서 어떤 경로를 볼륨으로 사용할 지 지정
volumeMounts:
- name: mysql-persistent-storage # 밑에서 설정할 volumes.name과 값이 같아야 함
mountPath: /var/lib/mysql # mysql 컨테이너 내부에 있는 경로
# 파드가 사용할 볼륨을 지정
volumes:
- name: mysql-persistent-storage # 위에서 설정할 volumeMounts.name과 일치해야 함
persistentVolumeClaim:
claimName: mysql-pvc # 연결시킬 PVC의 name과 동일해야 함
📚 시크릿 매니페스트 파일 작성
apiVersion: v1
kind: Secret
# Secret 기본 정보
metadata:
name: mysql-secret # Secret 이름
# Key, Value 형식으로 값 저장
stringData:
mysql-root-password: password123
📚 컨피그 매니페스트 파일 작성
apiVersion: v1
kind: ConfigMap
# ConfigMap 기본 정보
metadata:
name: mysql-config # ConfigMap 이름
# Key, Value 형식으로 설정값 저장
data:
mysql-database: kub-practice
📚 서비스 매니페스트 파일 작성
apiVersion: v1
kind: Service
# Service 기본 정보
metadata:
name: mysql-service # Service 이름
# Service 세부 정보
spec:
type: NodePort # Service의 종류
selector:
app: mysql-db # 실행되고 있는 파드 중 'app: mysql-db'이라는 값을 가진 파드와 서비스를 연결
ports:
- protocol: TCP # 서비스에 접속하기 위한 프로토콜
port: 3306 # 쿠버네티스 내부에서 Service에 접속하기 위한 포트 번호
targetPort: 3306 # 매핑하기 위한 파드의 포트 번호
nodePort: 30002 # 외부에서 사용자들이 접근하게 될 포트 번호
📚 퍼시스턴스 볼륨 매니페스트 파일 작성하기
apiVersion: v1
kind: PersistentVolume
# PersistentVolume 기본 정보
metadata:
name: mysql-pv # PersistentVolume 이름
# PersistentVolume 세부 정보
spec:
storageClassName: my-storage # PV와 PVC의 storageClassName이 같다면 볼륨이 연결된다.
capacity:
storage: 1Gi # 볼륨이 사용할 용량을 설정
accessModes:
- ReadWriteOnce # 아래 hostPath 타입 활용 시 이 옵션만 사용 가능
hostPath: # hostPath 타입을 활용 (hostPath : 쿠버네티스 내부 공간을 활용)
path: "/mnt/data" # 쿠버네티스 내부의 공간에서 /mnt/data의 경로를 볼륨으로 사용
📚 퍼시스턴스 볼륨 클레임 매니페스트 파일 작성하기
apiVersion: v1
kind: PersistentVolumeClaim
# PersistentVolumeClaim 기본 정보
metadata:
name: mysql-pvc # PersistentVolumeClaim 이름
# PersistentVolumeClaim 세부 정보
spec:
storageClassName: my-storage # PV와 PVC의 storageClassName이 같다면 볼륨이 연결된다.
accessModes:
- ReadWriteOnce # 볼륨에 접근할 때의 권한
resources: # PVC가 PV에 요청하는 리소스의 양을 정의
requests: # 필요한 최소 리소스
storage: 1Gi # PVC가 PV에 요청하는 스토리지 양 (PV가 최소 1Gi 이상은 되어야 한다.)
📌볼륨(Volume)을 활용하는 이유 : 데이터의 유실 방지