【问题标题】:How to assign a namespace to certain nodes?如何为某些节点分配命名空间?
【发布时间】:2019-02-28 10:30:06
【问题描述】:

有没有办法在命名空间级别配置nodeSelector

我只想在此命名空间的某些节点上运行工作负载。

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    要实现这一点,您可以使用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 部署了集群,并且想要使此配置持久化,则必须更新您的 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
    

    kubespray 用户

    您可以将 kube_apiserver_enable_admission_plugins 变量用于您的 api-server 配置变量:

     kube_apiserver_enable_admission_plugins:
       - PodNodeSelector
    

    【讨论】:

    • 我已经通过 ssh 连接到我的一个节点,但在该位置 /etc/kubernetes/manifests 只有一个名为 kube-proxy.manifest 的文件,没有 kube-apiserver.yaml。我需要创建它吗?
    • 我相信你需要访问 kubernetes master,这不是节点的功能。
    • 我们如何在像 EKS 这样的托管 kubernetes 集群中实现这一点?
    • 当运行 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
    【解决方案2】:

    我完全同意@kvaps 的回答,但缺少一些东西:有必要在您的节点中添加标签:

    kubectl label node <yournode> env=test
    

    这样,在命名空间中创建的带有scheduler.alpha.kubernetes.io/node-selector: env=test 的pod 将只能在带有env=test 标签的节点上调度

    【讨论】:

    • 视情况而定。如果您可能正在使用多个节点池,那么每个节点都已经带有一个唯一的标签,该标签会向下渗透到节点,因此无需单独标记
    • 不推荐以这种方式添加标签用于具有自动缩放器的集群,如果节点出现故障,替换将没有此标签,最好在节点池上定义标签,如提到的@MarioJacobo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多