首页 > 解决方案 > 使用节点选择器舵图将 pod 分配到特定节点池

问题描述

我正在尝试将 pod 分配给特定节点作为 helm 命令的一部分,所以到最后部署 yaml 应该如下所示

spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    node-name: dev-cpu-pool

我将此命令用作 Jenkins 文件部署的一部分

`sh "helm upgrade -f charts/${job_name}/default.yaml --set nodeSelector.name=${deployNamespace}-cpu-pool --install ${deployNamespace}-${name} helm/${name} --namespace=${deployNamespace} --recreate-pods --version=${version}`"

                

部署运行良好,pod 已启动并运行,但由于某种原因,我看不到 nodeSelector 键和值作为部署 yaml 的一部分,因此 pod 未分配给我想要的特定节点。知道有什么问题吗?我应该把任何占位符作为我的图表模板的一部分还是不是必须的?

标签: kubernetes-helm

解决方案


Helm 提交给 Kubernetes API 的工件正是渲染图表模板的结果;仅此而已,仅此而已。如果您的模板不包含nodeSelector:块,那么生成的部署也永远不会。即使您helm install --set ...可以匹配 Kubernetes API 字段的内容,也不会隐式填充它们。

如果您想要一个选项来指定很少使用的字段,nodeSelector:那么您的图表代码需要包含它们。您可以根据设置的值使字段的存在成为条件,但您确实需要明确列出它:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
{{- if .Values.nodeSelector }}
      nodeSelector: {{- .Values.nodeSelector | toYaml | nindent 8 }}
{{- end }}

推荐阅读