Minikube를 이용한 로컬 클러스터 구축
# DevOps/Kubernetes

Minikube를 이용한 로컬 클러스터 구축

 

주제

  • Minikube를 이용해 로컬 클러스터를 구축해본다.
  • BE 어플리케이션을 올려본다.

 


 

1. Minikube 설치

1.1 미니큐브 설치

공식 홈페이지에서 가이드를 제공하여 간단하게 설치할 수 있다.

또한 간단한 튜토리얼을 제공한다.

 

https://minikube.sigs.k8s.io/docs/start/

 

minikube start

minikube is local Kubernetes

minikube.sigs.k8s.io

 

 

 

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를 끌어오는 방법들은 다음과 같은 방법들이 있다.

  1. 로컬에 Private Docker Registry를 구축해서 Minikube로 끌어오기
  2. Minikube 자체에서 제공하는 Registry에 Image를 push하고 끌어오기
  3. 현재 쉘에서 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

 

https://stackoverflow.com/questions/64881583/how-to-access-external-service-using-the-minikube-hosts-public-ip-address

 

 

 


 

 

# 참고자료

  • 미니큐브 공식 가이드
  • ChatGPT

 

728x90