±à¼ÍƼö: |
±¾ÎÄ´Ó
Pod ºÍ½ÚµãµÄÅäÖÿªÊ¼£¬½éÉÜÁË Kubernetes Scheduler ¿ò¼Ü¡¢À©Õ¹µã¡¢API
ÒÔ¼°¿ÉÄÜ·¢ÉúµÄÓë×ÊÔ´Ïà¹ØµÄÆ¿¾±£¬²¢Õ¹Ê¾ÁËÐÔÄܵ÷ÕûÉèÖ㬺¸ÇÁË Kubernetes
Öе÷¶ÈµÄ´ó¶à·½Ãæ¡£ ±¾ÎÄÀ´×ÔÓÚK8sMeetupÉçÇø£¬ÓÉAlice±à¼¡¢ÍƼö¡£ |
|
Kubernetes Scheduler ÊÇ Kubernetes
¿ØÖÆÆ½ÃæµÄºËÐÄ×é¼þÖ®Ò»¡£ËüÔÚ¿ØÖÆÆ½ÃæÉÏÔËÐУ¬½« Pod ·ÖÅ䏸½Úµã£¬Í¬Ê±Æ½ºâ½ÚµãÖ®¼äµÄ×ÊÔ´ÀûÓÃÂÊ¡£½«
Pod ·ÖÅ䏸нڵãºó£¬ÔڸýڵãÉÏÔËÐÐµÄ kubelet »áÔÚ Kubernetes API ÖмìË÷
Pod ¶¨Ò壬¸ù¾Ý½ÚµãÉ쵀 Pod ¹æ·¶´´½¨×ÊÔ´ºÍÈÝÆ÷¡£»»¾ä»°Ëµ£¬Scheduler ÔÚ¿ØÖÆÆ½ÃæÄÚÔËÐУ¬²¢½«¹¤×÷¸ºÔØ·ÖÅ䏸
Kubernetes ¼¯Èº¡£
±¾ÎĽ«¶Ô Kubernetes Scheduler ½øÐÐÉîÈëÑо¿£¬Ê×ÏȸÅÊöÒ»°ãµÄµ÷¶ÈÒÔ¼°¾ßÓÐÇ׺ÍÁ¦£¨affinity£©ºÍ
taint µÄÇýÖðµ÷¶È£¬È»ºóÌÖÂÛµ÷¶È³ÌÐòµÄÆ¿¾±ÒÔ¼°Éú²úÖпÉÄÜÓöµ½µÄÎÊÌ⣬×îºóÑо¿ÈçºÎ΢µ÷µ÷¶È³ÌÐòµÄ²ÎÊýÒÔÊʺϼ¯Èº¡£
µ÷¶È¼ò½é
Kubernetes µ÷¶ÈÊǽ« Pod ·ÖÅ䏸¼¯ÈºÖÐÆ¥Åä½ÚµãµÄ¹ý³Ì¡£Scheduler ¼à¿ØÐ´´½¨µÄ
Pod£¬²¢ÎªÆä·ÖÅä×î¼Ñ½Úµã¡£Ëü»á¸ù¾Ý Kubernetes µÄµ÷¶ÈÔÔòºÍÎÒÃǵÄÅäÖÃÑ¡ÏîÑ¡Ôñ×î¼Ñ½Úµã¡£×î¼òµ¥µÄÅäÖÃÑ¡ÏîÊÇÖ±½ÓÔÚ
PodSpec ÉèÖà nodeName£º

