我不能真正理解topologyKey在pod affinity中的用途和用法。文档中说:
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
那么topology.kubernetes.io/zone在哪里呢?从何而来?我怎么知道我应该为这个拓扑提供什么值呢?字段,如果我在这里放一个随机字符串会发生什么?我是否应该标记我的节点并在topologyKey字段中使用该标签的键?
谢谢。
必需作为affinity.podAffinity的一部分或affinity.podAntiAffinityspec部分,拓扑键字段用于调度器确定Pod放置的域。
topologyKey域用于确定正在调度的pod相对于…部分。
与<<p> strong> podAffinity , Pod将与匹配表达式的Pod在同一域中调度。两个常见的标签选项是topology.kubernetes.io/zone和kubernetes.io/主机名。其他的可以在Kubernetes知名标签、注解和Taints文档中找到。
- topology.kubernetes.io/区: Pod将被安排在与匹配表达式的Pod在同一区域中。
- kubernetes.io/主机名: Pod将与匹配表达式的Pod在相同的主机名
。podAntiAffinity,则相反:pod将不会与匹配表达式的pod在同一域中被调度。
Kubernetes文档assign Pods to Nodes文档(pod间亲和和反亲和部分)提供了额外的解释。
拓扑键实际上只是您分配给节点或云提供商已经分配的标签。
目的是指示某些拓扑特征,例如可用性区域或服务器机架。但它们实际上是任意的。
在这里有文档。
例如,您希望将pod分布到3个不同的可用性区域。拓扑键可以帮助您实现这一点,因为它可以防止它们被随机安排在同一区域。
以下是文档中的两个例子:
例如,您可以使用requiredDuringSchedulingIgnoredDuringExecution关联来告诉调度器将两个服务的pod放在同一个云提供商区域中,因为它们彼此通信很多。类似地,你可以使用preferredDuringSchedulingIgnoredDuringExecution反亲和来将pod从一个服务扩展到多个云提供商区域。
topology.kubernetes。Io/zone只有在使用云提供商时才会设置。但是,如果在您的拓扑结构中有意义,您应该考虑在节点上设置此属性。
在这里有记录。
# This is an example of the values from an AWS cluster
❯ k get nodes --show-labels | awk '{print $6}' | tr ',' 'n' | grep topology
topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1a
topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1a
topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1a
topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1a
topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1b
topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1c
您可以使用beta.kubernetes.io/instance-type=t3.medium
,例如,如果它在您的亲和规则中有意义,并且您希望将instance-type=t3.medium
的所有节点视为相同的拓扑。