【发布时间】:2019-02-28 10:30:06
【问题描述】:
有没有办法在命名空间级别配置nodeSelector?
我只想在此命名空间的某些节点上运行工作负载。
【问题讨论】:
标签: kubernetes
有没有办法在命名空间级别配置nodeSelector?
我只想在此命名空间的某些节点上运行工作负载。
【问题讨论】:
标签: kubernetes
要实现这一点,您可以使用PodNodeSelector 准入控制器。
首先,您需要在 kubernetes-apiserver 中启用它:
/etc/kubernetes/manifests/kube-apiserver.yaml:
--enable-admission-plugins=
PodNodeSelector参数现在,您可以在命名空间的注释中指定 scheduler.alpha.kubernetes.io/node-selector 选项,例如:
apiVersion: v1
kind: Namespace
metadata:
name: your-namespace
annotations:
scheduler.alpha.kubernetes.io/node-selector: env=test
spec: {}
status: {}
在这些步骤之后,在这个命名空间中创建的所有 pod 都会自动添加这个部分:
nodeSelector
env: test
有关PodNodeSelector 的更多信息,您可以在 Kubernetes 官方文档中找到:
https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#podnodeselector
如果您使用 kubeadm 部署了集群,并且想要使此配置持久化,则必须更新您的 kubeadm 配置文件:
kubectl edit cm -n kube-system kubeadm-config
在apiServer 部分下使用自定义值指定extraArgs:
apiServer:
extraArgs:
enable-admission-plugins: NodeRestriction,PodNodeSelector
然后在所有控制平面节点上更新您的 kube-apiserver 静态清单:
# Kubernetes 1.22 and forward:
kubectl get configmap -n kube-system kubeadm-config -o=jsonpath="{.data}" > kubeadm-config.yaml
# Before Kubernetes 1.22:
# "kubeadmin config view" was deprecated in 1.19 and removed in 1.22
# Reference: https://github.com/kubernetes/kubeadm/issues/2203
kubeadm config view > kubeadm-config.yaml
# Update the manifest with the file generated by any of the above lines
kubeadm init phase control-plane apiserver --config kubeadm-config.yaml
您可以将 kube_apiserver_enable_admission_plugins 变量用于您的 api-server 配置变量:
kube_apiserver_enable_admission_plugins:
- PodNodeSelector
【讨论】:
kubeadm init phase control-plane apiserver --config kubeadm-config.yaml 我得到 invalid configuration for GroupVersionKind /v1, Kind=ConfigMap: kind and apiVersion is mandatory information that must be specified
我完全同意@kvaps 的回答,但缺少一些东西:有必要在您的节点中添加标签:
kubectl label node <yournode> env=test
这样,在命名空间中创建的带有scheduler.alpha.kubernetes.io/node-selector: env=test 的pod 将只能在带有env=test 标签的节点上调度
【讨论】: