如何使用 kubernetes scheduler.alpha.kubernetes.io/preferAvoidPods?

how to use kubernetes scheduler.alpha.kubernetes.io/preferAvoidPods?

首先,由于某些原因,我使用的是不受支持的过时版本的 Kubernetes (1.12),我无法升级。

我正在尝试配置调度程序,以避免在某些节点上出现 运行 pods,方法是在调度程序尝试找到最佳可用节点时更改节点分数,我想这样做在调度程序级别而不是在部署、复制集、pod 等级别使用 nodeAffinity(因此所有 pods 都将受到此更改的影响)。

在此处阅读 k8s 文档后:https://kubernetes.io/docs/reference/scheduling/config/#scheduling-plugins 并检查 1.12 中是否已经存在一些选项,我正在尝试使用 NodePreferAvoidPods 插件。 在文档中插件指定:

Scores nodes according to the node annotation scheduler.alpha.kubernetes.io/preferAvoidPods

如果理解正确应该做这项工作。

因此,我更新了 kube-scheduler.yaml 的静态清单以使用以下配置:

apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
profiles:
    - plugins:
        score:
          enabled:
          - name: NodePreferAvoidPods
            weight: 100
clientConnection:
  kubeconfig: /etc/kubernetes/scheduler.conf

但添加如下注解 scheduler.alpha.kubernetes.io/preferAvoidPods: 节点似乎不起作用。
为了进行测试,我进行了一个基本的 nginx 部署,其中的副本等于工作节点数 (4)。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

然后我检查用 kubectl get pods -owide

创建的 pods 在哪里

因此,我认为此注释需要一些选项才能起作用。
我尝试将注释设置为“true”、“1”,但 k8s 拒绝我的更改,我无法确定此注释的有效选项是什么,我找不到任何相关文档。

我已经在 git 版本的 1.12 中进行了检查,这个插件已经存在(至少有一些代码行),我认为此后行为或设置没有太大变化。

谢谢。

所以从这里的 Kubernetes 源代码可以看出这个注释的有效值:

                            {
                                "preferAvoidPods": [
                                    {
                                        "podSignature": {
                                            "podController": {
                                                    "apiVersion": "v1",
                                                    "kind": "ReplicationController",
                                                    "name": "foo",
                                                    "uid": "abcdef123456",
                                                    "controller": true
                                            }
                                        },
                                        "reason": "some reason",
                                        "message": "some message"
                                    }
                                ]
                            }`

但是没有关于如何预测 uid 的详细信息,也没有在 github 年前被另一个人询问时给出答案:https://github.com/kubernetes/kubernetes/issues/41630

对于我最初的问题是避免在节点上调度 pods,我找到了另一种方法,使用众所周知的污点 node.kubernetes.io/unschedulable 和值 PreferNoSchedule

使用此命令污染节点可以完成工作,并且这种污染似乎在 cordon/uncordon 中持续存在(警戒线将设置为 NoSchedule,取消警戒线将其设置回 PreferNoSchedule)。

kubectl taint node NODE_NAME node.kubernetes.io/unschedulable=:PreferNoSchedule