默认情况下,kubelet 使用 CFS 配额 来执行 pod 的 CPU 约束。当节点上运行了很多 CPU 密集的应用时,工作负载可能会迁移到不同的 CPU 核,工作负载的会受到 CPU 缓存亲和性以及调度延迟的影响。当使用大规格实例类型时,节点的 CPU 数量较多,现有的 Java,Golang 等应用在多 CPU 共享的场景,性能会出现明显下降。所有对于大规格实例,需要对CPU管理策略进行配置,利用 CPU set 进行资源分配。 ^0 p$ g% }# K4 X* ^9 H
此外一个重要的考虑因素就是 NUMA 支持。在 NUMA 开启的物理机实例或者大规格实例上,如果处理不当,内存访问吞吐可能会比优化方式降低了30%。Topology 管理器可以开启 NUMA 感知 kubernetes.io/docs/tasks/… 。但是目前 k8s 对 NUMA 的支持比较简单,还无法充分发挥 NUMA 的性能。4 H/ S" a* x4 ^4 j8 d
选择后者典型的场景是:* l! t+ p, z0 z. Y7 a* S) Q
开发、测试环境使用不同的集群;
不同的部门使用不同的集群进行隔离;
不同的应用使用不同的集群;
不同版本的 k8s 集群。7 z+ u4 ]5 u% L n3 P! Z! a% }
采用以多个小集群的主要原因在于爆炸半径比较小,可以有效提升系统的可用性。同时通过集群也可以比较好地进行资源隔离。管理、运维复杂性的增加是采用多个小集群的一个不足之处。# U5 ] K3 [2 N# L
值得一提的是源自 Google Borg 的理念,Kubernetes 的愿景是成为 Data Center Operating System,而且 Kubernetes 也提供了 RBAC、namespace 等管理能力,支持多用户共享一个集群,并实现资源限制。 但是这些更多是 “软多租” 能力,不能实现不同租户之间的强隔离。在多租户最佳实践中,我们可以有如下的一些建议: 4 h( v( s' k) v! i: v* N& F1 T