주제
- Minikube를 이용해 로컬 클러스터를 구축해본다.
- BE 어플리케이션을 올려본다.
1. Minikube 설치
1.1 미니큐브 설치
공식 홈페이지에서 가이드를 제공하여 간단하게 설치할 수 있다.
또한 간단한 튜토리얼을 제공한다.
https://minikube.sigs.k8s.io/docs/start/
2. Minikube 가이드
2.1 소개
minikube is local Kubernetes, focusing on making it easy to learn and develop for Kubernetes.
- minikube는 Kubernetes를 쉽게 배우고 개발할 수 있도록 하는 데 중점을 둔 로컬 Kubernetes입니다.
2.1 명령어
# 시작
minikube start
# 정보 표시
minikube status
# 중지
minikube stop
# 삭제
minikube delete
# k8s 대시보드 열기
minikube dashboard
3. BE, FE 어플리케이션 배포해보기
3.1 Kubeconfig / Context 설정
Kubeconfig는 Kubernetes 클러스터에 접근하기 위한 설정 파일입니다.
이를 적절하게 설정해놓으면 kubectl로 context를 전환하여 여러 클러스터를 조작할 수 있습니다.
context란 하나의 클러스터에 대한 사용자 / 네임스페이스를 결합한 개념입니다.
클러스터에 대한 환경 정도로 보면 됩니다.
# Kubeconfig 파일의 기본 위치
Mac OS : ~/.kube/config
Winodws : C:\Users\<사용자 이름>\.kube\config
3.1 Namespace 생성
Namespace란 Kubernetes 클러스터 내에서 리소스를 분리하고 관리하기 위한 논리적인 공간을 말합니다.
namespace를 활용하면 namespace 별로 논리적으로 유사한 리소스들을 하나로 묶을 수 있습니다.
# 네임스페이스 생성
kubectl create namespace dev
kubectl create namespace cbt
kubectl create namespace prod
# 네임스페이스 조회
kubectl get namespace
3.2 어플리케이션 배포
3.2.1 Deployment, Service
Deployment란?
- Deployment는 Kubernetes에서 Application을 배포하고 관리하는 리소스 입니다.
- Deployment를 사용하면 Pod 관리와 배포, 롤백, 스케일링을 쉽게 수행할 수 있습니다.
Service란?
- Service는 Kubernetes 클러스터 내에서 실행 중인 Application에 대한 네트워크 접근성을 제공하는 추상화입니다.
- 서비스는 여러 Pod에 대한 단일 진입점을 만들어 로드 밸런싱과 서비스 디스커버리를 가능하도록 함
- 생성되는 Pod의 IP와 관계없이 DNS 이름을 통해 접근되어, 클라이언트가 서비스를 통해 액세스 가능
3.2.2 Minikube에서 Docker Image 받아오기
Minikube 클러스터로 Docker Image를 끌어오는 방법들은 다음과 같은 방법들이 있다.
- 로컬에 Private Docker Registry를 구축해서 Minikube로 끌어오기
- Minikube 자체에서 제공하는 Registry에 Image를 push하고 끌어오기
- 현재 쉘에서 Minikube의 Docker Daemon으로 초점을 옮기고, Docker Image를 빌드하기(Minikube 로컬에 Image를 빌드하기)
이중에 3번째 방법이 가장 쉽다.
2번째 방법
https://minikube.sigs.k8s.io/docs/handbook/registry/
3번째 방법의 경우
# 현재 쉘이 Minikube의 Docker daemon을 사용하도록 변경
minikube docker-env
# 위의 명령어를 입력하면 아래와 같은 안내문이 print된다.
# To point your shell to minikube's docker-daemon, run:
# 본인 OS에 맞는 명령어가 출력되는 걸로 보인다. 아래를 다시 입력한다.
& minikube -p minikube docker-env --shell powershell | Invoke-Expression
이떄 Unable to resolve the current Docker CLI context "default" 따위의 오류가 난다면
$ docker context use default 실행
https://stackoverflow.com/questions/42564058/how-to-use-local-docker-images-with-minikube
3.2.3 Docker Image 빌드
Dockerfile
# Use the official OpenJDK base image
FROM openjdk:11-jdk
# Copy the packaged Spring Boot application JAR file into the container at /app
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} /app/app.jar
EXPOSE 8080
# Run the Spring Boot application when the container launches
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar","./app/app.jar"]
- Dockerfile은 확장자가 없고, 프로젝트 Root 경로에 위치해야 한다.
- Spring Boot 멀티 모듈 프로젝트의 경우 각 모듈의 Root에 위치한다.
# docker image build
docker build -t kingpiggy/digimon-pg-dev-api:latest ./api-server
docker build -t kingpiggy/digimon-pg-dev-schedule:latest ./schedule-server
- build한 이미지는 로컬 Docker 호스트의 Docker 이미지 캐시에 저장된다고 한다.
이미지 캐시는 Docker 데몬이 관리하는 로컬 파일 시스템 영역에 저장된다. - Minikube의 Docker daemon을 바라본 상태로 빌드하면 따로 push할 필요가 없어진다
3.2.4 백엔드 Application 배포
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: digimon-pg-api-deployment
namespace: dev
spec:
replicas: 2
selector:
matchLabels:
app: digimon-pg-api-app
template:
metadata:
labels:
app: digimon-pg-api-app
spec:
containers:
- name: digimon-pg-api-container
image: kingpiggy/digimon-pg-dev-api:latest
imagePullPolicy: Never
ports:
- containerPort: 8090
env:
- name: SPRING_PROFILES_INCLUDE
value: core,dev
- 메타 데이터에서 namespace를 "dev"로 정의했다.
- docker image는 minikube의 로컬의 이미지 캐시에서 가져온다.
- env를 통해 환경변수를 지정할 수 있다.
Service
apiVersion: v1
kind: Service
metadata:
name: digimon-pg-dev-api-service
namespace: dev
spec:
selector:
app: digimon-pg-api-app
ports:
- protocol: TCP
port: 8090
targetPort: 8090
type: NodePort
- NodePort 방식으로 클러스터 외부에서 8090 포트로 접근할 수 있도록 포트를 개방하였다.
3.2.5 로컬에 띄운 DB 컨테이너를 바라보도록 수정하기(MySql 8.0)
JDBC 설정을 다음과 같이 수정한다
jdbc:mysql://host.minikube.internal:3306/{db_name}
host.minikube.internal는 localhost를 바라볼 수 있도록 도와준다.
https://minikube.sigs.k8s.io/docs/handbook/host-access/
3.2.6 (선택) Minikube 마스터 노드와 도메인이어주기
# Minikube 클러스터의 마스터 노드 IP 조회
$ minikube ip
# Windows의 경우
1. 메모장을 관리자 권한으로 실행
2. C\Windows\System32\drivers\etc\hosts 파일을 열어준다
# Mac의 경우
$ sudo vim /private/etc/hosts
- hosts 파일을 적절히 수정하면 로컬 PC를 한정하여 내가 원하는 도메인 주소를 입력했을 때 Minikube로 연결되게끔 할 수 있다. (DNS 등록과 같은 원리)
- 요건 Ingress에서 도메인으로 서비스에 접근하도록 하고싶을 때 테스트 가능한 방법
- 선택적으로 적용해본다
3.3 배포한 Application에 접근하기
1. local에서 minikube의 특정 서비스로 포트 포워딩 처리
kubectl port-forward service/digimon-pg-dev-api-service -n dev 8090:8090
- 포트포워딩에 의해 localhot:8090로 minikube의 service로 접근할 수 있다
2. NodePort를 통해 포트를 개방하고, 클러스터 ip를 통해 접근하기
- 윈도우는 방화벽을 열어야 하는듯 하다.
3. 미니큐브에서 어떤 url로 접근해야 하는지 알려준다.
minikube service -n dev digimon-pg-dev-api-service --url
# 참고자료
- 미니큐브 공식 가이드
- ChatGPT
'# DevOps > Kubernetes' 카테고리의 다른 글
Local private docker registry 구축하기 (0) | 2023.09.20 |
---|---|
컨테이너 개발 환경의 등장 배경과 쿠버네티스 (0) | 2022.06.15 |