Kubernetes

Pod μ•ˆμ „ν•˜κ²Œ 생성/배포 및 QoS μ •μ±… μ„€μ •

uuuhhh 2022. 11. 10. 16:57

πŸ“ Epilogue


  • κ°„λ‹¨ν•œ JAR μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 가지고 μΏ λ²„λ„€ν‹°μŠ€ νŒŒλ“œ 배포λ₯Ό μ‹œλ„ν•˜μ˜€λ‹€ !
  • 그런데 νŒŒλ“œ μƒνƒœκ°€.. μ—„μ²­λ‚œ λ©”λͺ¨λ¦¬ λΆ€μ‘±..
    • OOM Killed.. CrashLoopBackOff μƒνƒœ 반볡..
  • νŒŒλ“œ μŠ€νŽ™ 늘리고 λ‹€μ‹œ λ°°ν¬ν•˜λ‹ˆ 정상 μƒνƒœ !
  • κ·Έλž˜μ„œ μ—¬κΈ°μ„œ 의문점 ❗️
    • μ»¨ν…Œμ΄λ„ˆ μžμ› μŠ€νŽ™μ„ μ •ν•  λ•Œ μ–΄λ–€ κΈ°μ€€/μ „λž΅ λ˜λŠ” μ˜΅μ…˜μ΄ μžˆμ„κΉŒ?
    • λ˜λŠ” Stableν•œ 배포 μ „λž΅μ΄ μžˆμ„κΉŒ?

 

β–ͺ︎ Plan


  1. νŒŒλ“œμ— μ μ ˆν•œ μžμ› 할당을 톡해 μ•ˆμ •λœ μ„œλΉ„μŠ€ ν’ˆμ§ˆ(QoS) κ΅¬μ„±ν•˜κΈ°
  2. Probe κΈ°λŠ₯을 톡해 μ•ˆμ •μ μΈ Pod Life-Cycle 보μž₯ν•˜κΈ°

 

β–ͺ︎ μ„œλΉ„μŠ€ ν’ˆμ§ˆ (QoS)


  • νŒŒλ“œμ— νŠΉμ •ν•œ μ„œλΉ„μŠ€ ν’ˆμ§ˆ(QoS) 클래슀λ₯Ό ν• λ‹Ήν•΄ 쀄 수 μžˆλ‹€.
    • Guaranteed
    • Burstable
    • BestEffort
  • νŒŒλ“œμ˜ QoS 클래슀λ₯Ό 톡해 μΏ λ²„λ„€ν‹°μŠ€λŠ” νŒŒλ“œ μŠ€μΌ€μ€„λ§κ³Ό μΆ•μΆœμ„ κ²°μ •ν•œλ‹€.

 

β–ͺ︎ Guaranteed QoS 클래슀


  • Guaranteed QoS 클래슀 할당을 μœ„ν•œ 쑰건
    • νŒŒλ“œ λ‚΄ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλŠ” [λ©”λͺ¨λ¦¬ μƒν•œ & μš”μ²­λŸ‰] & [CPU μƒν•œ & μš”μ²­λŸ‰]을 가지고 μžˆμ–΄μ•Ό ν•œλ‹€.
    • νŒŒλ“œ λ‚΄ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλŠ” [λ©”λͺ¨λ¦¬ (μƒν•œ = μš”μ²­λŸ‰)] & [CPU (μƒν•œ = μš”μ²­λŸ‰)] 이어야 ν•œλ‹€.
apiVersion: v1
kind: Pod
metadata:
  name: cn-app-pod
  labels:
    name: cn-app-pod
spec:
  containers:
  - name: cn-app
    image: uh2959/cn-action
    resources:
      limits:
        cpu: 500m
        memory: 512Mi
      requests:
        cpu: 500m
        memory: 512Mi

 

  • μœ„ μž‘μ„±ν•œ λ§€λ‹ˆνŽ˜μŠ€νŠΈλ‘œ pod 생성 !

 

  • QoS Classκ°€ Guaranteed둜 ν• λ‹Ήλœ 것을 확인 !

 

πŸ’‘ λ§Œμ•½ μ»¨ν…Œμ΄λ„ˆμ˜ μŠ€νŽ™μ— λ©”λͺ¨λ¦¬ λ˜λŠ” CPU의 μƒν•œμ„±(limits)만 μ§€μ •ν•˜μ˜€μ„ 경우
     → ν•΄λ‹Ή μ§€μ •ν•œ λ©”λͺ¨λ¦¬λ‚˜ CPU의 μƒν•œμ„±(limits)κ³Ό λ™μΌν•˜κ²Œ μš”μ²­λŸ‰(requests)을 μžλ™μœΌλ‘œ ν• λ‹Ήν•΄μ€€λ‹€.

 

 

β–ͺ︎ Burstable QoS 클래슀


  • Burstable QoS 클래슀 할당을 μœ„ν•œ 쑰건
    • νŒŒλ“œκ°€ Guaranteed QoS 클래슀 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ” 경우
    • νŒŒλ“œ λ‚΄ μ΅œμ†Œ ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆκ°€ [λ©”λͺ¨λ¦¬ μƒν•œ & μš”μ²­λŸ‰] λ˜λŠ” [CPU μƒν•œ & μš”μ²­λŸ‰]을 가지고 μžˆλŠ” 경우
apiVersion: v1
kind: Pod
metadata:
  name: cn-app-pod
  labels:
    name: cn-app-pod
spec:
  containers:
  - name: cn-app
    image: uh2959/cn-action
    resources:
      limits:
        cpu: 500m
      requests:
        cpu: 300m

 

  • μœ„ μž‘μ„±ν•œ λ§€λ‹ˆνŽ˜μŠ€νŠΈ 파일둜 pod 생성 ν›„ Qos Classκ°€ Burstable둜 ν• λ‹Ήλœ 것을 확인 !

 

 

β–ͺ︎ BestEffort QoS 클래슀


  • BestEffort QoS 클래슀 할당을 μœ„ν•œ 쑰건
    • νŒŒλ“œ λ‚΄ μ»¨ν…Œμ΄λ„ˆμ— [λ©”λͺ¨λ¦¬ μƒν•œ & μš”μ²­λŸ‰] λ˜λŠ” [CPU μƒν•œ & μš”μ²­λŸ‰]이 μ—†λŠ” 경우
apiVersion: v1
kind: Pod
metadata:
  name: cn-app-pod
  labels:
    name: cn-app-pod
spec:
  containers:
  - name: cn-app
    image: uh2959/cn-action

 

  • μœ„ μž‘μ„±ν•œ λ§€λ‹ˆνŽ˜μŠ€νŠΈ 파일둜 pod 생성 ν›„ Qos Classκ°€ BestEffort둜 ν• λ‹Ήλœ 것을 확인 !

 

 

 

β–ͺ︎ Probe


  • λ§Œμ•½ νŒŒλ“œκ°€ μ™„λ²½ν•˜κ²Œ 배포가 λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ νŠΈλž˜ν”½ μš”μ²­μ΄ λ“€μ–΄κ°„ 상황인 경우 ?
    • νŒŒλ“œκ°€ ν˜„μž¬ μš”μ²­μ„ 받을 수 μžˆλŠ” μƒνƒœμΈμ§€ 확인이 ν•„μš”ν•˜λ‹€ !
    • νŒŒλ“œμ˜ μƒνƒœλ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•΄ ν”„λ‘œλΈŒ(Probe)λ₯Ό μ‚¬μš©ν•œλ‹€.
  • ν”„λ‘œλΈŒλž€ μ»¨ν…Œμ΄λ„ˆμ—μ„œ kubelet에 μ˜ν•΄ 주기적으둜 μˆ˜ν–‰λ˜λŠ” 진단이닀.
    • 진단 : μ»¨ν…Œμ΄λ„ˆ μ•ˆμ—μ„œ μ½”λ“œ μˆ˜ν–‰ / λ„€νŠΈμ›Œν¬ μš”μ²­ 전솑
  • ν”„λ‘œλΈŒλŠ” 총 μ„Έ 가지 μ’…λ₯˜κ°€ μ‘΄μž¬ν•œλ‹€.
    • livenessProbe
    • readinessProbe
    • startupProbe

 

 

β–ͺ︎ livenessProbe


  • ν™œμ„± ν”„λ‘œλΈŒ
  • μ»¨ν…Œμ΄λ„ˆκ°€ λ™μž‘ 쀑인지 μ—¬λΆ€ 확인
  • λ§Œμ•½ Failureμ‹œ, kubelet은 μ»¨ν…Œμ΄λ„ˆλ₯Ό 죽이고 ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆλŠ” μž¬μ‹œμž‘
  • livenessProbe λ―Έμ„€μ • μ‹œ, κΈ°λ³Έ μƒνƒœλŠ” Success

 

β–ͺ︎ readinessProbe


  • μ€€λΉ„μ„± ν”„λ‘œλΈŒ
  • μ»¨ν…Œμ΄λ„ˆκ°€ μš”μ²­μ„ μ²˜λ¦¬ν•  μ€€λΉ„κ°€ λ˜μ—ˆλŠ”μ§€ μ—¬λΆ€ 확인
  • λ§Œμ•½ Failure, Endpoint Controller은 νŒŒλ“œμ— μ—°κ²°λœ λͺ¨λ“  μ„œλΉ„μŠ€λ“€μ˜ μ—”λ“œν¬μΈνŠΈμ—μ„œ νŒŒλ“œ IP μ£Όμ†Œ 제거
  • ⇒ νŠΈλž˜ν”½ μ „λ‹¬ν•˜μ§€ μ•ŠμŒ
  • readinessProbe 초기 지연 이전 κΈ°λ³Έ μƒνƒœλŠ” Failure
  • readinessProbe λ―Έμ„€μ • μ‹œ, κΈ°λ³Έ μƒνƒœλŠ” Success

 

β–ͺ︎ startupProbe


  • μŠ€νƒ€νŠΈμ—… ν”„λ‘œλΈŒ
  • μ»¨ν…Œμ΄λ„ˆ λ‚΄μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ˜μ—ˆλŠ”μ§€ μ—¬λΆ€ 확인
  • startupProbeκ°€ success 될 λ•Œ κΉŒμ§€ λ‹€λ₯Έ λ‚˜λ¨Έμ§€ ν”„λ‘œλΈŒλŠ” ν™œμ„± X
  • λ§Œμ•½ Failureμ‹œ, kubelet은 μ»¨ν…Œμ΄λ„ˆλ₯Ό 죽이고 ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆλŠ” μž¬μ‹œμž‘
  • startupProbe λ―Έμ„€μ • μ‹œ, κΈ°λ³Έ μƒνƒœλŠ” Success

 

 

 

 

Ref.


νŒŒλ“œμ— λŒ€ν•œ μ„œλΉ„μŠ€ ν’ˆμ§ˆ(QoS) ꡬ성

νŒŒλ“œ 라이프사이클

K8S ν™˜κ²½μ—μ„œ pod을 μ•ˆμ „ν•˜κ²Œ λ°°ν¬ν•˜λŠ” 방법