我想实现一个类似功能的重新调度程序,如果它决定可以更好地重新安排pod(基于需要更少数量的节点/拟合等),则基本上会杀死pod。直到现在我已经创建了一个新的kubectl命令,每当我想重新安排时我想运行它。我还查看了文档中的代码和重新安排程序提议。
但是,我无法访问从命令的run
函数(存在于pkg/kubectl/cmd/newCommand.go
中)中确定要杀死哪个pod所需的pod详细信息。我想我可以使用类似kubectl delete
和create
使用的机制杀死并重启pod,但我无法获得所有必需的pod和节点列表。
例如,objs
中的pkg/kubectl/cmd/get.go
变量(用于kubectl get
)包含pod详细信息,但没有关于它们被安排在哪个节点上的数据以及有哪些资源容量那个节点。
如果有人能够了解如何获取这些细节,我将不胜感激。此外,如果在其他地方更容易实现它而不是作为kubectl命令,那么也欢迎这样的建议。
答案 0 :(得分:2)
首先,如果您还没有,请参阅https://github.com/kubernetes/kubernetes/issues/11793#issuecomment-150410114。
我想我可以使用类似于kubectl delete和create使用的机制杀死并重启pod,但我无法获得所有必需的pod和节点列表。
我建议改为编写一个控制循环。当您创建一个存储在主服务器中的容器时,您可以轻松地创建一个Kubernetes客户端来检索此容器,就像Kubernetes调度程序一样。有关如何通过客户端访问api的信息,请参见[1]。考虑到这一点,我建议编写一个控制循环。现有几个例子[2],但是一个非常基本的控制器是Ingress控制器(只是让你不会被生产控制器中的所有代码混淆)[3]。
您将遇到的问题是让Kubernetes调度程序忽略该pod。请参阅有关解决方案的github问题的讨论。
如果您还想要,可以使用您在kubectl中执行的路线。运行:
kubectl get pods -o wide --v = 7
请注意,此输出具有节点名称,kubectl应显示其在此过程中进行的REST调用。我怀疑你很快会遇到问题,因为你真的不想想要创建/删除,因为调度程序很有可能将pod放在同一个节点上。
[1] kubernetes go client used storage of nodes and cluster
[2] https://github.com/kubernetes/kubernetes/tree/master/pkg/controller
[3] https://github.com/kubernetes/contrib/tree/master/Ingress/controllers