إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
توضح هذه المقالة كيفية تكوين نهج تعطيل العقدة لعقد التوفير التلقائي لعقدة Azure Kubernetes Service (AKS) وتوضح بالتفصيل كيفية عمل التعطيل لتحسين استخدام الموارد وكفاءة التكلفة.
تعمل NAP على تحسين نظام المجموعة الخاص بك من خلال:
- إزالة أو استبدال العقد غير المستغلة.
- توحيد أحمال العمل لتقليل التكاليف.
- احترام ميزانيات الاضطراب ونوافذ الصيانة.
- توفير التحكم اليدوي عند الحاجة.
قبل البدء
- اقرأ مقالة نظرة عامة على التوفير التلقائي للعقدة (NAP) في AKS، والتي توضح بالتفصيل كيفية عمل NAP.
- اقرأ نظرة عامة على تكوينات الشبكات للتوفير التلقائي للعقدة (NAP) في Azure Kubernetes Service (AKS).
كيف يعمل تعطيل العقدة لعقد NAP؟
يقوم Karpenter بتعيين مكون نهائي ل Kubernetes على كل عقدة وتطالب العقدة بأنها توفرها. يمنع النهائي حذف كائن العقدة، بينما تقوم وحدة التحكم في الإنهاء بتلوث العقدة واستنزافها قبل إزالة مطالبة العقدة الأساسية.
عندما يتم تقليل أحجام العمل على العقد الخاصة بك، تستخدم NAP قواعد التعطيل على مواصفات تجمع العقد لتحديد وقت وكيفية إزالة هذه العقد وربما إعادة جدولة أحمال العمل الخاصة بك لتحقيق الكفاءة.
طرق تعطيل العقدة
يكتشف NAP تلقائيا العقد المؤهلة للتعطيل ويدور البدائل عند الحاجة. يمكنك تشغيل التعطيل من خلال طرق آلية مثل انتهاء الصلاحية أو الدمجوالانحراف أو الطرق اليدوية أو الأنظمة الخارجية.
Expiration
يسمح لك انتهاء الصلاحية بتعيين الحد الأقصى لعمر عقد NAP الخاصة بك. يتم وضع علامة على العقد على أنها منتهية الصلاحية وتعطلها بعد الوصول إلى العمر الذي تحدده لقيمة تجمع spec.disruption.expireAfter العقدة.
مثال على تكوين انتهاء الصلاحية
يوضح المثال التالي كيفية تعيين وقت انتهاء صلاحية عقد NAP إلى 24 ساعة:
spec:
disruption:
expireAfter: 24h # Expire nodes after 24 hours
Consolidation
تعمل NAP على تقليل تكلفة نظام المجموعة بنشاط من خلال تحديد متى يمكن إزالة العقد لأنها فارغة أو غير مستغلة بشكل كاف، أو عندما يمكن استبدال العقد بمتغيرات أقل سعرا. هذه العملية تسمى التوحيد. تستخدم NAP بشكل أساسي الدمج لحذف العقد أو استبدالها من أجل وضع الجراب الأمثل.
تقوم NAP بتنفيذ الأنواع التالية من الدمج من أجل تحسين استخدام الموارد:
- دمج العقدة الفارغة: يحذف أي عقد فارغة بالتوازي.
- دمج متعدد العقد: يحذف عقد متعددة، وربما يطلق بديلا واحدا.
- دمج عقدة واحدة: يحذف أي عقدة واحدة، وربما يطلق بديل.
يمكنك تشغيل الدمج من خلال الحقل spec.disruption.consolidationPolicy في مواصفات تجمع العقدة باستخدام WhenEmptyالإعدادات ، أو WhenEmptyOrUnderUtilized الإعدادات. يمكنك أيضا تعيين الحقل consolidateAfter ، وهو شرط يستند إلى الوقت يحدد المدة التي تنتظرها NAP بعد اكتشاف فرصة الدمج قبل تعطيل العقدة.
مثال على تكوين الدمج
يوضح المثال التالي كيفية تكوين NAP لدمج العقد عندما تكون فارغة، والانتظار لمدة 30 ثانية بعد اكتشاف فرصة الدمج قبل تعطيل العقدة:
disruption:
# Describes which types of nodes NAP should consider for consolidation
# `WhenEmptyOrUnderUtilized`: NAP considers all nodes for consolidation and attempts to remove or replace nodes when it discovers that the node is empty or underutilized and could be changed to reduce cost
# `WhenEmpty`: NAP only considers nodes for consolidation that don't contain any workload pods
consolidationPolicy: WhenEmpty
# The amount of time NAP should wait after discovering a consolidation decision
# Currently, you can only set this value when the consolidation policy is `WhenEmpty`
# You can choose to disable consolidation entirely by setting the string value `Never`
consolidateAfter: 30s
الانجراف
يعالج الانجراف التغييرات التي تطرأ على الموارد NodePool/AKSNodeClass . تنعكس القيم الموجودة في ملف NodeClaimTemplateSpec/AKSNodeClassSpec بنفس الطريقة التي تم بها تعيينها. يتم اكتشاف A NodeClaim على أنها منحرف إذا كانت القيم الموجودة في المقترن NodePool/AKSNodeClass لا تتطابق مع القيم الموجودة في ملف .NodeClaim على غرار العلاقة الأولية deployment.spec.template للكبسولات ، يقوم Karpenter بتعليق المرتبط NodePool/AKSNodeClass بتجزئة للتحقق NodeClaimTemplateSpec من الانجراف. يزيل Karpenter حالة الحالة Drifted في السيناريوهات التالية:
-
Driftبوابة الميزات غير ممكنة ولكنNodeClaimيتم تحريفها. -
NodeClaimلا يتم انجرافها ، ولكن لها حالة الحالة.
قد يكتشف Karpenter أو واجهة موفر السحابة حالات خاصة ناتجة عن NodeClaimNodePoolAKSNodeClass/Instance//التغييرات.
حالات خاصة على الانجراف
في حالات خاصة ، يمكن أن يتوافق الانجراف مع قيم متعددة ويجب التعامل معه بشكل مختلف. يمكن أن يؤدي الانحراف في الحقول التي تم حلها إلى إنشاء حالات يحدث فيها انحراف دون تغييرات في تعريفات الموارد المخصصة (CRDs)، أو حيث لا تؤدي تغييرات CRD إلى الانجراف.
على سبيل المثال، إذا كان node.kubernetes.io/instance-type: Standard_D2s_v3هناك NodeClaim ، وتغيرت المتطلبات من node.kubernetes.io/instance-type In [Standard_D2s_v3] إلى node.kubernetes.io/instance-type In [Standard_D2s_v3, Standard_D4s_v3]، فلن يتم انجراف قيمتها NodeClaim لأن قيمتها لا تزال متوافقة مع المتطلبات الجديدة. على العكس من ذلك ، إذا كان a NodeClaim يستخدم a NodeClaimimageFamily، ولكن الحقل spec.imageFamily يتغير ، يكتشف Karpenter ال NodeClaim كما منحرف ويدور العقدة لتلبية هذه المواصفات.
Important
يراقب Karpenter تغييرات تكوين الشبكة الفرعية ويكتشف الانجراف عند vnetSubnetID تعديل in AKSNodeClass . يعد فهم هذا السلوك أمرا بالغ الأهمية عند إدارة تكوينات الشبكات المخصصة. لمزيد من المعلومات، راجع سلوك انحراف الشبكة الفرعية.
لمزيد من المعلومات، راجع تصميم الانجراف.
فترة سماح الإنهاء
يمكنك تعيين فترة سماح إنهاء لعقد NAP باستخدام spec.template.spec.terminationGracePeriod الحقل الموجود في مواصفات تجمع العقد. يسمح لك هذا الإعداد بتكوين المدة التي ينتظرها كاربنتر حتى تنتهي القرون بأمان. هذا الإعداد له الأسبقية على الكبسولة terminationGracePeriodSeconds والتجاوز PodDisruptionBudgets والتعليق karpenter.sh/do-not-disrupt التوضيحي.
مثال على تكوين فترة سماح الإنهاء
يوضح المثال التالي كيفية تعيين فترة سماح إنهاء مدتها 30 ثانية لعقد NAP:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
template:
spec:
terminationGracePeriod: 30s
ميزانيات الاضطراب
يمكنك تقييم الحد من تعطيل Karpenter عن طريق تعديل الحقل spec.disruption.budgets في مواصفات تجمع العقدة. إذا تركت هذا الإعداد غير محدد، فإن Karpenter يقوم افتراضيا بموازنة واحدة باستخدام nodes: 10%. تأخذ الميزانيات في الاعتبار العقد التي يتم حذفها لأي سبب من الأسباب ، وهي تمنع Karpenter فقط من الاضطرابات الطوعية من خلال انتهاء الصلاحية والانجراف والفراغ والتوحيد.
عند حساب ما إذا كانت الميزانية تمنع العقد من التعطيل ، يقوم Karpenter بحساب إجمالي العقد المملوكة لتجمع العقد ثم طرح العقد التي يتم حذفها والعقد التي يتم حذف NotReady. إذا تم تكوين الموازنة بقيمة مئوية، مثل 20%، يقوم Karpenter بحساب عدد التعطلات المسموح بها ك allowed_disruptions = roundup(total * percentage) - total_deleting - total_notready. بالنسبة للميزانيات المتعددة في تجمع العقد، يأخذ Karpenter الحد الأدنى (الأكثر تقييدا) لكل ميزانية.
حقول الجدول الزمني والمدة
عند استخدام الموازنات، يمكنك اختياريا تعيين schedule الحقول و duration لإنشاء ميزانيات مستندة إلى الوقت. تسمح لك هذه الحقول بتحديد نوافذ الصيانة أو أطر زمنية محددة عندما تكون حدود التعطيل أكثر صرامة.
- يستخدم الجدول بناء جملة وظيفة cron مع وحدات ماكرو خاصة مثل
@yearly،@monthly،@weekly،@daily.@hourly - تسمح المدة بمدد مركبة مثل
10h5m،30mأو أو160h. يجب تحديد المدة والجدول الزمني معا.
أمثلة على الجدول الزمني والمدة
ميزانية نافذة الصيانة
منع الانقطاعات أثناء ساعات العمل:
budgets:
- nodes: "0"
schedule: "0 9 * * 1-5" # 9 AM Monday-Friday
duration: 8h # For 8 hours
اضطرابات عطلة نهاية الأسبوع فقط
السماح بحدوث اضطرابات في عطلات نهاية الأسبوع فقط:
budgets:
- nodes: "50%"
schedule: "0 0 * * 6" # Saturday midnight
duration: 48h # All weekend
- nodes: "0" # Block all other times
ميزانية الطرح التدريجي
السماح بزيادة معدلات التعطيل:
budgets:
- nodes: "1"
schedule: "0 2 * * *" # 2 AM daily
duration: 2h
- nodes: "3"
schedule: "0 4 * * *" # 4 AM daily
duration: 4h
أمثلة على تكوين الموازنة
تحتوي المواصفات التالية NodePool على ثلاث ميزانيات مهيأة:
- تسمح الميزانية الأولى بتعطيل 20% من العقد المملوكة لتجمع العقدة في وقت واحد.
- تعمل الميزانية الثانية كسقف ، ولا تسمح إلا بخمسة اضطرابات عندما يكون هناك أكثر من 25 عقدة.
- تمنع الميزانية الأخيرة الاضطرابات خلال أول 10 دقائق من كل يوم.
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
expireAfter: 720h # 30 * 24h = 720h
budgets:
- nodes: "20%" # Allow 20% of nodes to be disrupted
- nodes: "5" # Cap at maximum 5 nodes
- nodes: "0" # Block all disruptions during maintenance window
schedule: "@daily" # Scheduled daily
duration: 10m # Duration of 10 minutes
تعطيل العقدة اليدوي
يمكنك تعطيل عقد NAP يدويا باستخدام kubectl الموارد أو عن طريق حذفها NodePool .
إزالة العقد باستخدام kubectl
يمكنك إزالة العقد يدويا باستخدام الأمر kubectl delete node . يمكنك حذف عقد معينة أو جميع العقد المدارة بواسطة NAP أو العقد من تجمع عقد معين باستخدام التسميات، على سبيل المثال:
# Delete a specific node
kubectl delete node $NODE_NAME
# Delete all NAP-managed nodes
kubectl delete nodes -l karpenter.sh/nodepool
# Delete nodes from a specific nodepool
kubectl delete nodes -l karpenter.sh/nodepool=$NODEPOOL_NAME
حذف NodePool الموارد
يمتلك NodePoolNodeClaims من خلال مرجع المالك. تقوم NAP بإنهاء العقد بأمان من خلال الحذف المتتالي عند حذف ملف NodePool.
التحكم في التعطيل باستخدام التعليقات التوضيحية
يمكنك حظر التعطيل أو تعطيله لجراب أو عقد أو تجمعات عقد كاملة معينة باستخدام التعليقات التوضيحية.
عناصر التحكم في Pod
منع NAP من تعطيل جراب معينة عن طريق تعيين التعليق karpenter.sh/do-not-disrupt: "true" التوضيحي:
apiVersion: apps/v1
kind: Deployment
spec:
template:
metadata:
annotations:
karpenter.sh/do-not-disrupt: "true"
يمنع هذا التعليق التوضيحي التعطيل الطوعي لانتهاء الصلاحية والدمج والانجراف. ومع ذلك ، فإنه لا يمنع التعطيل من الأنظمة الخارجية أو التعطيل اليدوي من خلال kubectl أو NodePool الحذف.
عناصر تحكم العقدة
منع NAP من تعطيل عقد معينة:
apiVersion: v1
kind: Node
metadata:
annotations:
karpenter.sh/do-not-disrupt: "true"
عناصر تحكم تجمع العقدة
تعطيل التعطيل لجميع العقد في NodePool:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
template:
metadata:
annotations:
karpenter.sh/do-not-disrupt: "true"
الخطوات التالية
لمزيد من المعلومات حول التوفير التلقائي للعقدة في AKS، راجع المقالات التالية: