一、什么是拓扑域和拓扑键

在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-master01k8s-node01)独立为一个拓扑域。

用途:

  • 精细化管理单个节点的资源调度,例如通过节点亲和性 / 反亲和性策略,控制 Pod 在特定节点上的部署。
  • 监控和排查单个节点的故障(如硬件问题、资源耗尽),确保节点级故障不会影响整个集群服务。

典型场景:在集群内,针对不同节点的硬件配置(如计算型、存储型节点),分配对应类型的 Pod,优化资源利用效率。

2.2 基于多区域划分拓扑域

亲和力分类-基于多区域划分拓扑域

分类依据:以地理区域划分拓扑域,通过标签(如 region=beijingregion=nanjing)标识不同地域。

用途:

  • 适用于多地域分布式部署,例如在不同城市(北京、南京)部署服务,实现跨地域容灾。
  • 应对大规模地理范围的故障(如城市级网络中断、自然灾害),确保某个地域故障时,其他地域的服务仍可运行。

典型场景:跨国或跨城市的业务布局,通过分散部署提升服务可用性,同时减少用户访问延迟(如就近接入)。

2.3 基于数据中心划分拓扑域

亲和力分类-基于数据中心划分拓扑域

分类依据:在同一地理区域内,按数据中心或机房分区划分,通过标签(如 zone=chaoyangzone=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