ÉÏÃæµÄ nginx pod ĬÈÏÇé¿öϽ«ÔÚ node-01 ÉÏÔËÐУ¬µ«ÊÇ nodeName ÓÐÐí¶àÏÞÖÆµ¼ÖÂÎÞ·¨Õý³£ÔËÐÐ
Pod£¬ÀýÈçÔÆÖнڵãÃû³ÆÎ´Öª¡¢×ÊÔ´½Úµã²»×ãÒÔ¼°½ÚµãÍøÂç¼äЪÐÔÎÊÌâµÈ¡£Òò´Ë£¬³ýÁ˲âÊÔ»ò¿ª·¢ÆÚ¼ä£¬ÎÒÃÇ×îºÃ²»Ê¹ÓÃ
nodeName¡£
Èç¹ûÒªÔÚÒ»×éÌØ¶¨µÄ½ÚµãÉÏÔËÐÐ Pod£¬¿ÉÒÔʹÓà nodeSelector¡£ÎÒÃÇÔÚ PodSpec Öн«
nodeSelector ¶¨ÒåΪһ×é¼üÖµ¶Ô£º

¶ÔÓÚÉÏÃæµÄ nginx pod£¬Kubernetes Scheduler ½«ÕÒµ½Ò»¸ö´ÅÅÌÀàÐÍΪ ssd
µÄ½Úµã¡£µ±È»£¬¸Ã½Úµã¿ÉÒÔ¾ßÓÐÆäËû±êÇ©¡£ÎÒÃÇ¿ÉÒÔÔÚ Kubernetes ²Î¿¼ÎĵµÖв鿴±êÇ©µÄÍêÕûÁÐ±í¡£
µØÖ·£ºhttps://kubernetes.io/docs/reference/kubernetes-api
/ labels-annotations-taints /
ʹÓà nodeSelector ÓÐÔ¼Êø Pod ¿ÉÒÔÔÚÓÐÌØ¶¨±êÇ©µÄ½ÚµãÉÏÔËÐС£µ«ËüµÄʹÓýöÊܱêÇ©¼°ÆäÖµÏÞÖÆ¡£Kubernetes
ÖÐÓÐÁ½¸ö¸üÈ«ÃæµÄ¹¦ÄÜÀ´±í´ï¸ü¸´Ôӵĵ÷¶ÈÐèÇ󣺽ڵãÇ׺ÍÁ¦£¨node affinity£©£¬±ê¼ÇÈÝÆ÷ÒÔ½«ÆäÎüÒýµ½Ò»×é½ÚµãÉÏ£»taint
ºÍ toleration£¬±ê¼Ç½ÚµãÒÔÅųâ Pod¡£ÕâЩ¹¦Äܽ«ÔÚÏÂÃæÌÖÂÛ¡£
½ÚµãÇ׺ÍÁ¦
½ÚµãÇ׺ÍÁ¦£¨Node Affinity£©ÊÇÔÚ Pod É϶¨ÒåµÄÒ»×éÔ¼Êø£¬ÓÃÓÚÈ·¶¨ÄÄЩ½ÚµãÊʺϽøÐе÷¶È£¬¼´Ê¹ÓÃÇ׺ÍÐÔ¹æÔòΪ
Pod µÄ½Úµã·ÖÅ䶨ÒåÓ²ÐÔÒªÇóºÍÈíÐÔÒªÇó¡£ÀýÈç¿ÉÒÔ½« Pod ÅäÖÃΪ½öÔËÐдøÓÐ GPU µÄ½Úµã£¬²¢ÇÒ×îºÃʹÓÃ
NVIDIA_TESLA_V100 ÔËÐÐÉî¶Èѧϰ¹¤×÷¸ºÔØ¡£Scheduler »áÆÀ¹À¹æÔò£¬²¢ÔÚ¶¨ÒåµÄÔ¼ÊøÄÚÕÒµ½ºÏÊʵĽڵ㡣Óë
nodeSelectors ÏàËÆ£¬½ÚµãÇ׺ÍÐÔ¹æÔò¿ÉÓë½Úµã±êǩһÆðʹÓ㬵«Ëü±È nodeSelectors
¸üÇ¿´ó¡£
ÎÒÃÇ¿ÉÒÔΪ podspec Ìí¼ÓËĸöÏàËÆÐÔ¹æÔò£º
1.requiredDuringSchedulingIgnoredDuringExecution
2.requiredDuringSchedulingRequiredDuringExecution
3.preferredDuringSchedulingIgnoredDuringExecution
4.preferredDuringSchedulingRequiredDuringExecution
ÕâËĸö¹æÔòÓÉÁ½¸öÌõ¼þ×é³É£º±ØÐè»òÊ×Ñ¡Ìõ¼þ£¬ÒÔ¼°Á½¸ö½×¶Î£º¼Æ»®ºÍÖ´ÐС£ÒÔ required ¿ªÍ·µÄ¹æÔòÃèÊöÁ˱ØÐëÂú×ãµÄÑϸñÒªÇó¡£ÒÔ
preferred ¿ªÍ·µÄ¹æÔòÊÇÈíÐÔÒªÇ󣬽«Ç¿ÖÆÖ´Ðе«²»Äܱ£Ö¤¡£µ÷¶È½×¶ÎÊÇÖ¸½« Pod Ê״ηÖÅ䏸½Úµã¡£Ö´Ðн׶ÎÊÊÓÃÓÚÔÚµ÷¶È·ÖÅäºó½Úµã±êÇ©·¢Éú¸ü¸ÄµÄÇé¿ö¡£
Èç¹û¹æÔòÉùÃ÷Ϊ IgnoredDuringExecution£¬Scheduler ÔÚµÚÒ»´Î·ÖÅäºó²»»á¼ì²éÆäÓÐЧÐÔ¡£µ«Èç¹ûʹÓÃ
RequiredDuringExecution Ö¸¶¨Á˹æÔò£¬Scheduler »áͨ¹ý½«ÈÝÆ÷ÒÆÖÁºÏÊʵĽڵãÀ´È·±£¹æÔòµÄÓÐЧÐÔ¡£
ÒÔÏÂÊÇʾÀý£º

