Kubernetes 在特定节点上调度pod,而不修改PodSpec

Kubernetes 在特定节点上调度pod,而不修改PodSpec,kubernetes,Kubernetes,作为k8s集群管理员,我想指定在哪些节点(使用标签)上调度POD,但不修改任何PodSpec部分 因此,节点选择器、亲和性和污点不能作为选项。 还有其他解决办法吗 PS:我不能修改PodSpec的原因是,部署的应用程序可以作为掌舵图使用,而我手头没有这些文件。此外,如果我更改PodSpec,它将在下一版本升级时丢失。否,没有其他方法可以指定pod将在哪些节点上调度,只有标签和选择器 我认为头盔的问题与此有关 目前,您唯一的方法是更改规范、删除版本并使用更新的规范部署新版本 UPD @Janos

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

因此,节点选择器、亲和性和污点不能作为选项。 还有其他解决办法吗


PS:我不能修改PodSpec的原因是,部署的应用程序可以作为掌舵图使用,而我手头没有这些文件。此外,如果我更改PodSpec,它将在下一版本升级时丢失。

否,没有其他方法可以指定pod将在哪些节点上调度,只有标签和选择器

我认为头盔的问题与此有关

目前,您唯一的方法是更改规范、删除版本并使用更新的规范部署新版本

UPD

@Janos Lenart提供了一种方法来管理每个命名空间的调度。如果您的发行版已经在名称空间中拆分,并且您不想在一个发行版中的不同节点上生成不同的pod,那么这是一个好主意。否则,您将不得不在新名称空间中创建新版本,在这种情况下,我强烈建议您使用Pods规范中的选择器。

您可以使用准入控制器来实现以下目的:

此准入控制器具有以下行为:

  • 如果名称空间有一个带有键
    scheduler.kubernetes.io/nodeSelector
    的注释,请将其值用作节点选择器
  • 如果名称空间缺少此类注释,请使用PodNodeSelector插件配置文件中定义的
    clusterDefaultNodeSelector
    作为节点选择器
  • 对照命名空间节点选择器评估pod的节点选择器是否存在冲突。冲突导致拒绝
  • 根据插件配置文件中定义的特定于名称空间的白名单评估pod的节点选择器。冲突导致拒绝
  • 首先,你需要。启用它的方式取决于您的环境,但它是通过参数
    kube apiserver--enable acmission 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
    
    它应该输出如下内容:

    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
    

    这对他有什么帮助?是的,他可以使用准入控制器,但唯一的结果是在选定节点上调度命名空间中的所有POD。他不想更改规格,也不想创建新的部署,但在您的解决方案中,他无论如何都需要它,至少在将所有图表拆分为不同名称空间时是这样。但是,如果您仍然需要重新创建发行版,那么使用只能部分解决问题的解决方案的原因是什么?此外,如果您需要在一个版本中的不同节点上运行pod,这也不会有帮助。他可以执行
    helm install--namespace=node selector test
    ,这比更改所有Pod模板要容易得多。但该命令将创建一个新部署,至少您需要在两个不同的命名空间中同时管理应用程序的两个副本。这会引起大问题。此外,如果您要创建一个新的部署,为什么不在POD中使用选择器而不是准入控制器呢?嗨!很抱歉,我的问题不是很积极。我喜欢在PodSpec上使用准入控制器的方式,因为它将pod必须如何运行以及必须在何处运行解耦。但是,您关于名称空间的解决方案对我帮助不大,因为我将所有的POD部署在默认名称空间中(根据环境,我使用了几个GCP项目和GKE集群)。将尝试基于pods标签/注释搜索节点选择器。helm图表/模板是否意味着在部署中使用--value或--set修饰符进行修改?如果您可以启动相同的命令(仅更改要升级的原始图表的版本),为什么升级会有问题?不幸的是,没有。否则,我会在values.yaml中使用该定义。感谢您对一个两岁孩子的关心(顺便说一句;)