kubernetes 缩减部署违反了定义的关联规则

wgx48brx  于 2023-04-20  发布在  Kubernetes
关注(0)|答案(1)|浏览(109)

场景

我有一个带有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:

  1. Pod状态
  2. controller.kubernetes.io/pod-deletion-cost
    1.副本多的节点上的Pod优先于副本少的节点上的Pod。
  3. Pod创建时间

解决方案

我找到了一个解决方案。使用以下说明逐步缩减部署可以正常工作,并留下一个事件分布式部署的集群:

  1. kubectl scale deployment nginx --replicas 11
  2. kubectl scale deployment nginx --replicas 10
  3. kubectl scale deployment nginx --replicas 9
  4. kubectl scale deployment nginx --replicas 8
  5. kubectl scale deployment nginx --replicas 7
  6. kubectl scale deployment nginx --replicas 6
q1qsirdb

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/

相关问题