ÉÏÃæµÄ Nginx Pod ¾ßÓнڵãÇ׺ÍÐÔ¹æÔò£¬¸Ã¹æÔòÈà Kubernetes Scheduler
½« Pod ·ÅÖÃÔÚ us-east µÄ½ÚµãÉÏ¡£µÚ¶þÌõ¹æÔòָʾÓÅÏÈʹÓà us-east-1 »ò us-east-2¡£
ʹÓÃÇ׺ÍÐÔ¹æÔò£¬ÎÒÃÇ¿ÉÒÔÈà Kubernetes µ÷¶È¾ö²ßÊÊÓÃÓÚ×Ô¶¨ÒåÐèÇó¡£
Taint Óë Toleration
¼¯ÈºÖв¢·ÇËùÓÐ Kubernetes ½Úµã¶¼Ïàͬ¡£Ä³Ð©½Úµã¿ÉÄܾßÓÐÌØÊâµÄÓ²¼þ£¬ÀýÈç GPU¡¢´ÅÅÌ»òÍøÂ繦ÄÜ¡£Í¬Ñù£¬ÎÒÃÇ¿ÉÄÜÐèÒª½«Ò»Ð©½ÚµãרÓÃÓÚ²âÊÔ¡¢Êý¾Ý±£»¤»òÓû§×é¡£ÎÒÃÇ¿ÉÒÔ½«
Taint Ìí¼Óµ½½ÚµãÒÔÅųâ Pod£¬ÈçÒÔÏÂʾÀýËùʾ£º
kubectl taint nodes node1 test-environment=true:NoSchedule
ʹÓà test-environment=true:NoScheduletaint ʱ£¬³ý·ÇÔÚ podspec
¾ßÓÐÆ¥ÅäµÄ toleration£¬·ñÔò Kubernetes Scheduler ½«²»»á·ÖÅäÈκΠpod
£º

taint ºÍ tolerations ¹²Í¬·¢»Ó×÷Óã¬Èà Kubernetes
Scheduler רÓÃÓÚijЩ½Úµã²¢·ÖÅäÌØ¶¨ Pod¡£
µ÷¶ÈÆ¿¾±
¾¡¹Ü Kubernetes Scheduler ÄÜÑ¡Ôñ×î¼Ñ½Úµã£¬µ«ÊÇÔÚ Pod ¿ªÊ¼ÔËÐÐÖ®ºó£¬¡°×î¼Ñ½Úµã¡±¿ÉÄÜ»á¸Ä±ä¡£ËùÒÔ´Ó³¤Ô¶À´¿´£¬Pod
µÄ×ÊԴʹÓü°Æä½Úµã·ÖÅä¿ÉÄÜ´æÔÚÎÊÌâ¡£
×ÊÔ´ÇëÇó£¨Request£©ºÍÏÞÖÆ£¨Limit£©£º¡°Noisy Neighbor¡±
¡°Noisy Neighbor¡±²¢²»Ìض¨ÓÚ Kubernetes¡£Èκζà×⻧ϵͳ¶¼ÊÇËüÃǵÄDZÔڵء£¼ÙÉèÓÐÁ½¸öÈÝÆ÷
A ºÍ B£¬ËüÃÇÔÚͬһ½ÚµãÉÏÔËÐС£Èç¹û Pod B ÊÔͼͨ¹ýÏûºÄËùÓÐ CPU »òÄÚ´æÀ´´´Ôì noise£¬Pod
A ½«³öÏÖÎÊÌâ¡£Èç¹ûÎÒÃÇΪÈÝÆ÷ÉèÖÃÁË×ÊÔ´ÇëÇóºÍÏÞÖÆ¾ÍÄÜ¿ØÖÆ×¡ neighbor¡£Kubernetes
½«È·±£ÎªÈÝÆ÷°²ÅÅÆäÇëÇóµÄ×ÊÔ´£¬²¢ÇÒ²»»áÏûºÄ³¬³öÆä×ÊÔ´ÏÞÖÆµÄ×ÊÔ´¡£Èç¹ûÔÚÉú²úÖÐÔËÐÐ Kubernetes£¬×îºÃÉèÖÃ×ÊÔ´ÇëÇóºÍÏÞÖÆÒÔÈ·±£ÏµÍ³¿É¿¿¡£
ϵͳ½ø³Ì×ÊÔ´²»×ã
Kubernetes ½ÚµãÖ÷ÒªÊÇÁ¬½Óµ½ Kubernetes ¿ØÖÆÆ½ÃæµÄÐéÄâ»ú¡£Òò´Ë£¬½ÚµãÉÏÒ²ÓÐ×Ô¼ºµÄ²Ù×÷ϵͳºÍÏà¹Ø½ø³Ì¡£Èç¹û
Kubernetes ¹¤×÷¸ºÔØÏûºÄÁËËùÓÐ×ÊÔ´£¬ÔòÕâЩ½Úµã½«ÎÞ·¨ÔËÐУ¬²¢»á·¢Éú¸÷ÖÖÎÊÌâÎÊÌâ¡£ÎÒÃÇÐèÒªÔÚ
kubelet ÖÐʹÓà ¨Csystem -reserved ÉèÖñ£Áô×ÊÔ´£¬ÒÔ·ÀÖ¹·¢ÉúÕâÖÖÇé¿ö¡£
ÇÀÕ¼»òµ÷¶È Pod
Èç¹û Kubernetes Scheduler ÎÞ·¨½« Pod µ÷¶Èµ½¿ÉÓýڵ㣬Ôò¿ÉÒÔ´Ó½ÚµãÇÀÕ¼£¨preempt£©»òÇýÖð£¨evict£©Ò»Ð©
Pod ÒÔ·ÖÅä×ÊÔ´¡£Èç¹û¿´µ½ Pod ÔÚ¼¯ÈºÖÐÒÆ¶¯¶øÃ»Óз¢ÏÖÌØ¶¨ÔÒò£¬¿ÉÒÔʹÓÃÓÅÏȼ¶Àà¶ÔÆä½øÐж¨Ò塣ͬÑù£¬Èç¹ûûÓе÷¶ÈºÃ
Pod£¬²¢ÇÒÕýÔڵȴýÆäËû Pod£¬Ò²ÐèÒª¼ì²éÆäÓÅÏȼ¶¡£
ÒÔÏÂÊÇʾÀý£º

