我正在试验K8s 1.4 pod亲和力 - 抗亲和力。我试图让K8s尽可能地在同一节点上将相同服务的pod聚集在一起(即,如果不能在服务已经存在的节点上放置更多,则仅转到下一个节点)。为此,我设置了:
硬性(requiredDuringScheduling
)反亲和关系,以排除已运行不同服务的地方(pod_label_xyz
不在[value-a]
)
尝试运行相同服务(preferredDuringScheduling
中的pod_label_xyz
) - 权重100
[value-a]
)亲和力
软件(preferredDuringScheduling
)反亲和力,尝试不运行相同服务尚未运行的地方(pod_label_xyz
不存在) - 重量100
当有5个节点和3个服务时pod_label_xyz
& (value-a
,value-b
,value-c
),每个使用复制控制器创建一个pod,第一个pod正确安排,当扩展其中任何一个时,第一个硬规则受到尊重K8S。但是,第2和第3(实际上是第2个冗余)不受尊重。我看到当我向上扩展时,K8尝试将pod推送到空节点(未被任何其他服务使用),即使有能力安排更多服务已经运行的地方。实际上,如果我进一步扩展,则会在原始节点以及新节点(以前未使用的节点)上创建新的pod。
请告知我是否遗漏了某些内容
谢谢
这是我使用的注释
scheduler.alpha.kubernetes.io/affinity: >
{
"podAffinity":{
"preferredDuringSchedulingIgnoredDuringExecution":[
{
"weight":100,
"podAffinityTerm":{
"labelSelector":{
"matchExpressions":[
{
"key":"pod_label_xyz",
"operator":"Exists"
},
{
"key":"pod_label_xyz",
"operator":"In",
"values":[
"value-a"
]
}
]
},
"namespaces":[
"sspni-882-frj"
],
"topologyKey":"kubernetes.io/hostname"
}
}
]
},
"podAntiAffinity":{
"requiredDuringSchedulingIgnoredDuringExecution":[
{
"labelSelector":{
"matchExpressions":[
{
"key":"pod_label_xyz",
"operator":"Exists"
},
{
"key":"pod_label_xyz",
"operator":"NotIn",
"values":[
"value-a"
]
}
]
},
"namespaces":[
"sspni-882-frj"
],
"topologyKey":"kubernetes.io/hostname"
}
],
"preferredDuringSchedulingIgnoredDuringExecution":[
{
"weight":100,
"podAffinityTerm":{
"labelSelector":{
"matchExpressions":[
{
"key":"pod_label_xyz",
"operator":"DoesNotExist"
}
]
},
"namespaces":[
"sspni-882-frj"
],
"topologyKey":"kubernetes.io/hostname"
}
}
]
}
}