์ด ๋ฌธ์๋ ๋ก์ปฌ์ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ jar ํ์ผ์ ์ด์ฉํด k8s์ ๋ฑ๋ก ํ ๋๋๋งํ๋ ๊ณผ์ ์ ๋ํ ์ค๋ช ์ ์ ๊ณตํฉ๋๋ค.
- Spring Boot: 3.5 (Gradle ๊ธฐ๋ฐ ๋ฐฐํฌ)
- Ubuntu Server: 24.04
- Docker: 28.4.0
- Docker Hub ๊ณ์ ํ์
- Minikube & kubectl ์ค์น ํ์
ubuntu-server:/home/ubuntu/k8s_spring
โโ app.jar # ๋ก์ปฌ์์ ๋น๋ํ Spring Boot JAR ํ์ผ
โโ deploy.yaml # deployment & service ์์ฑ yaml ํ์ผ
โโ ingress.yaml # ingress ์์ฑ yaml ํ์ผ
โโ Dockerfile # ๋์ปค ์ด๋ฏธ์ง ์์ฑ์ฉ
- DB ์ฐ๊ฒฐ์ด ํ์ ์๋ ๋จ์ Spring Boot ์น์ฑ์ Docker Hub์ ์ด๋ฏธ์ง๋ก ์ฌ๋ฆฌ๊ณ Kubernetes์์ ๋ฐฐํฌ
- Deployment, Service, Ingress๋ฅผ ์ด์ฉํ์ฌ 3๊ฐ Pod๋ก ์คํ ๋ฐ ์ธ๋ถ ํต์ ํ์ธ
- ์๋์ฐ์์ ๋ธ๋ผ์ฐ์ ๋๋ Postman์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ์ค์
- Ingress ์ถฉ๋ ๋ฐฉ์ง ๋ฐ ํ๊ฒฝ๋ณ์ ์ค์ ์ค์ต ํฌํจ
- ์ด๋ฏธ์ง(Image) vs ์ปจํ
์ด๋(Container)
- ์ด๋ฏธ์ง: ์คํ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํ๊ฒฝ ์ค์ ์ด ํฌํจ๋ ํจํค์ง
- ์ปจํ ์ด๋: ์ด๋ฏธ์ง๋ฅผ ์ค์ ๋ก ์คํํ ์ํ
docker run
โ ์ปจํ ์ด๋ ์์ฑ ๋ฐ ์คํ
- Dockerfile
- ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ ์ธ์ ํ์ผ
FROM
,COPY
,WORKDIR
,EXPOSE
,ENTRYPOINT
๊ฐ์ ๋ช ๋ น์ด ์ฌ์ฉ
- Docker Hub
- ์ด๋ฏธ์ง ์ ์ฅ์
docker push
โ ์ด๋ฏธ์ง ์ ๋ก๋,docker pull
โ ์ด๋ฏธ์ง ๋ค์ด๋ก๋
- ์ปจํ
์ด๋ ํฌํธ ๋งคํ
docker run -p 8080:8080
: ํธ์คํธ 8080 โ ์ปจํ ์ด๋ 8080
- Pod
- Kubernetes์์ ๊ฐ์ฅ ์์ ๋ฐฐํฌ ๋จ์
- ํ๋ ์ด์์ ์ปจํ ์ด๋๋ฅผ ํฌํจ
- ๋จ์ผ Pod ๋ด ์ปจํ ์ด๋๋ ๊ฐ์ ๋คํธ์ํฌ์ ์คํ ๋ฆฌ์ง๋ฅผ ๊ณต์
- Deployment
- Pod๋ฅผ ์ ์ธํ์ผ๋ก ๊ด๋ฆฌ
- ReplicaSet์ ์์ฑํ์ฌ ์ง์ ํ ๊ฐ์(replica)๋งํผ Pod ์ ์ง
- ๋กค๋ง ์ ๋ฐ์ดํธ, ๋กค๋ฐฑ ๊ฐ๋ฅ
- Service
- Pod์ ๋คํธ์ํฌ ์ ๊ทผ์ ์์ ์ ์ผ๋ก ์ ๊ณต
- ํ์
:
- ClusterIP: ํด๋ฌ์คํฐ ๋ด๋ถ ์ ๊ทผ ์ ์ฉ
- NodePort: ์ธ๋ถ์์ IP:Port๋ก ์ ๊ทผ ๊ฐ๋ฅ
- LoadBalancer: ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ธ๋ถ LoadBalancer ์ ๊ณต
- Pod Selector๋ก ๋์ Pod ์ง์
- Ingress
- HTTP/HTTPS ์์ฒญ์ ๋ผ์ฐํ
- host + path ๊ธฐ๋ฐ์ผ๋ก Service์ ์ฐ๊ฒฐ
- ์ฌ๋ฌ Ingress๊ฐ ๊ฒน์น๋ฉด ์ถฉ๋ ๋ฐ์
- Nginx Ingress Controller๊ฐ ํ์
- NodePort vs Ingress
- NodePort: ๋จ์ ํฌํธ ๋งคํ, ํ ์คํธ์ฉ
- Ingress: ๋๋ฉ์ธ ๊ธฐ๋ฐ ์ ๊ทผ, ์ธ๋ถ ํต์ ์ ๊ถ์ฅ
์์ | ๋ช ๋ น์ด |
---|---|
๋ฆฌ์์ค ์์ฑ | kubectl apply -f <file.yaml> |
Pod ์ํ ํ์ธ | kubectl get pods |
๋ก๊ทธ ํ์ธ | kubectl logs <pod-name> |
์ค์ผ์ผ ์กฐ์ | kubectl scale deployment <name> --replicas=<n> |
๋ฆฌ์์ค ์ญ์ | kubectl delete -f <file.yaml> |
Service ํ์ธ | kubectl get svc |
Ingress ํ์ธ | kubectl get ingress |
- Pod ์ ์ปจํ ์ด๋์์ ์คํ ํ๊ฒฝ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ
- YAML์์
env:
๋ฅผ ์ฌ์ฉํ์ฌ key/value ์ง์ - ์:
SERVER_PORT
,APP_ENV
- ์ฝ๋์์
System.getenv("APP_ENV")
๋ฑ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ
- Ingress ์ถฉ๋ ๋ฐฉ์ง
- ํธ์คํธ(host) + ๊ฒฝ๋ก(path) ์ค๋ณต X
- ๊ธฐ์กด Ingress๊ฐ ์๋ ๊ฒฝ์ฐ ์ญ์ ํ๊ฑฐ๋ ์ ์ด๋ฆ/ํธ์คํธ ์ฌ์ฉ
- Pod CrashLoopBackOff
- ์ปจํ ์ด๋๊ฐ ๋ฐ๋ก ์ฃฝ๋ ์ํ
- ๋ก๊ทธ ํ์ธ ํ์ (
kubectl logs
/-previous
)
- NodePort ํฌํธ ์ถฉ๋
- NodePort๋ ํด๋ฌ์คํฐ ์ ์ฒด์์ ์ค๋ณต X
- 30000~32767 ๋ฒ์ ๋ด ์ฌ์ฉ
- Docker Hub ์ฐ๋
- ๋ฐ๋์
docker build โ docker push โ kubectl Deployment image
์์
- ๋ฐ๋์
- ์ค์ ์ ํธ์งํ ๋, ๊ธฐ์กด ์ค์ ์ ์ญ์ ํ ๋ค์ yaml ํ์ผ์ ์์ ํ๊ณ ๋ค์ ์ ์ฉ์์ผ์ผ ํจ
- ์์ : nginx-ingress.yaml ์ค์ ์ ์์ ํ ๊ฒฝ์ฐ
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
docker build -t <DOCKER_HUB_ID>/springapp:1.0 .
docker login
docker push <DOCKER_HUB_ID>/springapp:1.0
apiVersion: apps/v1
kind: Deployment
metadata:
name: springapp-deployment
labels:
app: springapp
spec:
replicas: 3
selector:
matchLabels:
app: springapp
template:
metadata:
labels:
app: springapp
spec:
containers:
- name: springapp
image: sumin07/springapp:1.0
ports:
- containerPort: 8085
env:
- name: SERVER_PORT
value: "8082"
---
apiVersion: v1
kind: Service
metadata:
name: springapp-service
spec:
selector:
app: springapp
ports:
- port: 8085
targetPort: 8085
nodePort: 30090
type: NodePort
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: springapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: springapp.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: springapp-service
port:
number: 8085
๐น ํ: Ingress๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค ๋๋ metadata.name๊ณผ host๋ฅผ ํญ์ ์๋ก ์ง์ ํด์ ์ถฉ๋์ ๋ฐฉ์งํ์ธ์.
# ์์ฑ
kubectl apply -f deploy.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
# Pod ์ํ ํ์ธ
kubectl get pods
kubectl logs <pod-name>
# Pod ์ ์กฐ์
kubectl scale deployment springapp-deployment --replicas=5

๋ธ๋ผ์ฐ์ / Postman:
http://<ํด๋ฌ์คํฐ๋
ธ๋IP>:30090
- ๋ก์ปฌ PC
/etc/hosts
์์ : ๋๋ฉ์ธ ๋ฑ๋ก
<ํด๋ฌ์คํฐ๋
ธ๋IP> springapp01.local
- ๋ธ๋ผ์ฐ์ / Postman:
http://springapp01.local
