Kubernetes Python 客户端错误 create_namespaced_binding: (409) 原因:冲突 [英] Kubernetes Python Client error create_namespaced_binding: (409) Reason: Conflict

查看:26
本文介绍了Kubernetes Python 客户端错误 create_namespaced_binding: (409) 原因:冲突的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是 k8 v1.7 和 Python 客户端 v2.0.我的自定义调度程序检测到一个挂起的 pod 并成功调度它.但是,在将 pod 分配给节点后,它会抱怨 pod 已经分配给节点,尽管它只是由调度程序本身分配的.这是需要担心的吗?或者我该如何解决这个问题?

I'm using k8 v1.7 and Python Client v2.0. My custom scheduler detects a pending pod and schedules it successfully. However, after assigning a pod to a node, it complains that the pod is already assigned to a node though it is just assigned by the scheduler itself. Is this something to be concerned? Or how can I fix this?

错误信息

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}

调度程序.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 年 6 月 3 日更新

我刚刚添加了更新的 main 方法(根据@VAS 的回答,谢谢)以找到尚未安排的正确 PENDING pod.请看我的回答.

I just added the updated main method (according to @VAS's answer, thanks) to find the right PENDING pod that has not been scheduled yet. Please see my answer.

推荐答案

创建 Pod 时,调度程序会收到三个待处理"事件:

When a pod is created, the scheduler gets three "Pending" events:

  1. Pod 尚未调度 ('node_name': None, 'status': {'conditions': None,...})
  2. Pod 已调度 ('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 是否已初始化.

Therefore, your custom scheduler should bind pod to the node on the first event, check the status of the pod and make sure it is scheduled when the second event appears, and then check if the pod is initialized when the third event appears.

如果出现问题,调度器可能需要考虑之前的错误,并可能尝试将 pod 调度到不同的节点.

If something goes wrong, the scheduler may need to take into account the previous errors and probably try to schedule the pod to different nodes.

在您的情况下,您的调度程序会像第一个事件一样威胁所有三个事件,并尝试一次又一次地调度 pod.这就是为什么您会看到pod xxx 已分配给节点 yyy"错误.

In your case, your scheduler threats all three events like the first one and tries to schedule the pod again and again. That's why you see that "pod xxx is already assigned to node yyy" error.

这篇关于Kubernetes Python 客户端错误 create_namespaced_binding: (409) 原因:冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