πŸ§ͺ Kubernetes 디버깅 & ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ ν•„μˆ˜ νŒŒλ“œ(Pod) μ‹€ν–‰ μ˜ˆμ‹œ 9κ°€μ§€

57 sec read


πŸ’‘ μ•Œμ•„λ‘λ©΄ 쒋은 점

--restart=Never: μΌνšŒμ„± μž‘μ—…μ„ μœ„ν•œ νŒŒλ“œ(Pod)λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ””ν”Œλ‘œμ΄λ¨ΌνŠΈ(Deployment)κ°€ μ•„λ‹ˆλ―€λ‘œ νŒŒλ“œκ°€ μ’…λ£Œλ˜μ–΄λ„ λ‹€μ‹œ μ‹œμž‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • --rm: νŒŒλ“œμ— 접속(attach)ν•œ μ„Έμ…˜μ΄ μ’…λ£Œλ˜λ©΄ νŒŒλ“œλ₯Ό μžλ™μœΌλ‘œ μ‚­μ œν•΄ μ€λ‹ˆλ‹€. μž„μ‹œ ν…ŒμŠ€νŠΈμ— μœ μš©ν•©λ‹ˆλ‹€.
  • -i --tty: μ»¨ν…Œμ΄λ„ˆμ˜ ν‘œμ€€ μž…λ ₯(stdin)κ³Ό 터미널(tty)을 ν™œμ„±ν™”ν•˜μ—¬ μ…Έκ³Ό 같은 λŒ€ν™”ν˜• μ„Έμ…˜μ„ μ‚¬μš©ν•  수 있게 ν•©λ‹ˆλ‹€.

1. κ°€μž₯ 기본적인 ν…ŒμŠ€νŠΈ: λ‹¨μˆœ μ…Έ 접속

κ°€μž₯ κΈ°λ³Έμ μ΄λ©΄μ„œλ„ 많이 μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. ν΄λŸ¬μŠ€ν„° λ‚΄λΆ€μ—μ„œ νŠΉμ • IP둜 톡신이 κ°€λŠ₯ν•œμ§€ ν™•μΈν•˜κ±°λ‚˜ κ°„λ‹¨ν•œ 파일 λ‹€μš΄λ‘œλ“œλ₯Ό ν…ŒμŠ€νŠΈν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

πŸ”Ή μ‚¬μš© 이미지: busybox

πŸ“ μ„€λͺ…:
busyboxλŠ” λ‹€μ–‘ν•œ κΈ°λ³Έ μœ λ‹‰μŠ€ 도ꡬ(sh, ping, wget, nslookup λ“±)λ₯Ό ν¬ν•¨ν•œ μ΄ˆκ²½λŸ‰ μ΄λ―Έμ§€μž…λ‹ˆλ‹€. νŒŒλ“œλ₯Ό μ‹€ν–‰ν•œ ν›„ kubectl exec λͺ…λ Ήμ–΄λ‘œ μ ‘μ†ν•˜μ—¬ ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 1μ‹œκ°„(3600초) λ™μ•ˆ μ‹€ν–‰λ˜λŠ” 'test' νŒŒλ“œ 생성
kubectl run test --image=busybox --restart=Never -- sleep 3600

# μƒμ„±λœ νŒŒλ“œμ— μ…Έ(sh)둜 접속
kubectl exec -it test -- sh

2. κ°•λ ₯ν•œ λ„€νŠΈμ›Œν¬ 디버깅 툴 μ‚¬μš©

pingμ΄λ‚˜ wgetλ§ŒμœΌλ‘œλŠ” λΆ€μ‘±ν•œ λ³΅μž‘ν•œ λ„€νŠΈμ›Œν¬ 문제λ₯Ό 진단해야 ν•  λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. netshoot μ΄λ―Έμ§€λŠ” λ„€νŠΈμ›Œν¬ μ „λ¬Έκ°€λ₯Ό μœ„ν•œ 거의 λͺ¨λ“  도ꡬλ₯Ό κ°–μΆ”κ³  μžˆμŠ΅λ‹ˆλ‹€.

πŸ”Ή μ‚¬μš© 이미지: nicolaka/netshoot

πŸ“ μ„€λͺ…:
tcpdump, dig, traceroute, curl λ“± κ°•λ ₯ν•œ λ„€νŠΈμ›Œν¬ 진단 도ꡬ가 λͺ¨λ‘ ν¬ν•¨λ˜μ–΄ μžˆμ–΄ νŒŒλ“œ κ°„ 톡신, DNS 문제, μ™ΈλΆ€ μ—°κ²° 이슈 등을 λ””λ²„κΉ…ν•˜λŠ” 데 μ΅œμ μž…λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 'netshoot' νŒŒλ“œλ₯Ό λŒ€ν™”ν˜• λͺ¨λ“œλ‘œ μ‹€ν–‰ν•˜κ³  λ°”λ‘œ bash μ…Έλ‘œ 접속
# μ„Έμ…˜ μ’…λ£Œ μ‹œ νŒŒλ“œλŠ” μžλ™ μ‚­μ œλ¨ (--rm)
kubectl run netshoot --rm -i --tty --image=nicolaka/netshoot -- bash

