Maxskew میزان توزیع غلافها را به طور ناموزون توصیف می کند. شما باید این قسمت را مشخص کنید و تعداد آن باید بیشتر از صفر باشد. معناشناسی آن با توجه به ارزش زمانی که قابل قبول است متفاوت است: - اگر در صورت عدم رضایت بخش: Donotschedule را انتخاب کنید ، MaxSkew حداکثر اختلاف مجاز بین تعداد غلافهای تطبیق موجود در توپولوژی هدف و حداقل جهانی را تعریف می کند (حداقل تعداد غلافهای تطبیق در یک دامنه واجد شرایط یا صفر اگر تعداد حوزه های واجد شرایط کمتر از آن باشد. Mindomains). به عنوان مثال ، اگر به ترتیب 3 منطقه با غلاف 2 ، 2 و 1 تطبیق دارید ، Maxskew روی 1 تنظیم می شود ، حداقل جهانی 1 است.
- اگر در صورت عدم پذیرش: ScheduleAnyway را انتخاب کنید ، برنامه ریز برتری بالاتری به توپولوژی هایی می دهد که به کاهش پوست کمک می کند.
توجه: قسمت Mindomains یک قسمت بتا است و به طور پیش فرض در 1. 25 غیرفعال است. می توانید با فعال کردن دروازه ویژگی MindomainsInpodtopologySpread ، آن را فعال کنید.
- در صورت مشخص شدن ، ارزش Mindomains باید بیشتر از 0 باشد. شما فقط می توانید Mindomains را در رابطه با زمان پذیرش: Donotschedule مشخص کنید.
- هنگامی که تعداد دامنه های واجد شرایط با کلیدهای توپولوژی مسابقه کمتر از Mindomains باشد ، گسترش توپولوژی POD با حداقل جهانی به عنوان 0 رفتار می کند و سپس محاسبه SKEW انجام می شود. حداقل جهانی حداقل تعداد غلافهای تطبیق در یک دامنه واجد شرایط یا صفر است اگر تعداد دامنه های واجد شرایط کمتر از Mindomains باشد.
- هنگامی که تعداد دامنه های واجد شرایط با کلیدهای توپولوژی تطبیق برابر باشد یا از Mindomains بیشتر باشد ، این مقدار هیچ تاثیری در برنامه ریزی ندارد.
- اگر Mindomains را مشخص نکنید ، محدودیت به گونه ای رفتار می کند که گویی Mindomains 1 است.
- Donotschedule (پیش فرض) به برنامه ریز می گوید که آن را برنامه ریزی نکنید.
- ScheduleAnyway به برنامه ریزی می گوید که هنوز هم در حالی که گره هایی را که به حداقل می رسد ، آن را برنامه ریزی کند.
TopologySpradConstints: - ماکسک: 1 عکسبرداری: kubeetes. io/hostname چه زمانی قابل قبول: donotschedule actlabelkeys: - برنامه -pod-template-hash
توجه: قسمت MatchLabelkeys یک میدان آلفا است که در 1. 25 اضافه شده است. شما باید برای استفاده از آن ، دروازه ویژگی FatchLabelKeysinPodtopologySpread را فعال کنید.
- افتخار: فقط گره ها مطابق Nodeaffinity/Nodeselector در محاسبات گنجانده شده اند.
- نادیده گرفتن: Nodeaffinity/Nodeselector نادیده گرفته می شود. همه گره ها در محاسبات گنجانده شده اند.
اگر این مقدار تهی باشد ، رفتار معادل سیاست افتخار است.
توجه: NodeAffinityPolicy یک زمینه در سطح بتا است و به طور پیش فرض در 1. 26 فعال می شود. می توانید با غیرفعال کردن دروازه ویژگی NodeInclusionPolicyInpodtopologySpread آن را غیرفعال کنید.
- افتخار: گره های بدون لکه ها ، به همراه گره های لکه دار که غلاف ورودی برای آنها تحمل دارد ، گنجانده شده است.
- نادیده گرفتن: لکه های گره نادیده گرفته می شوند. همه گره ها گنجانده شده اند.
اگر این مقدار تهی باشد ، رفتار معادل سیاست نادیده گرفته است.
توجه: Nodetaintspolicy یک قسمت از سطح بتا است و به طور پیش فرض در 1. 26 فعال می شود. می توانید با غیرفعال کردن دروازه ویژگی NodeInclusionPolicyInpodtopologySpread آن را غیرفعال کنید.
هنگامی که یک POD بیش از یک TopologySpreadConstraint را تعریف می کند ، این محدودیت ها با استفاده از یک منطقی و عملیاتی ترکیب می شوند: Kube-Scheduler به دنبال یک گره برای غلاف ورودی است که تمام محدودیت های پیکربندی شده را برآورده می کند.
برچسب گره
محدودیت های گسترش توپولوژی برای شناسایی دامنه (های) توپولوژی که هر گره در آن قرار دارد ، به برچسب های گره متکی هستند. به عنوان مثال ، یک گره ممکن است دارای برچسب باشد:
منطقه: US-East-1 منطقه: us-East-1a
توجه داشته باشید: برای کوتاه بودن ، این مثال از Keys Label Label Topology. kubeetes. io/zone و Topology. kubeetes. io/region استفاده نمی کند. با این حال ، این کلیدهای برچسب ثبت شده به جای کلیدهای برچسب خصوصی (بدون صلاحیت) منطقه و منطقه ای که در اینجا مورد استفاده قرار می گیرند ، توصیه می شوند.
شما نمی توانید فرضیه قابل اعتماد در مورد معنی یک کلید برچسب خصوصی بین زمینه های مختلف ایجاد کنید.
فرض کنید شما یک خوشه 4 گره با برچسب های زیر دارید:
نام وضعیت نقش های سنی برچسب Node1 Ready 4M26S V1. 16. 0 Node = Node1 ، Zone = Zonea Node2 Node2 Node. 16. 0 Node = Node2 ، Zone = Zonea Node3 Ready 3M17S V1. 16. 0 گره = Node3 ، Zone = Node4 Node4 Repeed 2M43S V1. 16. 0 گره = Node4 ، Zone = ZoneB
سپس خوشه به طور منطقی به شرح زیر مشاهده می شود:
اگر قرار بود دو محدودیت را اعمال کنید. این اتفاق می افتد زیرا: برای برآورده کردن اولین محدودیت ، MyPOD POD فقط در منطقه B قرار می گیرد. در حالی که از نظر محدودیت دوم ، POD MyPOD فقط می تواند برای گره گره 2 برنامه ریزی کند. تقاطع این دو محدودیت یک مجموعه خالی را برمی گرداند و برنامه ریز نمی تواند غلاف را قرار دهد.
برای غلبه بر این وضعیت ، می توانید مقدار MaxsKew را افزایش داده یا یکی از محدودیت هایی را که در هنگام رضایت بخش قابل استفاده است ، اصلاح کنید: ScheduleAnyway. بسته به شرایط ، ممکن است تصمیم بگیرید که یک غلاف موجود را به صورت دستی حذف کنید - به عنوان مثال ، اگر عیب یابی می کنید که چرا یک راهپیمایی اشکال در حال پیشرفت نیست.
تعامل با وابستگی گره و انتخاب کنندگان گره
اگر غلاف ورودی دارای خاص باشد. nodeselector یا spec. Affinity. NodeAffinity تعریف شده ، برنامه ریزی از گره های غیر تطبیقی را از محاسبات SKEW رد می کند.
مثال: توپولوژی محدودیت هایی را با میل گره گسترش می دهد
فرض کنید شما یک خوشه 5 گره در مناطق A تا C وجود دارد:
graph BT subgraph "zoneB" p3(Pod) > n3(Node3) n4(Node4) end subgraph "zoneA" p1(Pod) > n1(Node1) p2(Pod) >N2 (Node2) پایان کلاس End ClassDef:#ddd,stroke:#FFF ، WIDTH WIDTH: 4px ، رنگ:#000 ؛ClassDef K8s پر می شود:#326ce5,stroke:#FFF ، WIDTH STROKE: 4px ، رنگ: #fff ؛ClassDef Cluster Fill:#fff,stroke:#BBB ، سکته مغزی: 2px ، رنگ:#326ce5 ؛کلاس N1 ، N2 ، N3 ، N4 ، P1 ، P2 ، P3 K8S ؛کلاس P4 دشت ؛Zonea کلاس ، خوشه ZoneB ؛
نمودار BT Subgraph "Zonec" N5 (Node5) End ClassDef Plain Fill:#ddd,stroke:#FFF ، WIDTH WIDTH: 4px ، رنگ:#000 ؛ClassDef K8s پر می شود:#326ce5,stroke:#FFF ، WIDTH STROKE: 4px ، رنگ: #fff ؛ClassDef Cluster Fill:#fff,stroke:#BBB ، سکته مغزی: 2px ، رنگ:#326ce5 ؛کلاس N5 K8S ؛خوشه Zonec کلاس ؛
و می دانید که منطقه C باید مستثنا باشد. در این حالت ، شما می توانید یک مانیفست را به شرح زیر تشکیل دهید ، به طوری که POD MyPOD به جای منطقه C در منطقه B قرار می گیرد. به طور مشابه ، Kubeetes همچنین به spec. nodeselector احترام می گذارد.
نوع: غلاف سر و صدا: v1 ابرداده: نام: mypod برچسب ها: فحش: بار نشان: TopologySpradConstints: - ماکسک: 1 عکسبرداری: منطقه چه زمانی قابل قبول: donotschedule برچسب دهنده: دسته: فحش: بار وابستگی: عبادت: مورد نیاز DuringschingignedduringExection: تفاوتی: - اکسپرس: - کلید: منطقه اپراتور: notin ارزش های: - زونک ظروف: - نام: مکث تصویر: registry. k8s. io/pause:3. 1
کنوانسیون های ضمنی
در اینجا برخی از کنوانسیون های ضمنی وجود دارد که قابل ذکر است:
- فقط غلاف هایی که همان فضای نام را دارند که غلاف دریافتی می تواند نامزدها باشد.
- برنامه ریز از هر گره ای که هیچ TopologySpreadConstraints ندارند ، دور می زند [*]. TopologyKey موجود است. این بدان معنی است که:
- هر غلاف واقع در آن گره های دور افتاده ، محاسبه MaxSkew را تحت تأثیر قرار نمی دهد - در مثال بالا ، فرض کنید گره گره 1 دارای برچسب "Zone" نیست ، سپس 2 غلاف مورد توجه قرار نمی گیرند ، از این رو غلاف ورودی به منطقه A برنامه ریزی می شود.
- غلاف ورودی هیچ فرصتی برای برنامه ریزی بر روی این نوع گره ها ندارد - در مثال بالا ، فرض کنید یک گره گره 5 دارای برچسب اشتباه منطقه TYPO: Zonec (و هیچ مجموعه برچسب منطقه ای) است. پس از پیوستن Node Node5 به خوشه ، آن را دور می زند و غلاف برای این بار کار در آنجا برنامه ریزی نشده است.
- از آنچه اتفاق می افتد آگاه باشید اگر TopologySpreadConstraints POD ورودی [*]. برچسب دهنده با برچسب های خود مطابقت ندارد. در مثال بالا ، اگر برچسب های غلاف ورودی را حذف کنید ، هنوز هم می توان آن را روی گره ها در منطقه B قرار داد ، زیرا محدودیت ها هنوز راضی هستند. با این حال ، پس از آن قرارگیری ، میزان عدم تعادل خوشه بدون تغییر باقی می ماند - هنوز هم در منطقه دارای 2 غلاف با عنوان Foo: Bar و Zone B دارای 1 غلاف با عنوان Foo: Bar است. اگر این چیزی نیست که شما انتظار دارید ، TopologySpreadConstraints را به روز کنید.
محدودیت های پیش فرض در سطح خوشه
می توان محدودیت های گسترش توپولوژی پیش فرض را برای یک خوشه تنظیم کرد. محدودیت های گسترش توپولوژی پیش فرض در صورت و فقط اگر:
- این محدودیت در . spec. topologyspreadconstraints خود را تعریف نمی کند.
- این متعلق به یک سرویس ، ماکت ، StateFulset یا ReplicationController است.
محدودیت های پیش فرض را می توان به عنوان بخشی از آرگومان های افزونه PodtopologySpread در یک نمایه برنامه ریزی تنظیم کرد. محدودیت ها با همان API در بالا مشخص شده اند ، به جز اینکه برچسب دهنده باید خالی باشد. انتخاب کنندگان از خدمات ، ماکت ها ، حالت های برجسته یا تکثیر کنترلی که POD به آن تعلق دارد محاسبه می شود.
یک پیکربندی مثال ممکن است به شرح زیر باشد:
سر و صدا: kubescheduler. config. k8s. io/v1beta3 نوع: kubeschedulerconfiguration مشخصات: - نام برنامه زمانبندی: برنامه ریزی پیش فرض پلاگین: - نام: podtopologyspread استدلال: محدودیت های پیش فرض: - ماکسک: 1 عکسبرداری: topology. kubeetes. io/zone چه زمانی قابل قبول: برنامه زمانبندی نوع پیش فرض: لیست
توجه: افزونه SelectorsPread به طور پیش فرض غیرفعال است. پروژه Kubeetes برای دستیابی به رفتارهای مشابه از PodtopologySpread استفاده می کند.
محدودیت های پیش فرض ساخته شده
حالت ویژگی: Kubeetes v1. 24 [پایدار] اگر هیچ محدودیت پیش فرض در سطح خوشه را برای گسترش توپولوژی غلاف پیکربندی نکنید ، پس Kube-Scheduler طوری عمل می کند که گویی محدودیت های توپولوژی پیش فرض زیر را مشخص کرده اید:
محدودیت های پیش فرض: - ماکسک: 3 عکسبرداری: "kubeetes. io/hostname" چه زمانی قابل قبول: برنامه زمانبندی - ماکسک: 5 عکسبرداری: "Topology. kubeetes. io/Zone" چه زمانی قابل قبول: برنامه زمانبندی
همچنین ، افزونه Legacy SelectorsPread ، که یک رفتار معادل را ارائه می دهد ، به طور پیش فرض غیرفعال می شود.
توجه داشته باشید: افزونه PodtopologySpread گره هایی را که دارای کلیدهای توپولوژی مشخص شده در محدودیت های پخش نیستند ، نمره نمی دهد. این ممکن است در هنگام استفاده از محدودیت های توپولوژی پیش فرض ، یک رفتار پیش فرض متفاوت در مقایسه با افزونه Legacy SelectorSpread منجر شود.
اگر انتظار نمی رود که گره های شما هر دو kubeetes. io/hostname و topology. kubeetes. io/zone را تنظیم کنند ، به جای استفاده از پیش فرض های Kubeetes ، محدودیت های خود را تعریف کنید.
اگر نمی خواهید از محدودیت های پیش فرض POD برای خوشه خود استفاده کنید ، می توانید با تنظیم DefaultIngType در لیست و باقی ماندن پیش فرض های خالی در پیکربندی افزونه PodtopologySpread ، آن پیش فرض ها را غیرفعال کنید:
سر و صدا: kubescheduler. config. k8s. io/v1beta3 نوع: kubeschedulerconfiguration مشخصات: - نام برنامه زمانبندی: برنامه ریزی پیش فرض پلاگین: - نام: podtopologyspread استدلال: محدودیت های پیش فرض: [] نوع پیش فرض: لیست
مقایسه با podaffinity و podantiaffinity
در Kubeetes ، وابستگی بین غلاف و کنترل ضد توطئه نحوه برنامه ریزی POD ها در رابطه با یکدیگر-چه بسته بندی شده تر یا پراکنده تر.
Podaffinity غلاف را به خود جلب می کند. می توانید سعی کنید هر تعداد غلاف را در دامنه (های) توپولوژی واجد شرایط قرار دهید. Podantiaffinity غلاف را دفع می کند. اگر این کار را روی حالت مورد نیاز DevortduringSchingignedDuringExection تنظیم کنید ، فقط یک غلاف واحد را می توان در یک دامنه توپولوژی واحد برنامه ریزی کرد. اگر ترجیح می دهید PreferredDuringSchingignedduringDuringExection را انتخاب کنید ، توانایی اجرای محدودیت را از دست می دهید.
برای کنترل دقیق تر ، می توانید محدودیت های گسترش توپولوژی را برای توزیع غلاف در حوزه های مختلف توپولوژی - برای دستیابی به در دسترس بودن بالا یا صرفه جویی در هزینه مشخص کنید. این همچنین می تواند در نورد بروزرسانی بروزرسانی و مقیاس بندی ماکت ها به آرامی کمک کند.
برای زمینه بیشتر ، به بخش انگیزه پیشنهاد تقویت در مورد محدودیت های گسترش توپولوژی غلاف مراجعه کنید.
محدودیت های شناخته شده
- هیچ تضمینی وجود ندارد که هنگام برداشتن غلاف ، محدودیت ها راضی باشند. به عنوان مثال ، مقیاس گذاری در استقرار ممکن است منجر به توزیع غلاف های نامتعادل شود. برای تعادل توزیع غلاف می توانید از ابزاری مانند Descheduler استفاده کنید.
- غلافهای مطابق با گره های لکه دار رعایت می شوند. به شماره 80921 مراجعه کنید.
- برنامه ریز دانش قبلی در مورد همه مناطق یا سایر حوزه های توپولوژی که یک خوشه دارد ، ندارد. آنها از گره های موجود موجود در خوشه تعیین می شوند. این می تواند به مشکلی در خوشه های خودکار منجر شود ، هنگامی که یک استخر گره (یا گروه گره) به گره های صفر تبدیل می شود ، و انتظار دارید که این خوشه مقیاس شود ، زیرا در این حالت ، آن حوزه های توپولوژی در نظر گرفته نمی شوندتا زمانی که حداقل یک گره در آنها وجود داشته باشد. شما می توانید با استفاده از یک ابزار خودکار سازی خوشه ای که از محدودیت های پخش توپولوژی غلاف آگاه است ، در این زمینه کار کنید و همچنین از مجموعه کلی حوزه های توپولوژی آگاه است.
چه بعدی است
- مقاله وبلاگ با معرفی PodtopologySpread ، Maxskew را با جزئیات و همچنین نمونه های استفاده پیشرفته توضیح می دهد.
- بخش برنامه ریزی مرجع API را برای POD بخوانید.
بازخورد
این صفحه به شما کمک کرد؟
از نظر شما متشکریم. اگر یک سؤال خاص و پاسخگو در مورد نحوه استفاده از Kubeetes دارید ، از آن در مورد Onceflow Stack بپرسید. اگر می خواهید یک مشکل را گزارش کنید یا پیشنهاد بهبود را پیشنهاد دهید ، در repo github یک مسئله را باز کنید.