| 항목 | 용도 |
|---|---|
| Docker | 개발자가 로컬에서 이미지 만들 때 사용 |
| Minikube | 로컬 K8s 클러스터 구성 |
| kubectl | K8s 제어 CLI |
1️⃣ Docker 설치
brew install --cask docker
설치 후에 Docker Desktop 실행
2️⃣ kubectl 설치 (K8s CLI) 및 확인
brew install kubectl
kubectl version --client
3️⃣ Minikube 설치 (로컬 K8s 클러스터) 및 확인
brew install minikube
minikube version
4️⃣ MiniKube 시작하기
minikube start --driver=docker
👉 실행에 성공하면 확인하기
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 20s v1.32.0
1️⃣ Spring Boot 프로젝트 생성 의존성은 Spring Web 추가

2️⃣ 간단한 GET /hello API 만들기
package com.springk8sdemo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello K8s!";
}
}
3️⃣ API 실행 결과 확인

1️⃣ 프로젝트 루트에 Dockerfile 작성
FROM openjdk:17-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
2️⃣ 도커 이미지 빌드 및 확인
./gradlew build
docker build -t spring-k8s-demo .
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
spring-k8s-demo latest 257ebb3705d2 1 minutes ago 423MB
1️⃣ Minikube 에 이미지 넣기
Minikube 는 자기만의 도커 환경을 따로 가지고 있어서 로컬에서 만든 이미지를 바로 못 씀
👉 Minikube Docker 환경에서 직접 빌드하기
eval ${minikube docker-env} # 도커 빌드 타겟을 Minikube로 변경
다시 빌드하기
docker build -t spring-k8s-demo .
2️⃣ K8s Deployment & Service 설정 파일 만들기
- 📄 루트에서 spring-k8s-deployment.yaml 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-k8s-demo
spec:
selector:
matchLabels:
app: spring-k8s-demo
template:
metadata:
labels:
app: spring-k8s-demo
spec:
containers:
- name: spring-k8s-demo
image: spring-k8s-demo
imagePullPolicy: Never
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: spring-k8s-service
spec:
type: NodePort
selector:
app: spring-k8s-demo
ports:
- port: 8080
targetPort: 8080
nodePort: 30080
🧱 1. Deployment 설정
imagePullPolicy: Never 필요🌐 2. Service 설정 (외부에서 접근 가능하게)
3️⃣ 배포 및 확인
✅ 배포하기
kubectl apply -f spring-k8s-deployment.yaml
→ 반환
deployment.apps/spring-k8s-demo unchanged
service/spring-k8s-service created
✅ Pod 확인하기
kubectl get pods
→ 반환
NAME READY STATUS RESTARTS AGE
spring-k8s-demo-74d78f9565-jdlz7 1/1 Running 0 12s
✅ Service 확인하기
kubectl get services
→ 반환
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 44m
spring-k8s-service NodePort 10.111.105.105 <none> 8080:30080/TCP 14m
4️⃣ Minikube 로 포트 확인 & 접속
minikube service spring-k8s-service
→ 반환
|-----------|--------------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|--------------------|-------------|---------------------------|
| default | spring-k8s-service | 8080 | http://192.168.49.2:30080 |
|-----------|--------------------|-------------|---------------------------|
🏃 spring-k8s-service 서비스의 터널을 시작하는 중
|-----------|--------------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|--------------------|-------------|------------------------|
| default | spring-k8s-service | | http://127.0.0.1:52696 |
|-----------|--------------------|-------------|------------------------|
🎉 Opening service default/spring-k8s-service in default browser...
❗ darwin 에서 Docker 드라이버를 사용하고 있기 때문에, 터미널을 열어야 실행할 수 있습니다
🔍 반환된 값 요약
| 항목 | 내용 |
|---|---|
| 서비스 이름 | spring-k8s-service |
| 클러스터 IP URL | http://192.168.49.2:30080 |
| 터널 URL (로컬 포트) | http://127.0.0.1:52696 |
👉 제공받은 http://127.0.0.1:52696/hello 로 브라우저 에서 접근
