kubernetes节点选择器

fzu_huang

好久没有更新了,今天在接到一个部署任务时,要求在集群中某几个机器上部署,查了一下github,有这方面的相关文档,翻译过来记录一下,有兴趣的同学也可以直接去github看官方文档

单节点部署

单节点部署使用nodeName字段进行配置。在启动的json/yaml文件中,pod的spec结构下增加字段:"nodeName":"{nodename}"

我们可以在master上通过指令: kubectl get nodes看到集群中的slaver节点的nodeName和他们的标签,状态:

clipboard.png

在创建pod或rc时,加入nodeName即可以指定将pod部署在指定的节点上,上图为例,json文件如:

{
    "apiVersion": "v1",
    "kind": "ReplicationController",
    "metadata": {
        "labels": {
            "name": "benchcpu"
        },
        "name": "benchcpu-controller"
    },
    "spec": {
        "replicas": 3,
        "selector": {
            "name": "benchcpu"
        },
        "template": {
            "metadata": {
                "labels": {
                    "name": "benchcpu"
                }
            },
            "spec": {
                "containers": [
                    {
                        "image": "registry.hub.huangyang.com.cn/sysbench:0.5shell",
                        "name": "sysbench",
                        "command":[
                            "./todo.sh",
                            "--num-threads=1 --forced-shutdown=1 --max-time=60 --test=cpu --cpu-max-prime=10000000 run ",
                            "0"
                        ]
                    }
                ],
                 "nodeName": "10.126.72.31"
            }
        }
    }
}

那么这个名为bench的replication controller 就会将所有的pod都部署在10.126.72.31上。

指定若干机器进行部署

将slaver节点机器按照它们的labels进行归类。使用"nodeSelector"进行选择。

  1. 管理node的标签
    使用kubectl label nodes {nodename} {key=value} 进行标签的添加。如:

kubectl  label nodes 10.126.72.31 points=test

会给10.126.72.31这个节点添加一个标签:points=test

我们给31.32两台机器同时加上这个标签。

  1. 使用nodeSelector选择器
    类似于上文的nodeName,在创建资源的json/yaml文件中使用nodeSelector字段,如:


{
    "apiVersion": "v1",
    "kind": "ReplicationController",
    "metadata": {
        "labels": {
            "name": "benchcpu"
        },
        "name": "benchcpu-controller"
    },
    "spec": {
        "replicas": 3,
        "selector": {
            "name": "benchcpu"
        },
        "template": {
            "metadata": {
                "labels": {
                    "name": "benchcpu"
                }
            },
            "spec": {
                "containers": [
                    {
                        "image": "registry.hub.huangyang.com.cn/sysbench:0.5shell",
                        "name": "sysbench",
                        "command":[
                            "./todo.sh",
                            "--num-threads=1 --forced-shutdown=1 --max-time=60 --test=cpu --cpu-max-prime=10000000 run ",
                            "0"
                        ]
                    }
                ],
                 "nodeSelector":{
                    "points":"test"
                 }
            }
        }
    }
}

即可将pod指定到31或32上部署运行。

需要注意

不论是nodeName,nodeSelector,还是下文提到的 node affinity,针对他们的过滤条件,即使目前没有满足过滤条件的node,master也会指派至少一个node去部署pod,因为选择器的意思是选择“可以被分配到的节点”,而不是指定“不可被分配到的节点”。

1.2中的新特性:node affinity

1.2即将出现功能更强大的选择器,但是目前已知,可以实现如: label:"points":"test"and"test2" 的多项选择(也就是选择label中"points"的value为"test" 或 "test2", 并且不止是"and",而是与或非的联合判断式),node affinity最终将会取代 node Selector。

阅读 12k

kubernetes_docker集群管理
我学到的关于k8s和docker的种种。 仅作学习笔记用,不会发布在别的地方
272 声望
105 粉丝
0 条评论
你知道吗?

272 声望
105 粉丝
文章目录
宣传栏