在分配 POD 之前,调度程序根据节点(或节点标签)检查不同的 cpu 请求来选择节点
不使用默认调度程序,最接近的选项是使用Marcin 建议的节点亲和性,因此您可以根据节点标签选择节点。如下所示:
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: podname
image: k8s.gcr.io/pause:2.0
在这种情况下,您将使用标签标记节点以识别它们的类型或用途,例如:db、cache、web等。然后设置关联性以匹配您期望的节点类型。
requiredDuringSchedulingIgnoredDuringExecution
表示如果不满足条件,将不会在节点中调度 Pod。
preferredDuringSchedulingIgnoredDuringExecution
意味着调度程序将尝试找到一个也符合该条件的节点,但如果没有符合指定条件的节点,它将在任何可能的地方调度该 pod。
您的另一种选择是编写您的自定义调度程序。
apiVersion: v1
kind: Pod
metadata:
name: annotation-default-scheduler
labels:
name: multischeduler-example
spec:
schedulerName: default-scheduler
containers:
- name: pod-with-default-annotation-container
image: k8s.gcr.io/pause:2.0
Kubernetes 附带了一个默认调度程序,此处描述。如果默认调度程序不适合您的需要,您可以实现自己的调度程序。这样你可以编写一个复杂的调度逻辑来决定每个 POD 应该去哪里,只推荐用于使用默认调度程序不可能的事情
请记住,Kubernetes 中最重要的组件之一是调度程序,默认调度程序经过实战测试,非常灵活,可以处理大多数应用程序。编写自己的调度程序会失去默认调度程序提供的功能,例如负载平衡、策略、过滤。要了解有关默认调度程序提供的功能的更多信息,请查看此处的文档。
如果您愿意冒险并想编写自定义调度程序,请查看此处的文档。
在运行时,Kublet 根据节点(或节点标签)检查特定的 cpu 限制
在收到分配 pod 的请求之前,调度程序会检查节点中的资源可用性,然后将 pod 分配给节点。每个节点都有自己的 kubelet,它检查应该在该节点中初始化的 pod,kubelet 唯一要做的就是启动这些 pod,它不决定应该去哪个节点。
Kubelet 还会在初始化 POD 之前检查资源,如果 kubelet 无法初始化 pod,它将失败,调度程序将采取行动将 pod 调度到其他地方。