1. 从Topology Manager说起
1.1 Topology Manager简介及原理
Topology Manager是kubelet的特性,Kubernetes 1.18版本已经默认开启,解决了NUMA架构CPU对齐的问题。
该特性通过TopologyHint(拓扑提示)这个核心结构体,告诉kubelet该节点是否是优先考虑的,如果不是,则拒绝这个Pod,Pod状态更新为Terminated。拓扑提示的结构体如下
type TopologyHint struct {
NUMANodeAffinity bitmask.BitMask
Preferred bool
}
NUMANodeAffinity是基于bitmask表示的numa节点组合,如果node节点有两个numa节点,则有3种组合情况,用bitmask表示为[01],[10],[11],分别代表numa node1、numa node2、numa node1+node2。
Preferred 则表示该组合是否推荐给该Pod。
比如节点有两个numa node,每个node上2个cpu,pod请求2个cpu,则以上3个组合分别对应如下:
1)
TopologyHint.NUMANodeAffinity = [01]
TopologyHint.Preferred = true
表示从numa 0分配2个cpu给Pod,具有最少numa node,因此推荐;
2)
TopologyHint.NUMANodeAffinity = [10]
TopologyHint.Preferred = true
表示从numa 1分配2个cpu给Pod,具有最少numa node,因此推荐;
3)
TopologyHint.NUMANodeAffinity = [11]
TopologyHint.Preferred = false
表示从numa 0、1各分配1个cpu给Pod, 需要两个numa node,因此不推荐;
如果numa node1 和 node1各只剩下一个cpu,那么要满足该Pod的cpu数量请求,不得不占有两个numa node,此时,会根据kubelet配置到启动参数来决定是否推荐
--topology-manager-policy string
[Valid values: single-numa-node, best-effort, restricted] (default "restricted")
如上参数,如果配置的value为single-numa-node,则会拒绝该Pod。各个策略的含义如下
其中最后一个要求严格的numa对齐,也就是必须保证所有cpu都分配在同一个numa node
● none:不开启Topology Manager
● best-effort: 尽可能的根据TopologyHint找到合适的组合,没找到也可以。
● restricted:根据TopologyHint找到合适的组合,没找到则拒绝Pod。
● single-numa-node:根据TopologyHint找到合适的组合,并且必须只占用一个numa node,没找到则拒绝Pod。
1.2. Topology Manager的局限性
Topology Manager的实现,最大的弊端是调度器并不能感知到节点的numa拓扑信息,调度器任务节点资源比如cpu数量符合Pod的要求,但是kubelet根据Topology Manager判断不符合topology策略,会拒绝该Pod,导致Pod无法精准被调度到合适的Node节点。
社区曾经引入NodeResourceTopology CRD API (已经合入staging),让内置的kube-scheduler感知节点资源拓扑信息,但是后来考虑到该解决方案需要将CRD API 转换为build-in API,在实现机制上会有问题,所以NodeResourceTopology CRD API又从staging去掉了。
2. 基于调度的NUMA拓扑感知
2.1 原理简介
其实现机制为,Node Feature Discovery采集节点上的拓扑信息,并更新到CRD NodeResourceTopology,拓扑感知调度器读取CRD NodeResourceTopology,达到精准筛选节点的目的。
2.2 服务部署及使用
1)Node Feature Discovery(NFD)
export NFD_NS=node-feature-discovery
helm repo add nfd https://kubernetes-sigs.github.io/node-feature-discovery/charts
helm repo update
helm install nfd/node-feature-discovery --namespace $NFD_NS --create-namespace --generate-name
2)Topology Aware Scheduling
$ git clone git@github.com:kubernetes-sigs/scheduler-plugins.git
$ cd scheduler-plugins/manifests/install/charts
$ helm install scheduler-plugins as-a-second-scheduler/ --create-namespace --namespace scheduler-plugins
3)使用方式
在创建workload的时候,调度器名称选择上述调度器,即可自动实现基于调度器的numa拓扑感知能力。