Kubernetes K8S之固定节点nodeName和nodeSelector调度详解与示例
主机配置规划
服务器名称(hostname) | 系统版本 | 配置 | 内网IP | 外网IP(模拟) |
---|---|---|---|---|
k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
nodeName调度
nodeName是节点选择约束的最简单形式,但是由于其限制,通常很少使用它。nodeName是PodSpec的领域。
pod.spec.nodeName将Pod直接调度到指定的Node节点上,会【跳过Scheduler的调度策略】,该匹配规则是【强制】匹配。可以越过Taints污点进行调度。
nodeName用于选择节点的一些限制是:
- 如果指定的节点不存在,则容器将不会运行,并且在某些情况下可能会自动删除。
- 如果指定的节点没有足够的资源来容纳该Pod,则该Pod将会失败,并且其原因将被指出,例如OutOfmemory或OutOfcpu。
- 云环境中的节点名称并非总是可预测或稳定的。
nodeName示例
获取当前的节点信息
1 | [root@k8s-master scheduler]# kubectl get nodes -o wide |
当nodeName指定节点存在
要运行的yaml文件
1 | [root@k8s-master scheduler]# pwd |
运行yaml文件并查看信息
1 | [root@k8s-master scheduler]# kubectl apply -f scheduler_nodeName.yaml |
由上可见,yaml文件中nodeName: k8s-master生效,所有pod被调度到了k8s-master节点。如果这里是nodeName: k8s-node02,那么就会直接调度到k8s-node02节点。
当nodeName指定节点不存在
要运行的yaml文件
1 | [root@k8s-master scheduler]# pwd |
运行yaml文件并查看信息
1 | [root@k8s-master scheduler]# kubectl apply -f scheduler_nodeName_02.yaml |
由上可见,如果指定的节点不存在,则容器将不会运行,一直处于Pending 状态。
nodeSelector调度
nodeSelector是节点选择约束的最简单推荐形式。nodeSelector是PodSpec的领域。它指定键值对的映射。
Pod.spec.nodeSelector是通过Kubernetes的label-selector机制选择节点,由调度器调度策略匹配label,而后调度Pod到目标节点,该匹配规则属于【强制】约束。由于是调度器调度,因此不能越过Taints污点进行调度。
nodeSelector示例
获取当前的节点信息
1 | [root@k8s-master ~]# kubectl get node -o wide --show-labels |
添加label标签
运行kubectl get nodes以获取群集节点的名称。然后可以对指定节点添加标签。比如:k8s-node01的磁盘为SSD,那么添加disk-type=ssd;k8s-node02的CPU核数高,那么添加cpu-type=hight;如果为Web机器,那么添加service-type=web。怎么添加标签可以根据实际规划情况而定。
1 | ### 给k8s-node01 添加指定标签 |
由上可见,已经为k8s-node01节点添加了disk-type=ssd 标签。
当nodeSelector标签存在
要运行的yaml文件
1 | [root@k8s-master scheduler]# pwd |
运行yaml文件并查看信息
1 | [root@k8s-master scheduler]# kubectl apply -f scheduler_nodeSelector.yaml |
由上可见,所有pod都被调度到了k8s-node01节点。当然如果其他节点也有disk-type=ssd 标签,那么pod也会调度到这些节点上。
当nodeSelector标签不存在
要运行的yaml文件
1 | [root@k8s-master scheduler]# pwd |
运行yaml文件并查看信息
1 | [root@k8s-master scheduler]# kubectl apply -f scheduler_nodeSelector_02.yaml |
由上可见,如果nodeSelector匹配的标签不存在,则容器将不会运行,一直处于Pending 状态。
相关阅读
2、Kubernetes K8S之调度器kube-scheduler详解
3、Kubernetes K8S之affinity亲和性与反亲和性详解与示例
4、Kubernetes K8S之Taints污点与Tolerations容忍详解
完毕!