์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์ ์๋น์ค์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ ์ QA ๊ฒ์ฆ ๊ณผ์ ์ ๊ฑฐ์น ๊ฒ์ด๋ค. ๊ฒ์ฆ ๊ณผ์ ์ค์ ๋ฐ์ํ ์ด์์ ์์ธ์ ํ์ธ ํ๊ธฐ ์ํด์ ๋๋ก๋ ์ถ๊ฐ์ ์ธ ๋ก๊ทธ๋ฅผ ์ฝ๋์ ์ถ๊ฐํด์ ๋ค์ ํ ์คํธ ํ๊ฒฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ ํ์ ๋ก๊ทธ ๋ด์ฉ์ ํ์ธํ๋ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ถ๊ฐํ ๋ก๊ทธ๋ฅผ ํตํด์๋ ๋ช ํํ ์์ธ ํ์ ์ด ์๋๋ค๋ฉด? ๋ ๋ค์ ์์ฌ๋๋ ๋ถ๋ถ์ ์ฐพ์์ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ ๋ ๋ฐฐํฌํด์ ํ์ธํ๊ณ … ์๊ฐ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์ผ์ ๋ฅ๋ฅ ์ธก๋ฉด์์ ๋งค์ฐ ๋นํจ์จ์ ์ด ์๋ ์ ์๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ํ ์คํธ ํ๊ฒฝ์์ ์ด๋ฌํ ๋นํจ์จ์ ๋จ๋ฒํด ํด๊ฒฐํ ์ ์๋ Remote Debugging ์ ์ ์ฉํ์ฌ Pod ๋ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ปฌ์์ ๋๋ฒ๊น ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ์ ํ๋ค. (ft. IntelliJ)
์ฌ์ ์กฐ๊ฑด
์๊ฒฉ ๋๋ฒ๊น (Remote Debugging)์ ์ํด์๋ ๋ก์ปฌ์์ ํ์ฌ ๋น๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ฒ์ ์ ์ฉ๋์ด์ผ ํ๋ค. ๋ง์ฝ ๋ก์ปฌ ์ฝ๋์ ์๋ฒ์ ์ ์ฉ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฒ์ ์ด ๋ค๋ฅด๋ค๋ฉด ์ฐ์ ๋ก์ปฌ ์ฝ๋๋ฅผ ๋น๋ํ์ฌ ํ ์คํธ ํ๊ฒฝ์ ๋ฐฐํฌ๋ฅผ ํด์ผ ํ๋ ์์ ์ด ํ๋ฒ์ ํ์ํ๋ค.
Remote Debugging ์ค์ ์ต์
์๊ฒฉ ๋๋ฒ๊น ์ ์ํด์๋ ํด๋ผ์ด์ธํธ์ ํ๋ก์ ํธ์ ๋๋ฒ๊ฑฐ๊ฐ ๋๋ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฒฉ ๋๋ฒ๊น ์ ์ํ ์ฃผ๋ฌธ์ ๊ฑธ์ด์ผ ํ๋๋ฐ ๋ค์๊ณผ ๊ฐ๋ค.
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005Plaintext์ ์ต์ ์ java ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ์ต์ ์ผ๋ก ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
- -agentlib: JVM์๊ฒ ๋ค์ดํฐ๋ธ ์์ด์ ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํ๋ผ๋ JVM ํ์ค ํ๋๊ทธ๋ค. ์ฝ๊ฒ ๋งํด ์๋ฐ ์คํ์ ํน์ ๊ธฐ๋ฅ์ ๋ณด์กฐ ํ๋ก๊ทธ๋จ์ผ๋ก ๊ฐ์ด ๋์ฐ๋ผ๋ ๋ป์ด๋ค.
- jdwp: ๋ก๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ์ด๋ค. Java Debug Wire Protocol์ ์ฝ์๋ค. IDE(IntelliJ ๋ฑ)์ ์คํ ์ค์ธ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ด์์ ํต์ ๊ท์ฝ(ํ๋กํ ์ฝ)์ ๋ด๋นํ๋ค.
- transport=dt_socket: ๋๋ฒ๊ฑฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ผ ํต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
- server=y: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ฒ ์ญํ ์ ํ์ฌ ๋๋ฒ๊ฑฐ(IDE)์ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ค๋ ๋ป์ด๋ค.
- suspend=n: ๋๋ฒ๊ฑฐ๊ฐ ์ฐ๊ฒฐ๋ ๋๊น์ง ์ ํ๋ฆฌ์ผ์ด์
์คํ์ ์ผ์ ์ ์งํ ์ง ์ ํ๋ ์ต์
์ด๋ค. y๋ ์ผ์ ์ ์ง๋ฅผ ํ๊ณ n์ ๋ฉ์ถ์ง ์๊ณ ๋ฐ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์์ํ๋ค. ๋ถํ
์์ ์ ์๋ฌ๋ฅผ ์ก์ ๋ y๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ํ์์ ์ด๋ค. ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ n์ผ๋ก ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค.
(suspend=y ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ livenessProbe๋ readinessProbe๊ฐ ์คํจํ์ฌ ํ๋๊ฐ ๊ณ์ ์ฌ์์ ํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ์๋ livenessProbe, readinessProbe๋ฅผ ์ ์ ๋นํ์ฑํ ํด์ผ ํ๋ค.) - address=*:5005: 5005ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ ‘*’๋ ๋ชจ๋ IP์์ ์ ์์ ํ์ฉํ๋ค๋ ์๋ฏธ๋ค. (๋ณด์์ ์ํด์ ๋ด๋ถ๋ง์์๋ง ์ฌ๋ ๊ฒ์ด ์ข๋ค)
Remote Debugging IDE(IntelliJ) ์ค์
Remote Debugging (์๊ฒฉ ๋๋ฒ๊น ) ์ํ IntelliJ ์ค์ ์ ์์๋ณด์. IntelliJ ์ค์ ์ ๋งค์ฐ ๊ฐ๋จํ๋ค. ๋๋ฒ๊น ํ๊ณ ์ ํ๋ ํ๋ก์ ํธ๋ฅผ ์ด์ด์ ์๊ฒฉ ๋๋ฒ๊น ์ค์ (Remote JVM Debug)์ ์ถ๊ฐ ํ๋ฉด ๋๋ค.
Run/Debug Configurations(Edit Configurations) >> '+' ์ ํ >> Remote JVM DebugPlaintext์ ์์๋ก Remote JVM Debug ์ค์ ์ ์ถ๊ฐํ ์ ์๋ค.

