一、什么是拓扑域和拓扑键¶
在Kubernetes中,拓扑域(Topology Domain)通常用于标识一组具有相似属性、相似网络特性的节点,这些节点通常位于同一个物理位置或者某个网络子网中。拓扑域一般用于亲和力配置,用于优化资源分配和提高系统的高可用性等。
在一个超大规模的集群中,可以使用拓扑域用来标记节点所在的机房、子网等信息。拓扑域的划分非常简单,只需要给节点添加一些标签即可,也就是同样的标签(ky和value均相同)表示属于同一个拓扑域。
拓扑键(Topology Key):用于指定拓扑域,比如指定Topology Key为failure-domain.beta.kubernetes.io/zone,即表示按照具有该标签的拓扑域作为作用范围。
拓扑域,主要针对宿主机,相当于对宿主机进行区域的划分。用label进行判断,不同的key和不同的value是属于不同的拓扑域.
二、拓扑域分类¶
2.1 基于主机划分拓扑域¶

分类依据:以 Kubernetes 集群内的节点唯一标识(kubernetes.io/hostname)划分,每个节点(如 k8s-master01、k8s-node01)独立为一个拓扑域。
用途:
- 精细化管理单个节点的资源调度,例如通过节点亲和性 / 反亲和性策略,控制 Pod 在特定节点上的部署。
- 监控和排查单个节点的故障(如硬件问题、资源耗尽),确保节点级故障不会影响整个集群服务。
典型场景:在集群内,针对不同节点的硬件配置(如计算型、存储型节点),分配对应类型的 Pod,优化资源利用效率。
2.2 基于多区域划分拓扑域¶

分类依据:以地理区域划分拓扑域,通过标签(如 region=beijing、region=nanjing)标识不同地域。
用途:
- 适用于多地域分布式部署,例如在不同城市(北京、南京)部署服务,实现跨地域容灾。
- 应对大规模地理范围的故障(如城市级网络中断、自然灾害),确保某个地域故障时,其他地域的服务仍可运行。
典型场景:跨国或跨城市的业务布局,通过分散部署提升服务可用性,同时减少用户访问延迟(如就近接入)。
2.3 基于数据中心划分拓扑域¶

分类依据:在同一地理区域内,按数据中心或机房分区划分,通过标签(如 zone=chaoyang、zone=haidian)标识不同可用区。
用途:
- 实现同城多数据中心容灾,避免单一数据中心故障(如电力中断、网络故障)导致服务不可用。
- 在 Kubernetes 中,可结合资源调度策略,将 Pod 分散到不同可用区,提升服务高可用性。
典型场景:大型企业的同城双活 / 多活架构,例如在同一城市的多个数据中心(朝阳、海淀)部署集群,保障业务连续性。
三、拓扑域划分¶
在一个超大规模的集群中,可以使用不同的区域和可用区划分拓扑,同时可以精确到数据中心或机房,甚至某个机柜。
比如按照区域划分拓扑域:
# 定义k8s-master01和k8s-node01节点为一个拓扑域
kubectl label node k8s-master01 k8s-node01 region=beijing
# 定义k8s-node02节点为一个拓扑域
kubectl label node k8s-node02 region=nanjing
同时如果一个区域具备多个数据中心,也可以按照可用区进行再次划分,比如北京区域有两个数据中心位于海淀和朝阳
kubectl label node k8s-master01 zone=beijing-haidian
kubectl label node k8s-node01 zone=beijing-chaoyang
如果需要进一步划分,可以按照不同机房进行划分拓扑域,比如海淀的可用域机器处于不同的机房:
kubectl label node k8s-master01 engineroom=beijing-haidian-c1