在生产环境中使用 Kubernetes 之前,我们应该了解 K8s 的资源管理,资源管理的核心就是 Kubernetes 调度器处理资源请求和限制。

Pod 资源

在 K8s 中,一个 Pod 可以包含一个或多个容器,这些容器通常由 Docker 运行。

Pod 可以看做是容器的外包装,这二者会在同一台机器或节点上运行。一般来说,总的 Pod 资源就等于容器资源的总和。

资源请求和限制

为每个容器制定资源请求和限制,例如:

请求是保证得到的资源,其他 Pod 不可以使用这些资源。限制是允许使用比请求更多的资源。如果容器达到规定的限制,会被 CPU 超售并驱逐出内存。

调度器

K8s 调度器负责确定 Pod 可以在哪个节点上运行,它通过查看各种配置(例如亲和度、taints、tolerations)来实现。这里我们仅关注主要配置:闲置资源(free resources)。当调度器做出有关“闲置资源”的决定时,它会查看两个数据:Node Allocatable 和 Node Requests。

节点的 Allocatable 与容量

调度器会查看节点的 Allocatable,它是整个节点减去 Kubelet 的保留资源。

我们可以这样查看 Allocatable 和容量:

kubectl get node worker1 -oyaml

重要的是,无论节点上运行多少个 Pod,这些数字都不会改变。只要节点通过 kubelet注册,它们就是固定不变的。

根据调度器释放资源

free = node allocatable — sum(all pod resource requests)

这意味着调度器实际上不会直接查看节点或 Pod 的 CPU 和内存使用情况,而只会考虑已请求的内容。

调度器启动

让我们看一下调度器决策工作流程示例,其中有两个节点,它们在刚启动时为空。

蓝色 Pod1 有资源请求,在节点1 上调度

绿色 Pod 在节点 2 上调度

紫色 Pod 在节点 1 上调度

调度器尝试调度节点 2 上的红色 Pod