gpt4 book ai didi

kubernetes - 在不修改 PodSpec 的情况下在特定节点上调度 pod

转载 作者:行者123 更新时间:2023-12-05 05:17:01 28 4
gpt4 key购买 nike

作为 k8s 集群管理员,我想指定在哪些节点(使用标签)上调度 pod,但不修改任何 PodSpec 部分。

因此,nodeSelector、affinity 和 taints 不能作为选项。还有其他解决方案吗?

PS:我无法修改 PodSpec 的原因是已部署的应用程序可作为 Helm 图表使用,而我没有这些文件。此外,如果我更改 PodSpec,它将在下一次版本升级时丢失。

最佳答案

您可以使用 PodNodeSelector为此的准入 Controller :

This admission controller has the following behavior:

  1. If the Namespace has an annotation with a key scheduler.kubernetes.io/nodeSelector, use its value as the node selector.
  2. If the namespace lacks such an annotation, use the clusterDefaultNodeSelector defined in the PodNodeSelector plugin configuration file as the node selector.
  3. Evaluate the pod’s node selector against the namespace node selector for conflicts. Conflicts result in rejection.
  4. Evaluate the pod’s node selector against the namespace-specific whitelist defined the plugin configuration file. Conflicts result in rejection.

首先你需要enable this admission controller .启用它的方式取决于您的环境,但它是通过参数 kube-apiserver --enable-admission-plugins=PodNodeSelector 完成的。

然后创建一个命名空间并使用您希望该命名空间中的所有 Pod 具有的任何节点标签对其进行注释:

kubectl create ns node-selector-test
kubectl annotate ns node-selector-test \
scheduler.alpha.kubernetes.io/node-selector=mynodelabel=mynodelabelvalue

要测试它,您可以这样做:

kubectl run busybox \
-n node-selector-test -it --restart=Never --attach=false --image=busybox

kubectl get pod busybox -n node-selector-test -o yaml

它应该输出这样的东西:

apiVersion: v1
kind: Pod
metadata:
name: busybox
....
spec:
...
nodeSelector:
mynodelabel: mynodelabelvalue

现在,除非该标签存在于某些节点上,否则永远不会调度此 Pod,因此将此标签放在节点上以查看它是否已调度:

kubectl label node myfavoritenode mynodelabel=mynodelabelvalue

关于kubernetes - 在不修改 PodSpec 的情况下在特定节点上调度 pod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630642/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com