¿ÉÒÔͨ¹ýÒÔÏ·½Ê½ÔÚ podspec ÖÐΪ·ÖÅäÓÅÏȼ¶£º

µ÷¶È¿ò¼Ü
Kubernetes Scheduler ¾ßÓпɲå°ÎµÄµ÷¶È¿ò¼Ü¼Ü¹¹£¬¿ÉÏò¿ò¼ÜÌí¼ÓÒ»×éеIJå¼þ¡£²å¼þʵÏÖ
Plugin API£¬²¢±»±àÒëµ½µ÷¶È³ÌÐòÖС£ÏÂÃæÎÒÃǽ«ÌÖÂÛµ÷¶È¿ò¼ÜµÄ¹¤×÷Á÷¡¢À©Õ¹µãºÍ Plugin
API¡£
¹¤×÷Á÷ºÍÀ©Õ¹µã
µ÷¶È Pod °üÀ¨Á½¸ö½×¶Î£ºµ÷¶ÈÖÜÆÚ£¨scheduling cycle£©ºÍ°ó¶¨ÖÜÆÚ£¨binding
cycle£©¡£ÔÚµ÷¶ÈÖÜÆÚÖУ¬Scheduler »áÕÒµ½Ò»¸ö¿ÉÓýڵ㣬ȻºóÔڰ󶨹ý³ÌÖУ¬½«¾ö²ßÓ¦ÓÃÓÚ¼¯Èº¡£
ÏÂͼ˵Ã÷Á˽׶κÍÀ©Õ¹µãµÄÁ÷³Ì£º

