Skip to content

Jsumin07/springapp-k8s-deploy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

8 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿณ Minikube๋ฅผ ํ™œ์šฉํ•œ Spring Boot Kubernetes ๋ฐฐํฌ ๊ฐ€์ด๋“œ

๐Ÿ“Œ ๊ฐœ์š”

์ด ๋ฌธ์„œ๋Š” ๋กœ์ปฌ์˜ 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        # ๋„์ปค ์ด๋ฏธ์ง€ ์ƒ์„ฑ์šฉ

1. ๋ชฉ์ 

  • DB ์—ฐ๊ฒฐ์ด ํ•„์š” ์—†๋Š” ๋‹จ์ˆœ Spring Boot ์›น์•ฑ์„ Docker Hub์— ์ด๋ฏธ์ง€๋กœ ์˜ฌ๋ฆฌ๊ณ  Kubernetes์—์„œ ๋ฐฐํฌ
  • Deployment, Service, Ingress๋ฅผ ์ด์šฉํ•˜์—ฌ 3๊ฐœ Pod๋กœ ์‹คํ–‰ ๋ฐ ์™ธ๋ถ€ ํ†ต์‹  ํ™•์ธ
  • ์œˆ๋„์šฐ์—์„œ ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Postman์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •
  • Ingress ์ถฉ๋Œ ๋ฐฉ์ง€ ๋ฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ์‹ค์Šต ํฌํ•จ

2. ๊ด€๋ จ ๊ฐœ๋…

1๏ธโƒฃ Docker ๊ด€๋ จ ๊ฐœ๋…

  1. ์ด๋ฏธ์ง€(Image) vs ์ปจํ…Œ์ด๋„ˆ(Container)
    • ์ด๋ฏธ์ง€: ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ™˜๊ฒฝ ์„ค์ •์ด ํฌํ•จ๋œ ํŒจํ‚ค์ง€
    • ์ปจํ…Œ์ด๋„ˆ: ์ด๋ฏธ์ง€๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•œ ์ƒํƒœ
    • docker run โ†’ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰
  2. Dockerfile
    • ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ ์–ธ์  ํŒŒ์ผ
    • FROM, COPY, WORKDIR, EXPOSE, ENTRYPOINT ๊ฐ™์€ ๋ช…๋ น์–ด ์‚ฌ์šฉ
  3. Docker Hub
    • ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ
    • docker push โ†’ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, docker pull โ†’ ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ
  4. ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ๋งคํ•‘
    • docker run -p 8080:8080: ํ˜ธ์ŠคํŠธ 8080 โ†’ ์ปจํ…Œ์ด๋„ˆ 8080

2๏ธโƒฃ Kubernetes ํ•ต์‹ฌ ๊ฐœ๋…

  1. Pod
    • Kubernetes์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐฐํฌ ๋‹จ์œ„
    • ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํฌํ•จ
    • ๋‹จ์ผ Pod ๋‚ด ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์™€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ณต์œ 
  2. Deployment
    • Pod๋ฅผ ์„ ์–ธํ˜•์œผ๋กœ ๊ด€๋ฆฌ
    • ReplicaSet์„ ์ƒ์„ฑํ•˜์—ฌ ์ง€์ •ํ•œ ๊ฐœ์ˆ˜(replica)๋งŒํผ Pod ์œ ์ง€
    • ๋กค๋ง ์—…๋ฐ์ดํŠธ, ๋กค๋ฐฑ ๊ฐ€๋Šฅ
  3. Service
    • Pod์˜ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ์„ ์•ˆ์ •์ ์œผ๋กœ ์ œ๊ณต
    • ํƒ€์ž…:
      • ClusterIP: ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ์ ‘๊ทผ ์ „์šฉ
      • NodePort: ์™ธ๋ถ€์—์„œ IP:Port๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
      • LoadBalancer: ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์™ธ๋ถ€ LoadBalancer ์ œ๊ณต
    • Pod Selector๋กœ ๋Œ€์ƒ Pod ์ง€์ •
  4. Ingress
    • HTTP/HTTPS ์š”์ฒญ์„ ๋ผ์šฐํŒ…
    • host + path ๊ธฐ๋ฐ˜์œผ๋กœ Service์™€ ์—ฐ๊ฒฐ
    • ์—ฌ๋Ÿฌ Ingress๊ฐ€ ๊ฒน์น˜๋ฉด ์ถฉ๋Œ ๋ฐœ์ƒ
    • Nginx Ingress Controller๊ฐ€ ํ•„์š”
  5. NodePort vs Ingress
    • NodePort: ๋‹จ์ˆœ ํฌํŠธ ๋งคํ•‘, ํ…Œ์ŠคํŠธ์šฉ
    • Ingress: ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ, ์™ธ๋ถ€ ํ†ต์‹  ์‹œ ๊ถŒ์žฅ

