如何使用 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
首先,由于某些原因,我使用的是不受支持的过时版本的 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
因此,我认为此注释需要一些选项才能起作用。
我尝试将注释设置为“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