3. curl ν…ŒμŠ€νŠΈ μ „μš© μ΄ˆκ²½λŸ‰ νŒŒλ“œ

λ‹¨μˆœνžˆ HTTP/HTTPS μš”μ²­λ§Œ 보내 μƒνƒœ μ½”λ“œλ‚˜ 응닡을 ν™•μΈν•˜κ³  싢을 λ•Œ, busyboxλ‚˜ netshoot은 쑰금 무겁게 느껴질 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•ŒλŠ” curl μ „μš© 이미지λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 νš¨μœ¨μ μž…λ‹ˆλ‹€.

πŸ”Ή μ‚¬μš© 이미지: curlimages/curl

πŸ“ μ„€λͺ…:
였직 curl λͺ…λ Ήμ–΄ μ‹€ν–‰λ§Œμ„ μœ„ν•΄ λ§Œλ“€μ–΄μ§„ 맀우 μž‘κ³  κ°€λ²Όμš΄ μ΄λ―Έμ§€μž…λ‹ˆλ‹€. λΉ λ₯΄κ²Œ νŒŒλ“œλ₯Ό λ„μ›Œ API μš”μ²­ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•  λ•Œ μ ν•©ν•©λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 'curl-pod'λ₯Ό μƒμ„±ν•˜κ³  1μ‹œκ°„ λ™μ•ˆ μœ μ§€
kubectl run curl-pod --image=curlimages/curl --restart=Never -- sleep 3600

# curl-pod λ‚΄λΆ€μ—μ„œ νŠΉμ • μ„œλΉ„μŠ€(myservice)둜 μš”μ²­ 보내기
kubectl exec curl-pod -- curl http://myservice.default.svc.cluster.local

4. κ°„λ‹¨ν•œ HTTP μ„œλ²„ 직접 μ‹€ν–‰ν•˜κΈ°

ν΄λŸ¬μŠ€ν„° λ‚΄λΆ€μ˜ λ‹€λ₯Έ νŒŒλ“œμ—μ„œ ν˜„μž¬ νŒŒλ“œλ‘œμ˜ μš”μ²­μ΄ 잘 λ“€μ–΄μ˜€λŠ”μ§€ ν…ŒμŠ€νŠΈν•˜κ³  싢을 λ•Œ, κ°„λ‹¨ν•œ μ›Ή μ„œλ²„λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ”Ή μ‚¬μš© 이미지: python:3.12-slim

πŸ“ μ„€λͺ…:
Python ν‘œμ€€ 라이브러리λ₯Ό μ΄μš©ν•˜λ©΄ ν•œ 쀄 λͺ…λ Ήμ–΄λ‘œ κ°„λ‹¨ν•œ HTTP μ„œλ²„λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. python:slim 이미지λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λ³κ²Œ ꡬ성 κ°€λŠ₯ν•©λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 5000번 포트둜 HTTP μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜λŠ” 'myserver' νŒŒλ“œ 생성
kubectl run myserver --image=python:3.12-slim --restart=Never --expose --port=5000 --command -- python -m http.server 5000

# --expose μ˜΅μ…˜μœΌλ‘œ ClusterIP νƒ€μž…μ˜ μ„œλΉ„μŠ€κ°€ ν•¨κ»˜ μƒμ„±λ©λ‹ˆλ‹€.

5. ν…ŒμŠ€νŠΈ μ„œλ²„λ₯Ό μ„œλΉ„μŠ€(Service)둜 λ…ΈμΆœν•˜κΈ°

μœ„μ—μ„œ λ§Œλ“  myserver와 같이 νŒŒλ“œλ₯Ό μƒμ„±λ§Œ ν•˜λ©΄ ν΄λŸ¬μŠ€ν„° λ‚΄ λ‹€λ₯Έ νŒŒλ“œλ“€μ΄ κ³ μ •λœ μ£Όμ†Œλ‘œ μ ‘κ·Όν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 이럴 λ•Œ Serviceλ₯Ό μƒμ„±ν•˜μ—¬ λ‚΄λΆ€ DNS 이름을 λΆ€μ—¬ν•˜κ³  접근성을 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ μ„€λͺ…:
kubectl expose λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ 이미 μ‹€ν–‰ 쀑인 νŒŒλ“œλ₯Ό μ†μ‰½κ²Œ Service둜 λ…ΈμΆœμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. ClusterIP νƒ€μž…μ€ ν΄λŸ¬μŠ€ν„° λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•œ 고유 IPλ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 'myserver' νŒŒλ“œλ₯Ό 5000번 포트둜 λ…ΈμΆœν•˜λŠ” ClusterIP νƒ€μž…μ˜ μ„œλΉ„μŠ€ 생성
# (λ§Œμ•½ 4번 μ˜ˆμ œμ—μ„œ --expose μ˜΅μ…˜μ„ μ“°μ§€ μ•Šμ•˜λ‹€λ©΄ 이 λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ„Έμš”)
kubectl expose pod myserver --type=ClusterIP --port=5000

6. κ°„λ‹¨ν•œ TCP μ„œλ²„ ν…ŒμŠ€νŠΈ

HTTPκ°€ μ•„λ‹Œ 순수 TCP 톡신을 ν…ŒμŠ€νŠΈν•΄μ•Ό ν•  λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. netcat(nc)을 μ΄μš©ν•˜λ©΄ κ°„λ‹¨ν•œ TCP λ¦¬μŠ€λ‹ μ„œλ²„λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ”Ή μ‚¬μš© 이미지: appropriate/nc

πŸ“ μ„€λͺ…:
λ°©ν™”λ²½ κ·œμΉ™μ΄λ‚˜ λ„€νŠΈμ›Œν¬ μ •μ±…(NetworkPolicy)이 TCP νŠΈλž˜ν”½μ„ μ˜¬λ°”λ₯΄κ²Œ ν—ˆμš©ν•˜λŠ”μ§€ 확인할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€. μ§€μ •λœ ν¬νŠΈμ—μ„œ 연결을 κΈ°λ‹€λ¦¬λŠ” μ„œλ²„λ₯Ό μ¦‰μ‹œ μƒμ„±ν•©λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 1234번 ν¬νŠΈμ—μ„œ TCP 연결을 κΈ°λ‹€λ¦¬λŠ” 'nc-server' νŒŒλ“œ 생성
kubectl run nc-server --image=appropriate/nc --restart=Never -i --tty -- sh -c "nc -lkp 1234"

7. DNS 해석(Resolution) μ „λ¬Έ ν…ŒμŠ€νŠΈ

μΏ λ²„λ„€ν‹°μŠ€μ—μ„œ κ°€μž₯ ν”ν•œ 문제 쀑 ν•˜λ‚˜λŠ” DNS 해석 λ¬Έμ œμž…λ‹ˆλ‹€. CoreDNSκ°€ μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ”μ§€, μ„œλΉ„μŠ€ 이름이 IP둜 잘 λ³€ν™˜λ˜λŠ”μ§€ 확인할 λ•Œ νŠΉν™”λœ 도ꡬλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ”Ή μ‚¬μš© 이미지: infoblox/dnstools

πŸ“ μ„€λͺ…:
dig, nslookup, host λ“± DNS 진단에 ν•„μš”ν•œ λͺ¨λ“  도ꡬ가 ν¬ν•¨λ˜μ–΄ μžˆμ–΄ μ„œλΉ„μŠ€ λ””μŠ€μ»€λ²„λ¦¬ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 큰 도움이 λ©λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 'dnstools' νŒŒλ“œ 생성 ν›„ 1μ‹œκ°„ λ™μ•ˆ μœ μ§€
kubectl run dnstools --image=infoblox/dnstools --restart=Never -- sleep 3600

# μƒμ„±λœ νŒŒλ“œμ—μ„œ ꡬ글 DNS μ„œλ²„μ— λŒ€ν•΄ nslookup μ‹€ν–‰
kubectl exec dnstools -- nslookup google.com

8. κ°„λ‹¨ν•œ HTTP λΆ€ν•˜ ν…ŒμŠ€νŠΈ

μƒˆλ‘œμš΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•œ ν›„ κ°„λ‹¨ν•˜κ²Œ μ„±λŠ₯을 μ κ²€ν•˜κ³  싢을 λ•Œ, heyλΌλŠ” κ²½λŸ‰ λΆ€ν•˜ ν…ŒμŠ€νŠΈ 도ꡬλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ”Ή μ‚¬μš© 이미지: rakyll/hey

