场景
我有一个带有3个工作节点的k8s集群(v1.22.17)和一个带有12个副本的部署。该部署定义了一个podAntiAffinity
规则,并配置了preferredDuringSchedulingIgnoredDuringExecution
,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 12
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: nginx
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
集群上的pod分布遵循podAntiAffinity
,它类似于以下内容:
| 节点1|节点2|节点3|
| --------------|--------------|--------------|
| nginx-1,nginx-4,nginx-7,nginx-10|nginx-2,nginx-5,nginx-8,nginx-11|nginx-3,nginx-6,nginx-9,nginx-12|
然而,当我尝试使用kubectl scale deployment nginx --replicas 6将副本缩减到6个时,违反了podAntiAffinity
策略,我得到了这样的pod分发:
| 节点1|节点2|节点3|
| --------------|--------------|--------------|
| nginx-1,nginx-4,nginx-7,nginx-10|nginx-2,nginx-5,nginx-8,nginx-11|nginx-3,nginx-6,nginx-9,nginx-12|
问题
我如何才能有一个事件分布式部署?每个节点应该有2个部署的副本。为什么nginx-9没有被终止,而nginx-5被终止?
根据k8s ReplicaSet文档,ReplicaSet控制器根据以下条件选择要删除的Pod:
- Pod状态
controller.kubernetes.io/pod-deletion-cost
1.副本多的节点上的Pod优先于副本少的节点上的Pod。- Pod创建时间
解决方案
我找到了一个解决方案。使用以下说明逐步缩减部署可以正常工作,并留下一个事件分布式部署的集群:
- kubectl scale deployment nginx --replicas 11
- kubectl scale deployment nginx --replicas 10
- kubectl scale deployment nginx --replicas 9
- kubectl scale deployment nginx --replicas 8
- kubectl scale deployment nginx --replicas 7
- kubectl scale deployment nginx --replicas 6
1条答案
按热度按时间q1qsirdb1#
Scheduler是决定如何以及在何处重新分配Pod的组件(基于诸如污染/容忍、nodeAffinity等约束以及可用资源)。
https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/#synopsis
你分享的模式可能会随机改变。
调度决策需要考虑的因素包括个体和集体资源要求、硬件/软件/策略约束、亲和性和反亲和性规范、数据局部性、工作负载间干扰等。
https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/
要对Scheduler有更多的控制,我建议您将Nodes专用于指定的应用程序,并通过考虑插入 percentageOfNodesToScore 值进行一些调优。
https://kubernetes.io/docs/concepts/scheduling-eviction/scheduler-perf-tuning/