0

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

我正在尝试配置调度程序以避免在调度程序尝试找到最佳可用节点时更改节点分数来避免在某些节点上运行 pod,我想在调度程序级别而不是通过在部署时使用 nodeAffinity、replicaset 来做到这一点, pod 等级别(因此所有 pod 都会受到此更改的影响)。

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

根据节点注解 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

然后我检查创建的 pod 的位置kubectl get pods -owide

所以,我相信这个注释需要一些选项才能工作。
我尝试将注释设置为“true”、“1”,但 k8s 拒绝我的更改,我无法确定该注释的有效选项是什么,也找不到任何相关文档。

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

谢谢。

4

1 回答 1

0

因此,从这里的源 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

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

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

kubectl taint node NODE_NAME node.kubernetes.io/unschedulable=:PreferNoSchedule
于 2021-08-23T08:42:51.347 回答