Kubernetes-完全避免带有PreferNoSchedule污染的节点

Kubernetes-完全避免带有PreferNoSchedule污染的节点,kubernetes,google-kubernetes-engine,Kubernetes,Google Kubernetes Engine,问题是: 我们在kubernetes中有一些节点,它们偶尔会受到PreferNoSchedule的影响。当这种情况发生时,我们希望我们的POD完全避免在这些节点上进行调度(换句话说,就像污染的效果实际上是NoSchedule)。这些污点不是我们应用的——我们使用的是GKE,这是一个自动化的东西,所以我们被困在PreferNoSchedule行为中 我们能控制的是吊舱的规格。我希望在它们上使用nodeAffinity可以做到这一点,但是关于这一点的文档非常稀少:参见例如。我能找到的所有例子都引用了

问题是:

我们在kubernetes中有一些节点,它们偶尔会受到
PreferNoSchedule
影响。当这种情况发生时,我们希望我们的POD完全避免在这些节点上进行调度(换句话说,就像污染的
效果
实际上是
NoSchedule
)。这些污点不是我们应用的——我们使用的是GKE,这是一个自动化的东西,所以我们被困在
PreferNoSchedule
行为中

我们能控制的是吊舱的规格。我希望在它们上使用
nodeAffinity
可以做到这一点,但是关于这一点的文档非常稀少:参见例如。我能找到的所有例子都引用了标签的亲和性,所以我不确定这个逻辑是否可以看到/访问污染

实际上,在我的pod规范中,我想写一些如下内容:

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/taints *I've invented this, it doesn't work
            operator: NotIn
            values:
            - DeletionCandidateOfClusterAutoscaler
其中,
DeletionCandidateOfClusterAutoscaler
是我们看到应用的污点。有没有办法让这一切顺利进行

我们考虑过的另一种方法是cronjob,它查找
PreferNoSchedule
污点,并在顶部添加我们自己的
NoSchedule
污点。。。但这感觉有点恶心

任何简洁的建议/解决方法都将不胜感激

长版本(如果您感兴趣):


autoscaler应用了这个污点,表示节点将在30分钟左右消失。这个问题更详细地描述了有相同问题的人:

我已经测试了相同的场景,事实上,GKE在autoscaler开始启动时协调了当前的节点配置。这是为了确保在POD/工作负载可调度的节点中缺少资源时不会停机。我相信没有办法把这一棘手的问题弄得一干二净

因此,使用autoscaler时要记住的关键信息是:

  • 如果常规节点中有可用资源,则不会将POD调度到软污染节点POOL

  • 如果常规节点中没有足够的可用资源,那么它们将被调度到受软污染的nodepool

  • 如果nodepool中没有足够的资源,则无论污染程度如何,节点类型最小的nodepool都将自动缩放

正如您所提到的,一个棘手的解决办法是:

A.-创建一个cron或daemon来设置NoSchedule并覆盖autoscaler设置的软命令


B.-A.-通过设置完美的资源限制和请求来确保资源的可居住性。

您好,我没有得到您确切需要的,为什么不设置一个NoSchedule污点呢。NoSchedule和PreferNoSchedule的区别在于前者在调度周期的过滤阶段被考虑,而PreferNoSchedule在评分阶段被考虑@Jujosiga正如我在我的原始帖子中解释的那样,污染不是由我们应用的,而是由autoscaler自动应用的。如果我们想设置我们自己的
NoSchedule
taint,我们需要通过cronjob或其他方式来完成,它轮询节点的状态以获取autoscaler taint,并在发现时应用我们自己的。这当然是一种选择(也是我在专栏文章中提到的),但我希望有一种更整洁的方式。