خطأ عميل Kubernetes Python خطأ create_namespaced_binding: (409) السبب: تعارض

0

أنا باستخدام k8 v1.7 وعميل Python v2.0. يكتشف برنامج الجدولة المخصص الخاص بي جرابًا معلقًا ويجدوله بنجاح. ومع ذلك ، بعد تعيين جراب للعقدة ، فإنه يشكو من أن جراب معين بالفعل إلى عقدة على الرغم من أنه تم تعيينه فقط من قبل المجدول نفسه. هل هذا شيء يثير القلق؟ أو كيف يمكنني إصلاح هذا؟

رسالة خطأ

create_namespaced_binding: (409)
Reason: Conflict
HTTP response headers: HTTPHeaderDict({'Date': 'Tue, 19 Jun 2018 16:14:57 GMT', 'Content-Length': '289', 'Content-Type': 'application/json'})
HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Operation cannot be fulfilled on pods/binding \"ps0-16-r935x\": pod ps0-16-r935x is already assigned to node \"blipp65\"","reason":"Conflict","details":{"name":"ps0-16-r935x","kind":"pods/binding"},"code":409}

Scheduler.py

from kubernetes import client, config, watch
from kubernetes.client.rest import ApiException
config.load_kube_config()
v1 = client.CoreV1Api()

scheduler_name = 'my-custom-scheduler-v1'

def nodes_available():
    ready_nodes = []
    for n in v1.list_node().items:
        for status in n.status.conditions:
            if status.status == 'True' and status.type == 'Ready':
                ready_nodes.append(n.metadata.name)
    return ready_nodes


def scheduler(name, node, namespace='default'):
    body = client.V1Binding()

    target = client.V1ObjectReference()
    target.kind = 'Node'
    target.apiVersion = 'v1'
    target.name = node

    meta = client.V1ObjectMeta()
    meta.name = name

    body.target = target
    body.metadata = meta

    return v1.create_namespaced_binding_binding(name, namespace, body)


def main():
    w = watch.Watch()
    for event in w.stream(v1.list_namespaced_pod, 'default'):
        if event['object'].status.phase == 'Pending' and event['object'].spec.scheduler_name == scheduler_name:
            print "Pending Found"
            try:
                res = scheduler(event['object'].metadata.name,random.choice(nodes_available()))
                print "success"
            except Exception as a:
                print ("Exception when calling CoreV1Api->create_namespaced_binding: %s\n" % a)

ملف POD YML

apiVersion: v1
kind: Pod
metadata:
  name: shoeb-pod
spec:
  schedulerName: my-custom-scheduler-v1
  containers:
  - name: redis
    image: redis

تم التحديث في 2019-06-03

لقد أضفت للتو الطريقة الرئيسية المحدثة (وفقًا لإجابة @ VAS ، شكرًا) للعثور على الحق PENDING جراب لم يتم تحديد موعده بعد. يرجى الاطلاع على إجابتي.

2 الاجابة

1
افضل جواب

عند إنشاء جراب ، يحصل المجدول على ثلاثة أحداث "معلقة":

  1. جراب لم يتم تحديد موعده بعد ( 'node_name': None, 'status': {'conditions': None,...} )
  2. من المقرر جراب ( 'node_name': 'some_node_name','status': {'conditions': [...,'status': True, 'type':'PodScheduled'],...} )
  3. تمت تهيئة Pod ولكنها ليست جاهزة بعد ( 'node_name': 'minikube','status': {'conditions': [...,'status': True, 'type':'Initialized'], ... ,'status': False, 'type':'Ready']} )

لذلك ، يجب أن يقوم المجدول المخصص لديك بربط pod بالعقدة في الحدث الأول ، والتحقق من حالة pod والتأكد من أنه تمت جدولته عند ظهور الحدث الثاني ، ثم تحقق مما إذا تمت تهيئة pod عند ظهور الحدث الثالث.

إذا حدث خطأ ما ، فقد يحتاج المجدول إلى مراعاة الأخطاء السابقة وربما يحاول جدولة الجراب إلى عقد مختلفة.

في حالتك ، يهدد الجدول الزمني الخاص بك جميع الأحداث الثلاثة مثل الحدث الأول ويحاول جدولة اللوحة مرة تلو الأخرى. لهذا السبب ترى أن " pod xxx is already assigned to node yyy "خطأ.

:مؤلف
0

فيما يلي الطريقة الرئيسية المحدثة (وفقًا لإجابة @ VAS ، شكرًا) للعثور على الحق PENDING جراب لم يتم تحديد موعده بعد.

def main():
    w = watch.Watch()
    for event in w.stream(v1.list_namespaced_pod, 'default'): # default == namespace name
        # All pending pods have 3 states (not scheduled, scheduled, initialized but not ready yet)
        # We look for NOT SCHEDULED pod and conditions==None
        if event['object'].status.phase == 'Pending' and event['object'].status.conditions == None and event['object'].spec.scheduler_name == CUSTOM_SCHEDULER_NAME:
            print "Pending and Not Scheduled POD Found "+event['object'].metadata.name
            try:
                res = scheduler(event['object'].metadata.name,random.choice(nodes_available())) # nodes_available() returns all available nodes
                print "success"
            except Exception as a:
                print ("Exception when calling CoreV1Api->create_namespaced_binding: %s\n" % a)
:مؤلف
فوق
قائمة طعام