πŸ“ μ„€λͺ…:
heyλŠ” Go둜 μž‘μ„±λœ κ°„λ‹¨ν•œ λΆ€ν•˜ μƒμ„±κΈ°μž…λ‹ˆλ‹€. λ³„λ„μ˜ λ³΅μž‘ν•œ μ„€μ • 없이 ν΄λŸ¬μŠ€ν„° λ‚΄λΆ€μ—μ„œ νŠΉμ • μ„œλΉ„μŠ€μ— νŠΈλž˜ν”½μ„ 보내 응닡 μ‹œκ°„, 성곡λ₯  등을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 'hey' 도ꡬλ₯Ό μ‚¬μš©ν•  νŒŒλ“œ 생성
kubectl run hey --image=rakyll/hey --restart=Never -- sleep 3600

# 'hey' νŒŒλ“œμ—μ„œ myserver μ„œλΉ„μŠ€μ— 10μ΄ˆκ°„, 10개의 λ™μ‹œ μ—°κ²°λ‘œ λΆ€ν•˜ ν…ŒμŠ€νŠΈ
kubectl exec hey -- hey -z 10s -c 10 http://myserver:5000

9. λ¦¬μ†ŒμŠ€ 슀트레슀 ν…ŒμŠ€νŠΈ (CPU/Memory)

νŒŒλ“œμ˜ resources.limits와 requests 섀정이 μ˜¬λ°”λ₯΄κ²Œ λ™μž‘ν•˜λŠ”μ§€, ν˜Ήμ€ λ…Έλ“œμ— λΆ€ν•˜λ₯Ό μ£Όμ–΄ μ˜€ν† μŠ€μΌ€μΌλ§(HPA)이 잘 μž‘λ™ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

πŸ”Ή μ‚¬μš© 이미지: alpine/stress

πŸ“ μ„€λͺ…:
stress-ng 도ꡬλ₯Ό ν¬ν•¨ν•œ μ΄λ―Έμ§€λ‘œ, CPU, λ©”λͺ¨λ¦¬, I/O λ“± μ‹œμŠ€ν…œμ— μ˜λ„μ μœΌλ‘œ λΆ€ν•˜λ₯Ό λ°œμƒμ‹œμΌœ ν•œκ³„ 상황을 ν…ŒμŠ€νŠΈν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ’» μ‹€ν–‰ λͺ…λ Ήμ–΄:

# 1개의 CPU 코어에 30초 λ™μ•ˆ λΆ€ν•˜λ₯Ό μ£ΌλŠ” 'stress' νŒŒλ“œ 생성
kubectl run stress --image=alpine/stress --restart=Never -- --cpu 1 --timeout 30s

μΏ λ²„λ„€ν‹°μŠ€ μ‹œν¬λ¦Ώ 관리, μ–΄λ–€ 방법이 μ΅œμ„ μΌκΉŒ? 4κ°€μ§€ 방식 μž₯단점…

μΏ λ²„λ„€ν‹°μŠ€μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μš΄μ˜ν•  λ•Œ, DB 접속 μ •λ³΄λ‚˜ API ν‚€ 같은 λ―Όκ°ν•œ 정보, 즉 ‘μ‹œν¬λ¦Ώ(Secret)’을 μ–΄λ–»κ²Œ 관리해야 ν• μ§€λŠ” λͺ¨λ‘μ˜ κ³΅ν†΅λœ κ³ λ―Όμž…λ‹ˆλ‹€. 관리 방식은 λ³΄μ•ˆ, 운영...
eve
13 sec read

[MSA] Spring Cloud Gateway VS Apache APISIX : 단계별…

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜(MSA)μ—μ„œ API κ²Œμ΄νŠΈμ›¨μ΄λŠ” μ‹œμŠ€ν…œμ˜ κ΄€λ¬Έ 역할을 ν•˜λŠ” 핡심 μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€. μˆ˜λ§Žμ€ Java κ°œλ°œνŒ€μ΄ Spring μƒνƒœκ³„μ™€μ˜ μ™„λ²½ν•œ 톡합성을 μžλž‘ν•˜λŠ” Spring Cloud Gatewayλ₯Ό μ„ νƒν•΄μ™”μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ‹œμŠ€ν…œμ΄...
eve
1 min read

[Kafka] μΉ΄ν”„μΉ΄μ˜ 심μž₯: ν† ν”½, νŒŒν‹°μ…˜, ν”„λ‘œλ“€μ„œ, 컨슈머 μ™„λ²½ ν•΄λΆ€

Apache Kafkaκ°€ μ–΄λ–»κ²Œ λŒ€μš©λŸ‰ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ, 그리고 μ•ˆμ •μ μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆλŠ”μ§€ κΆκΈˆν•˜μ‹ κ°€μš”? κ·Έ 비밀은 Kafkaλ₯Ό κ΅¬μ„±ν•˜λŠ” 핡심 μš”μ†Œλ“€μ˜ 유기적인 ν˜‘λ ₯에 μžˆμŠ΅λ‹ˆλ‹€. KafkaλŠ” 마치 잘...
eve
1 min read