Remote JVM Debug Configuration์ ์ถ๊ฐํ๋ฉด ‘Command line arguments for remote JVM’ ํญ๋ชฉ์ ์๋์ผ๋ก ์
๋ ฅ๋๋ค. ํน๋ณํ ์ผ ์์ผ๋ฉด ๊ทธ๋ฅ ์จ๋ ๋ฌด๋ฐฉํ๋ค.
Host ์ ๋ณด๋ ๋ง์ฝ Pod์ ์ ์ IP๊ฐ ์ธ๋ถ๋ก ์คํ๋ ๊ณต์ธ ์์ดํผ๋ผ๋ฉด ํด๋น ์์ดํผ๋ฅผ ์ค์ ํด ์ฃผ๋ฉด ๋๊ฒ ์ง๋ง K8s ๋ด์ ๊ฐ๋ ค์ ธ ์๋ ๊ฒฝ์ฐ localhost๋ก ์ง์ ํ๊ณ port forwarding์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
Remote Debugging ์๋ฒ (Pod) ์ค์
์ฐ๋ฆฌ๋ K8s์์ ์คํ๋๊ณ ์๋ Pod ๋ด์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ฒ๊น
ํ ๊ฒ์ด๋ฏ๋ก Pod์๋ Remote Debugging์ ์ํ ์ต์
์ ์ถ๊ฐํด ์ค์ผ ํ๋ค.
Spring Boot Image๋ JIB๋ฅผ ํตํด์ ์ด๋ฏธ์ง๋ก ๋น๋ํ๋ ๊ฒฝ์ฐ ์ด๋ฏธ์ง ๋น๋ ์์ ์ JvmFlag ์ต์
์ผ๋ก
‘-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005’ ๋ฅผ ์ถ๊ฐํด๋ ๋์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ์ด์ ํ๊ฒฝ์ ๋ฐฐํฌ๋๋ ์ด๋ฏธ์ง์ ํ
์คํธ ํ๊ฒฝ์ ๋ฐฐํฌ๋๋ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๊ฑฐ๋ ๋น๋ ์คํฌ๋ฆฝํธ ๋ด์์ ํ
์คํธ์ ํ๋ก๋์
์ผ๋ก ๋ถ๊ธฐ๋ฅผ ํด์ผํ๋ฏ๋ก ์ถ์ฒํ์ง ์๋๋ค.
๋ณดํต์ ํ
์คํธ ํ๊ฒฝ๊ณผ ์ด์ ํ๊ฒฝ์ด ๋ถ๋ฆฌ๋์ด ์๊ณ ๊ฐ๊ฐ deployment manifest๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๋ฏ๋ก ํ
์คํธ์ฉ deployment manifest์ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ๋ฌผ๋ก ๋๋ฒ๊น
์ ์ ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ์ ์ํฅ์ ์ฃผ๋ฏ๋ก ํ
์คํธ ํ๊ฒฝ์ด๋ผ๊ณ ํ๋๋ผ๋ ํญ์ Remote Debugging ์ค์ ์ ํ๊ฒฝ๋ณ์์ ๋ฃ๊ณ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํ์์์๋ง ํด๋น ์ค์ ์ ๋ฃ๊ณ ์ญ์ ํ๋ ๊ฒ์ด ์ข๊ฒ ๋ค.
์ค์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
spec > template > spec > containers ํญ๋ชฉ์ ์ฐพ์ ์๋ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
containers:
# ๋๋ฒ๊น
ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ
- env:
- name: JAVA_TOOL_OPTIONS
value: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
ports:
- containerPort: <์ ํ๋ฆฌ์ผ์ด์
์๋น์คํฌํธ>
- containerPort: 5005YAML์ฃผ์ํ ์
-agentlib ์ต์ ์ผ๋ก ๋๋ฒ๊น ์ ํ์ฑํ ํ๋ฉด ์ฑ๋ฅ์ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก livenessProbe์ readinessProbe์ initialDelaySeconds, timeoutSecond, periodSecond, failureThreshold ๊ฐ์ ๋๋ ค์ฃผ์. ์์น๊ฐ ์๊ฒ ์ค์ ๋์ด ์์ผ๋ฉด livenessProbe, readinessProbe ์คํจ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์์ ๋ ์ ์๋ค.
์๊ฒฉ ๋๋ฒ๊น ์ ๋ค ํ์ผ๋ฉด deployment manifest๋ฅผ ๊ธฐ์กด ์ค์ ์ผ๋ก ๋๋๋ฆฌ๋ ๊ฒ๋ ์์ง๋ง์!
Deployment ์ ์ฉ
deployment์ manifest๋ฅผ ์์ ํ ๋ ๋ก์ปฌ์ YAML ํ์ผ์ด ์๋ค๋ฉด ํด๋น YAML ํ์ผ์ ์์ ํ ‘kubectl apply -f <ํ์ผ๋ช >‘์ ์คํํ๊ฑฐ๋ ์ค์๊ฐ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ์์ ํ๋ ค๋ฉด ‘kubectl edit deployment <deployment ์ด๋ฆ>‘ ์ผ๋ก ์์ ํ๋ฉด ๋๋ค.
# ์ค์๊ฐ ๋ฆฌ์์ค ์์
kubectl edit deployment <deployment ์ด๋ฆ>
# ๋ก์ปฌ์ yaml์ ์์ ํ ๊ฒฝ์ฐ
kubectl apply -f <deployment ํ์ผ๋ช
>Bashkubectl edit ๋ช ๋ น์ผ๋ก deployment manifest๋ฅผ ์์ ํ ๊ฒฝ์ฐ ์ ์ฅํ๋ฉด ๋ฐ๋ก deployment๊ฐ ์ ์ฉ๋๋ค.
๋ก์ปฌ -> Debugger Port Forwarding
์์ ์ธ๊ธํ๋ฏ์ด ๋๋ฒ๊น ํ๊ณ ์ ํ๋ ํ๋(Pod)๊ฐ K8s ๋ด์ ์จ๊ฒจ์ ธ ์์ ๋๋ ๋ฐ๋ก ์ ์ํ๊ธฐ ์ด๋ ค์ฐ๋ฏ๋ก ๋ก์ปฌ์์ Debugger ๋์์ด ๋๋ Pod๋ก ์ง์ Port Forwarding ํ์ฌ ์ ์ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ด๋ค.
kubectl port-forward deployment/my-app 5005:5005Bash์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์์์ ์คํ ์ค์ธ ํ๋ ํ๋๋ฅผ ๊ณจ๋ผ์ ์ฐ๊ฒฐํด ์ค๋ค. ํ์ง๋ง ์ฌ๋ฌ๊ฐ์ Pod๊ฐ deployment๋ ๊ฒฝ์ฐ service๋ฅผ ํตํด์ ํธ๋ํฝ์ด ๋ก๋๋ฐธ๋ฐ์ฑ ๋๋ ๊ฒฝ์ฐ port forwording๋ ํ๋์ ํธ๋ํฝ์ด ๋ค์ด๊ฐ ๋๊น์ง ์๋ํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
๋ง์ฝ Postman์ผ๋ก ์ง์ ์์ฒญ์ ๋ ๋ฆด ์ ์๋ ์ํฉ์ด๋ผ๋ฉด ํน์ ํ๋๋ฅผ ํ๋ ๊ณจ๋ผ์ ์ง์ port forwarding์ ๊ฑธ์ด์ฃผ๊ณ ์๋น์ค ํฌํธ๋ port forwarding์ ๊ฑธ์ด์ฃผ๊ณ ํด๋น pod๋ก ์ง์ ํธ๋ํฝ์ด ์ ๋ฌ๋๋๋ก ํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค.
kubectl port-forward pod/my-app-xxxxxxx-xxxxx 5005:5005 8080:8080Bash์๋น์ค ํฌํธ๊ฐ 8080์ด๋ผ๊ณ ํ์ ๋ 5005 ๋๋ฒ๊ฑฐ ํฌํธ์ 8080 ์๋น์ค ํฌํธ ๋ชจ๋ port forwarding ํ๋ ๋ช
๋ น์ด๋ค.
Postman์์ http://localhost:8080/xxx/xxx์ ๊ฐ์ด ์ง์ ์์ฒญ์ ๋ ๋ ค port forwarding ๋๊ณ ์๋ Pod๋ก ์ง์ ์์ฒญ์ ๋ ๋ฆฐ๋ค.
๋์ ์๊ฐ
์๊ฒฉ ๋๋ฒ๊น ์ ํญ์ ํ์ฑํ ์ํค๋ ๊ฒ์ด ์๋ ํน์ํ ์ํฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ธ ๋งํผ ์๊ฒฉ ๋๋ฒ๊น ์ ์ํํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฅ deployment ๋๋ pod ์๋ฅผ 1๊ฐ๋ก ์ค์ ํ๊ณ ํ ์คํธ ํ๋ ๊ฒ์ด ๊น๋ํ ๊ฒ ๊ฐ๋ค.
๋๋ฒ๊น ๋ ์ธ ๊ณ
K8s deployment๊ฐ ์คํ๋ ์ดํ์ IDE(IntelliJ) ์์ ์ถ๊ฐํ๋ Remote JVM Debug๋ฅผ ์คํํ๋ฉด ๋๋ค.

