6

Kubernetes 允许为 POD 指定 CPU限制和/或请求

CPU 资源的限制和请求以cpu 单位衡量。在 Kubernetes 中,一个 cpu 相当于:

1 AWS vCPU
1 GCP Core
1 Azure vCore
1 IBM vCPU
1 Hyperthread on a bare-metal Intel processor with Hyperthreading

不幸的是,当使用异构集群时(例如使用不同的处理器),cpu 限制/请求取决于分配 POD 的节点;特别是对于实时应用程序。

如果我们假设:

  • 我们可以为集群的每种硬件计算 POD 的微调 cpu 限制
  • 我们想让 Kubernetes 调度器在整个集群中选择一个匹配的节点

有没有办法启动 POD,以便 cpu 限制/请求取决于 Kubernetes 调度程序(或节点标签)选择的节点?

获得的行为应该是(或等同于):

  • 在分配 POD 之前,调度程序根据节点(或节点标签)检查不同的 cpu 请求来选择节点
  • 在运行时,Kublet 根据节点(或节点标签)检查特定的 cpu 限制
4

2 回答 2

2

不,每个节点类型不能有不同的请求。您可以做的是创建一个具有特定类型节点的节点亲和性的 pod 清单,以及对该节点类型有意义的请求。对于第二种节点,您将需要第二个对该节点类型有意义的 pod 清单。这些 pod 清单仅在它们的亲和性规范和资源请求方面有所不同——因此参数化它们会很方便。您可以使用 Helm 执行此操作,或者编写一个简单的脚本来执行此操作。

这种方法可以让您在节点的子集中启动一个 pod,资源请求在这些节点上是有意义的,但是无法根据其结束位置全局调整其请求/限制。

于 2018-08-14T21:19:32.360 回答
0

在分配 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 调度到其他地方。

于 2020-05-06T15:14:31.627 回答