π‘ μμλλ©΄ μ’μ μ
--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