์๊ฒฉ ๋๋ฒ๊น ์ฐ๊ฒฐ์ด ์ ๋์๋ค๋ฉด
Connected to the target VM, address: 'localhost:5005', transport: 'socket'Plaintext์ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ฉด ์ฐ๊ฒฐ์ ์ฑ๊ณต๋ ๊ฒ์ด๋ค. ์ด์ ๋ด ๋ก์ปฌ IDE ํ๊ฒฝ์์ ๋ง์๊ป ๋ธ๋ ์ดํฌ ํฌ์ธํธ ์ก๊ณ ํ์ธํด ๋ณด์!!
์ง๊ธ๊น์ง ์๊ฒฉ ๋๋ฒ๊น
๋ฐฉ๋ฒ์ ๋ํด์ ์ ๋ฆฌํด ๋ณด์๋ค. K8s ํ๊ฒฝ์์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃจ์์ง๋ง ์ด๋ ์จํ๋ ๋ฏธ์ค ํ๊ฒฝ์์๋ ๋์ผํ๊ฒ ์ ์ฉํ ์ ์๋ค. ์๋ฒ์์ ์ ํ๋ฆฌ์ผ์ด์
๊ธฐ๋ ์คํฌ๋ฆฝํธ์ ๋ง๋ฒ๊ฐ์
‘-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005’
์ต์
์ ์ถ๊ฐํด ์ฃผ๋ฉด ๋๋ค. ๋ฌผ๋ก ์ด ๊ฒฝ์ฐ์๋ ๋ฐฉํ๋ฒฝ์ 5005 ํฌํธ๊ฐ ๋งํ์์ง ์์์ง ํ์ธ์ด ํ์ํ ๊ฒ์ด๋ค.
์๊ฒฉ ๋๋ฒ๊น
์ ์์ธ์ ์ฐพ๊ธฐ ์ด๋ ค์ด ์ด์๊ฐ ๋ฐ์ํ์ ๋ ์ฐ๋ฆฌ์ ์๊ฐ์ ์๋นํ ์ ์ฝํด ์ฃผ๋ ์ข์ ๋๊ตฌ๊ฐ ๋ ๊ฒ์ด๋ค.
