Kubernetes K8s吊舱拓扑展开后不受尊重?

Kubernetes K8s吊舱拓扑展开后不受尊重?,kubernetes,Kubernetes,我正在尝试扩展我的ingress nginx控制器pod,以便: 每个可用性区域都有相同的吊舱(+-1) POD更喜欢当前运行最少POD的节点 以下是其他问题,我在Pod部署中设置了Pod拓扑分布约束: replicas: 4 topologySpreadConstraints: - labelSelector: matchLabels: app.kubernetes.io/name: ingress-nginx

我正在尝试扩展我的
ingress nginx控制器
pod,以便:

  • 每个可用性区域都有相同的吊舱(+-1)
  • POD更喜欢当前运行最少POD的节点
以下是其他问题,我在Pod部署中设置了Pod拓扑分布约束:

      replicas: 4
      topologySpreadConstraints:
      - labelSelector:
          matchLabels:
            app.kubernetes.io/name: ingress-nginx
        maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
      - labelSelector:
          matchLabels:
            app.kubernetes.io/name: ingress-nginx
        maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
我目前有2个节点,每个节点位于不同的可用性区域:

$ kubectl get nodes --label-columns=topology.kubernetes.io/zone,kubernetes.io/hostname
NAME                            STATUS   ROLES                  AGE    VERSION   ZONE         HOSTNAME
ip-{{node1}}.compute.internal   Ready    node                   136m   v1.20.2   us-west-2a   ip-{{node1}}.compute.internal
ip-{{node2}}.compute.internal   Ready    node                   20h    v1.20.2   us-west-2b   ip-{{node2}}.compute.internal

在为该部署运行了
kubectl卷展栏restart
之后,我在一个节点中得到了3个pod,在另一个节点中得到了1个pod,其倾斜度为
2>1

$ kubectl describe pod ingress-nginx-controller -n ingress-nginx | grep 'Node:'
Node:         ip-{{node1}}.compute.internal/{{node1}}
Node:         ip-{{node2}}.compute.internal/{{node2}}
Node:         ip-{{node1}}.compute.internal/{{node1}}
Node:         ip-{{node1}}.compute.internal/{{node1}}
为什么不尊重我的约束?如何调试pod调度程序

我的kubectl版本:

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21+", GitVersion:"v1.21.0-beta.0.607+269d62d895c297", GitCommit:"269d62d895c29743931bfaaec6e8d37ced43c35f", GitTreeState:"clean", BuildDate:"2021-03-05T22:28:02Z", GoVersion:"go1.16", Compiler:"gc", Platform:"darwin/arm64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:20:00Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

让评论更具可视性:

守护进程运行起来非常简单。它不适用于每个节点有几个吊舱的部署,但是有一些缓解措施(descheduler),它应该随着集群的增长自行解决

<强>请考虑此解决方案作为解决方案< /强>:

守护程序集确保所有(或部分)节点都运行一个Pod副本。当节点添加到集群中时,Pod也会添加到集群中。当节点从集群中移除时,这些吊舱将被垃圾收集。删除守护程序将清理它创建的POD

--

例如:

apiVersion:apps/v1 种类:守护进程 元数据: 姓名:nginx 规格: 选择器: 火柴标签: 姓名:nginx 模板: 元数据: 标签: 姓名:nginx 规格: #节点选择器: #日程安排:这里 容忍: #这种容忍是让守护程序在主节点上运行 #如果你的主人不能运行吊舱,移除它 -关键字:node-role.kubernetes.io/master 影响:无时间表 容器: -姓名:nginx 图片:nginx
此定义将在集群中的每个
节点上生成
Pod
。通过指定
节点选择器
,可以进一步限制
Pod
调度

假设您有一些控制器/逻辑负责用特定标签标记节点,您可以在特定节点上调度
Pods
。在上述清单中注释掉了负责该零件的零件:

      nodeSelector: 
          schedule: here 
节点(
raven sgdm
raven xvvw
已标记):


额外资源:


    • 让评论更具可视性:

      守护进程运行起来非常简单。它不适用于每个节点有几个吊舱的部署,但是有一些缓解措施(descheduler),它应该随着集群的增长自行解决

      <强>请考虑此解决方案作为解决方案< /强>:

      守护程序集确保所有(或部分)节点都运行一个Pod副本。当节点添加到集群中时,Pod也会添加到集群中。当节点从集群中移除时,这些吊舱将被垃圾收集。删除守护程序将清理它创建的POD

      --

      例如:

      apiVersion:apps/v1 种类:守护进程 元数据: 姓名:nginx 规格: 选择器: 火柴标签: 姓名:nginx 模板: 元数据: 标签: 姓名:nginx 规格: #节点选择器: #日程安排:这里 容忍: #这种容忍是让守护程序在主节点上运行 #如果你的主人不能运行吊舱,移除它 -关键字:node-role.kubernetes.io/master 影响:无时间表 容器: -姓名:nginx 图片:nginx
此定义将在集群中的每个
节点上生成
Pod
。通过指定
节点选择器
,可以进一步限制
Pod
调度

假设您有一些控制器/逻辑负责用特定标签标记节点,您可以在特定节点上调度
Pods
。在上述清单中注释掉了负责该零件的零件:

      nodeSelector: 
          schedule: here 
节点(
raven sgdm
raven xvvw
已标记):


额外资源:


我目前的理论是,吊舱扩展拓扑也可以解释上一次推出的吊舱。在所有新的吊舱运行后,k8s将终止一些可能导致不平衡的先前的卷展吊舱。您能提供您的吊舱yaml吗?或者更好,如果部署yaml@SahadatHossain在这里,这是一个amazon nginx入口清单,编辑很少:我确实发现其他人描述了相同的问题:我能够通过将部署扩展到1个副本,然后再扩展到4个副本来获得正确的拓扑。如果推出后的不良拓扑确实是根本原因,我可能会将kubernetes descheduler作为一种缓解措施。@roim您能告诉我您的集群是如何创建的吗?它是一个自我管理的解决方案还是一个供应商管理的解决方案(amazon nginx ingress
是否有可能表明这是
EKS
?另外,作为一种解决方法,您是否考虑过使用
守护程序集
?不同之处在于,每个
节点上都会有
Pod
,而不是区域中的
Pod
。@DawidKruk集群是自托管的,由KOP创建,我安装了nginx入口,并带有AWS的官方清单()。我将看一看守护程序,这听起来很有前景。我目前的理论是,Pod扩展拓扑也考虑了以前推出的Pod。在所有新的吊舱运行后,k8s将终止一些可能导致不平衡的先前的卷展吊舱。您能提供您的吊舱yaml吗?或者更好,如果部署yaml@SahadatHossain在这里,这是一个amazon nginx入口清单,编辑很少:我确实发现其他人描述了相同的问题:我能够通过将部署扩展到1个副本,然后再扩展到4个副本来获得正确的拓扑。如果推出后糟糕的拓扑结构真的很糟糕,我可能会将kubernetes descheduler作为一种缓解措施
NAME    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nginx   2         2         2       2            2           schedule=here   99m