Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Kubernetes Pod ่ฐƒๅบฆๆต็จ‹ๅ›พ๏ผˆScheduler ๆ‰ง่กŒ้กบๅบ๏ผ‰

๐Ÿงฉ ไธ€ๅผ ๅ›พ็œ‹ๆ‡‚่ฐƒๅบฆๆต็จ‹๏ผˆASCII ็‰ˆ๏ผ‰

                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                            API Server ๆŽฅๆ”ถ Pod
                           (Pod ๅค„ไบŽ Pending ็Šถๆ€)
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                          Scheduler Watch ๅˆฐๆ–ฐ Pod
                                    โ”‚
                                    โ–ผ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                                โ‘  ้ข„้€‰้˜ถๆฎต
                           (Filter / Predicate)
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ–ผ                                                โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    ่ฟ‡ๆปคๆމไธๆปก่ถณๆกไปถ็š„่Š‚็‚น
    - ่ต„ๆบไธ่ถณ๏ผˆCPU/Mem๏ผ‰                            ๆ•…้šœใ€ไธๅฏ่ฐƒๅบฆ่Š‚็‚นๅ‰”้™ค
    - ไธ็ฌฆๅˆ NodeSelector                             - Node notReady
    - ไธ็ฌฆๅˆ NodeAffinity                             - Taint ไธๅฏๅฎนๅฟ
    - ็ซฏๅฃๅ†ฒ็ช / ่ฎพๅค‡ไธๅฏ็”จ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ–ผ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                             โ‘ก ่ฏ„ๅˆ†้˜ถๆฎต๏ผˆScore๏ผ‰
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                            ๅฏนๆฏไธชๅฏ่ฐƒๅบฆ่Š‚็‚น่ฏ„ๅˆ†๏ผš
                            - Least Loaded๏ผˆ่ดŸ่ฝฝๆœ€ๅฐ๏ผ‰
                            - Selector Spread๏ผˆๅˆ†ๆ•ฃๅบฆ๏ผ‰
                            - Affinity ไผ˜ๅ…ˆ็บง
                            - Node ่ต„ๆบๅˆฉ็”จ็އ็ญ‰
                                    โ”‚
                                    โ–ผ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                            โ‘ข ้€‰ๅ‡บๅพ—ๅˆ†ๆœ€้ซ˜็š„่Š‚็‚น    
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ–ผ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                            โ‘ฃ ่ฐƒๅบฆ็ป‘ๅฎš๏ผˆBind๏ผ‰
                         Scheduler -> API Server
                             {pod: nodeName}
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ–ผ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                          Kubelet Watch ๅˆฐ Pod
                           -> ๆ‹‰้•œๅƒใ€ๅˆ›ๅปบๅฎนๅ™จ
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ–ผ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                           Pod ่ฟ›ๅ…ฅ Running ็Šถๆ€
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ”ต Pod ่ฐƒๅบฆ 4 ๅคง้˜ถๆฎต๏ผˆ1.33 ็‰ˆๆœฌ๏ผ‰

1. ้ข„้€‰้˜ถๆฎต๏ผˆFilter stage / Predicate๏ผ‰

Scheduler ไผšๆŠŠไธๆปก่ถณ่ฆๆฑ‚็š„่Š‚็‚นๆŽ’้™ค๏ผš

  • Node ๆ— ๆณ•่ฐƒๅบฆ๏ผˆNotReady / Unschedulable๏ผ‰
  • NodeSelector ไธๅŒน้…
  • NodeAffinity ไธๅŒน้…
  • Taint ไธๅฏๅฎนๅฟ
  • CPU/Memory request ไธๆปก่ถณ
  • Volume ไธๆปก่ถณ๏ผˆlocal/pvc ไธๅฏ็”จ๏ผ‰
  • PID/Device ไธๆปก่ถณ
  • HostPort ๅ†ฒ็ช
  • PodAffinity / AntiAffinity ไธๆปก่ถณ
  • RuntimeClass ไธๅ…ผๅฎน

้ข„้€‰้˜ถๆฎต็š„็ป“ๆžœ๏ผšๅ‰ฉไธ‹ๅฏ่ฐƒๅบฆ่Š‚็‚นๅˆ—่กจ

2. ่ฏ„ๅˆ†้˜ถๆฎต๏ผˆScore stage / Priority๏ผ‰

Scheduler ไผšๅฏนๆ‰€ๆœ‰ๅฏ่ฐƒๅบฆ่Š‚็‚นๆ‰“ๅˆ†๏ผš

ๅธธ่ง scoring ็ญ–็•ฅ๏ผš

  • LeastAllocated๏ผšไผ˜ๅ…ˆ้€‰ๆ‹ฉๅˆฉ็”จ็އไฝŽ็š„่Š‚็‚น
  • BalancedAllocation๏ผš้€‰ๆ‹ฉ CPU/Mem ่ถŠๅ‡่กก็š„่Š‚็‚น
  • SelectorSpread๏ผšไผ˜ๅŒ– Pod ๅˆ†ๆ•ฃๅบฆ
  • ImageLocality๏ผš้•œๅƒๆœฌๅœฐๅทฒ็ผ“ๅญ˜ -> ๅˆ†ๆ›ด้ซ˜
  • NodeAffinityPriority๏ผšๅๅฅฝ่Š‚็‚นๆ‰“ๅˆ†

ๆœ€็ปˆๅพ—ๅˆฐ๏ผš

ๆฏไธช่Š‚็‚นไธ€ไธช 0~100 ็š„ scoreใ€‚

3. ้€‰ๆ‹ฉๅพ—ๅˆ†ๆœ€้ซ˜็š„่Š‚็‚น

ๅฆ‚ๅพ—ๅˆ†็›ธๅŒ๏ผš

  • Round Robin
  • ้šๆœบๆ•ฐ seed ๅ›บๅฎš
  • ๅ—่ฐƒๅบฆๅ™จ้…็ฝฎๅฝฑๅ“

4. ่ฐƒๅบฆ็ป‘ๅฎš๏ผˆBinding๏ผ‰

Scheduler ๅฐ†็ป“ๆžœๅ†™ๅ›ž API Server๏ผš

Pod.Spec.NodeName = target-node

่‡ณๆญค๏ผŒ่ฐƒๅบฆๆต็จ‹ๅฎŒๆˆใ€‚

Pod ็Šถๆ€ -> ๅ˜ไธบ โ€œScheduledโ€ใ€‚

๐Ÿ”ต Pod ่ฐƒๅบฆๅฎŒๆˆๅŽ๏ผˆ็”ฑ Kubelet ๆŽฅ็ฎก๏ผ‰

่ฐƒๅบฆ็ป“ๆŸๅŽ๏ผŒKubelet ๅผ€ๅง‹ๆ‰ง่กŒ๏ผš

  1. ๅˆ›ๅปบ Pause ๅฎนๅ™จ๏ผˆPod Sandbox๏ผ‰
  2. ๅˆ›ๅปบ็ฝ‘็ปœๅ‘ฝๅ็ฉบ้—ด๏ผˆCNI๏ผ‰
  3. ๆ‹‰ๅ–้•œๅƒ
  4. ไพๅบๅฏๅŠจ initContainers
  5. ๅฏๅŠจ containers
  6. ๆ‰ง่กŒ liveness/readiness/startup probes
  7. Pod -> Running

๐Ÿ”ต ่ฐƒๅบฆๅคฑ่ดฅไผšๆ€Žๆ ท๏ผŸ

  • Pod ไผšไฟๆŒ Pending

  • Event ไธญไผšๅ‡บ็Žฐๅ…ทไฝ“ๅŽŸๅ› ๏ผš

    kubectl describe pod xxx | grep -A10 "Events"
    

ๅธธ่ง้”™่ฏฏ๏ผš

  • insufficient cpu/memory
  • node(s) didn’t match node selector
  • pod didn’t tolerate node taint
  • pod has unbound ImmediatePersistentVolumeClaims

๐Ÿ”ต ไธ€ๅฅ่ฏๆ€ป็ป“

Kubernetes ่ฐƒๅบฆๅ™จๆ‰ง่กŒๆต็จ‹ไธบ๏ผš

Watch Pod -> Filter ้ข„้€‰่Š‚็‚น -> Score ๆ‰“ๅˆ† -> ้€‰ๆœ€้ซ˜ๅˆ†่Š‚็‚น -> Bind -> Kubelet ๆ‰ง่กŒใ€‚

ๆฏไธ€ๆญฅ้ƒฝ็”ฑๅฏๆ’ๆ‹”่ฐƒๅบฆๆ’ไปถๅฎž็Žฐใ€‚