µ÷¶È¹¤×÷Á÷£¨À´Ô´£ºKubernetes Îĵµ£©
¹¤×÷Á÷ÖеÄÒÔϼ¸µã¶Ô²å¼þÀ©Õ¹¿ª·Å£º
QueueSort£º¶Ô¶ÓÁÐÖÐµÄ Pod ½øÐÐÅÅÐò
PreFilter£º¼ì²éÔ¤´¦Àí Pod µÄÏà¹ØÐÅÏ¢ÒÔ°²Åŵ÷¶ÈÖÜÆÚ
Filter£º¹ýÂ˲»Êʺϸà Pod µÄ½Úµã
PostFilter£ºÈç¹ûÕÒ²»µ½¿ÉÓÃÓÚ Pod µÄ¿ÉÐнڵ㣬µ÷Óøòå¼þ
PreScore£ºÔËÐÐ PreScore ÈÎÎñÒÔÉú³ÉÒ»¸ö¿É¹²Ïí״̬¹© Score ²å¼þʹÓÃ
Score£ºÍ¨¹ýµ÷ÓÃÿ¸ö Score ²å¼þ¶Ô¹ýÂËµÄ½Úµã½øÐÐÅÅÃû
NormalizeScore£ººÏ²¢·ÖÊý²¢¼ÆËã½ÚµãµÄ×îÖÕÅÅÃû
Reserve£ºÔÚ°ó¶¨ÖÜÆÚ֮ǰѡÔñ±£ÁôµÄ½Úµã
Permit£ºÅú×¼»ò¾Ü¾øµ÷¶ÈÖÜÆÚ½á¹û
PreBind£ºÖ´ÐÐÈκÎÏȾöÌõ¼þ¹¤×÷£¬ÀýÈçÅäÖÃÍøÂç¾í
Bind£º½« Pod ·ÖÅ䏸 Kubernetes API ÖеĽڵã
PostBind£ºÍ¨Öª°ó¶¨ÖÜÆÚµÄ½á¹û
²å¼þÀ©Õ¹ÊµÏÖÁË Plugin API£¬ÊÇ Kubernetes Scheduler µÄÒ»²¿·Ö¡£ÎÒÃÇ¿ÉÒÔÔÚ
Kubernetes ´æ´¢¿âÖмì²é¡£²å¼þӦʹÓÃÒÔÏÂÃû³Æ½øÐÐ×¢²á£º  ²å¼þ»¹ÊµÏÖÁËÏà¹ØµÄÀ©Õ¹µã£¬ÈçÏÂËùʾ£º 
Scheduler ÐÔÄܵ÷Õû
Kubernetes Scheduler ÓÐÒ»¸ö¹¤×÷Á÷À´²éÕÒºÍ°ó¶¨ Pod µÄ¿ÉÐнڵ㡣µ±¼¯ÈºÖеĽڵãÊýÁ¿·Ç³£¶àʱ£¬Scheduler
µÄ¹¤×÷Á¿½«³É±¶Ôö¼Ó¡£ÔÚ´óÐͼ¯ÈºÖУ¬¿ÉÄÜÐèÒªºÜ³¤Ê±¼ä²ÅÄÜÕÒµ½×î¼Ñ½Úµã£¬Òò´ËҪ΢µ÷µ÷¶È³ÌÐòµÄÐÔÄÜ£¬ÒÔÔÚÑÓ³ÙºÍ׼ȷÐÔÖ®¼äÕÒµ½ÕÛÖз½°¸¡£
percentageOfNodesToScore ½«ÏÞÖÆ½ÚµãµÄÊýÁ¿À´¼ÆËã×Ô¼ºµÄ·ÖÊý¡£Ä¬ÈÏÇé¿öÏ£¬Kubernetes
ÔÚ 100 ½Úµã¼¯ÈºµÄ 50£¥ ºÍ 5000 ½Úµã¼¯ÈºµÄ 10£¥ Ö®¼äÉèÖÃÏßÐÔãÐÖµ¡£Ä¬ÈÏ×îСֵΪ 5£¥£¬ËüҪȷ±£ÖÁÉÙ¿¼ÂǼ¯ÈºÖÐ
5£¥ ½ÚµãµÄµ÷¶È¡£
ÏÂÃæµÄʾÀýչʾÁËÈçºÎͨ¹ýÐÔÄܵ÷Õû kube-scheduler À´ÊÖ¶¯ÉèÖÃãÐÖµ£º

Èç¹ûÓÐÒ»¸öÅÓ´óµÄ¼¯Èº²¢ÇÒ Kubernetes ¹¤×÷¸ºÔز»ÄܳÐÊÜ Kubernetes
Scheduler ÒýÆðµÄÑÓ³Ù£¬ÄÇô¸ü¸Ä°Ù·Ö±ÈÊǸöºÃÖ÷Òâ¡£
×ܽá
±¾Îĺ¸ÇÁË Kubernetes µ÷¶ÈµÄ´ó¶à·½Ã棬´Ó Pod ºÍ½ÚµãµÄÅäÖÿªÊ¼£¬°üÀ¨
nodeSelector¡¢Ç׺ÍÐÔ¹æÔò¡¢taint ºÍ toleration£¬È»ºó½éÉÜÁË Kubernetes
Scheduler ¿ò¼Ü¡¢À©Õ¹µã¡¢API ÒÔ¼°¿ÉÄÜ·¢ÉúµÄÓë×ÊÔ´Ïà¹ØµÄÆ¿¾±£¬×îºóչʾÁËÐÔÄܵ÷ÕûÉèÖ᣾¡¹Ü
Kubernetes Scheduler Äܼòµ¥µØ½« Pod ·ÖÅ䏸½Úµã£¬µ«ÊÇÁ˽âÆä¶¯Ì¬ÐÔ²¢¶ÔÆä½øÐÐÅäÖÃÒÔʵÏÖ¿É¿¿µÄÉú²ú¼¶
Kubernetes ÉèÖÃÖÁ¹ØÖØÒª¡£
|