pod 亲和力中的topologyKey 是什么?

yra*_*lik 21 kubernetes

我无法真正理解pod亲和力中topologyKey的目的和用法。文件说:

TopologyKey是节点标签的键。如果两个节点都标有此键并且该标签具有相同的值,则调度程序会将这两个节点视为处于同一拓扑中。调度程序尝试将均衡数量的 Pod 放入每个拓扑域中。

示例用法如下:

kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          topologyKey: topology.kubernetes.io/zone
  containers:
  - name: with-pod-affinity
    image: k8s.gcr.io/pause:2.0
Run Code Online (Sandbox Code Playgroud)

那么topology.kubernetes.io/zone从哪里来呢?我如何知道我应该在 yaml 文件中为这个TopologyKey字段提供什么值,以及如果我只是在此处放置一个随机字符串会发生什么?我应该标记我的节点并在topologyKey字段中使用该标签的键吗?

谢谢。

Dre*_*rew 21

作为affinity.podAffinityaffinity.podAntiAffinity 规范部分的一部分,topologyKey字段是必需的,调度程序使用topologyKey 字段来确定Pod 放置的域。

topologyKey用于确定正在调度的 Pod 相对于...labelSelector.matchExpressions部分标识的 Pod 的相对位置。

使用podAffinity,Pod被调度在与匹配表达式的 Pod 相同的域中。

两个常见的标签选项是topology.kubernetes.io/zonekubernetes.io/hostname其他内容可以在 Kubernetes知名标签、注释和污点文档中找到。

  • topology.kubernetes.io/zone:Pod 将被调度到与表达式匹配的 Pod所在的区域中。
  • kubernetes.io/hostname:Pod 将被调度到与表达式匹配的 Pod相同的主机名上。

对于podAntiAffinity,情况正好相反:Pod不会被调度到与表达式匹配的 Pod 相同的域中。

Kubernetes 文档将 Pod 分配给节点文档(Pod 间亲和性和反亲和性部分)提供了额外的解释。


The*_*ool 11

拓扑键实际上只是您分配给节点或云提供商已分配的标签。

目的是指示某些拓扑特征,例如可用区域或服务器机架。但它们实际上是任意的。

它被记录在这里

例如,您希望将 Pod 分布在 3 个不同的可用区中。拓扑密钥可以帮助您实现这一点,因为它可以防止它们被随机调度在同一区域中。

以下是文档中的 2 个示例:

例如,您可以使用 requiredDuringSchedulingIgnoredDuringExecution 亲和性来告诉调度程序将两个服务的 Pod 共同定位在同一云提供商区域中,因为它们彼此之间进行了大量通信。同样,您可以使用 PreferredDuringSchedulingIgnoredDuringExecution 反关联性将 Pod 从服务传播到多个云提供商区域。