3๏ธโƒฃ Kubernetes ๊ด€๋ฆฌ ๋ช…๋ น์–ด

์ž‘์—… ๋ช…๋ น์–ด
๋ฆฌ์†Œ์Šค ์ƒ์„ฑ 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

4๏ธโƒฃ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ฐœ๋…

  • Pod ์•ˆ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • YAML์—์„œ env:๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ key/value ์ง€์ •
  • ์˜ˆ: SERVER_PORT, APP_ENV
  • ์ฝ”๋“œ์—์„œ System.getenv("APP_ENV") ๋“ฑ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ

5๏ธโƒฃ ์‹ค์Šต ์ค‘ ์œ ์˜ํ•  ๊ฐœ๋…

  1. Ingress ์ถฉ๋Œ ๋ฐฉ์ง€
    • ํ˜ธ์ŠคํŠธ(host) + ๊ฒฝ๋กœ(path) ์ค‘๋ณต X
    • ๊ธฐ์กด Ingress๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ƒˆ ์ด๋ฆ„/ํ˜ธ์ŠคํŠธ ์‚ฌ์šฉ
  2. Pod CrashLoopBackOff
    • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฐ”๋กœ ์ฃฝ๋Š” ์ƒํƒœ
    • ๋กœ๊ทธ ํ™•์ธ ํ•„์š” (kubectl logs / -previous)
  3. NodePort ํฌํŠธ ์ถฉ๋Œ
    • NodePort๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ์ค‘๋ณต X
    • 30000~32767 ๋ฒ”์œ„ ๋‚ด ์‚ฌ์šฉ
  4. Docker Hub ์—ฐ๋™
    • ๋ฐ˜๋“œ์‹œ docker build โ†’ docker push โ†’ kubectl Deployment image ์ˆœ์„œ
  5. ์„ค์ •์„ ํŽธ์ง‘ํ•  ๋•Œ, ๊ธฐ์กด ์„ค์ •์„ ์‚ญ์ œํ•œ ๋’ค์— yaml ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ ์ ์šฉ์‹œ์ผœ์•ผ ํ•จ
    • ์˜ˆ์‹œ : nginx-ingress.yaml ์„ค์ •์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ
    image

3. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ํ‘ธ์‹œ

3.1 Dockerfile

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

3.2 ์ด๋ฏธ์ง€ ๋นŒ๋“œ

docker build -t <DOCKER_HUB_ID>/springapp:1.0 .

3.3 Docker Hub ๋กœ๊ทธ์ธ ๋ฐ ํ‘ธ์‹œ

docker login
docker push <DOCKER_HUB_ID>/springapp:1.0

4. Kubernetes ์„ ์–ธํ˜• YAML (ํ™˜๊ฒฝ๋ณ€์ˆ˜ + Ingress ์ถฉ๋Œ ๋ฐฉ์ง€)

4.1 Deployment (deploy.yaml)

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

4.2 Ingress (ingress.yaml)

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๋ฅผ ํ•ญ์ƒ ์ƒˆ๋กœ ์ง€์ •ํ•ด์„œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜์„ธ์š”.


5. Kubernetes ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ / ๊ด€๋ฆฌ / ์‚ญ์ œ

# ์ƒ์„ฑ
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
2image

6. ์™ธ๋ถ€ ํ†ต์‹  ํ™•์ธ

6.1 NodePort ์ ‘์†

๋ธŒ๋ผ์šฐ์ € / Postman:

http://<ํด๋Ÿฌ์Šคํ„ฐ๋…ธ๋“œIP>:30090

6.2 Ingress ์ ‘์†

  1. ๋กœ์ปฌ PC /etc/hosts ์ˆ˜์ •: ๋„๋ฉ”์ธ ๋“ฑ๋ก
<ํด๋Ÿฌ์Šคํ„ฐ๋…ธ๋“œIP> springapp01.local
  1. ๋ธŒ๋ผ์šฐ์ € / Postman:
http://springapp01.local
3image

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •