Kubernetes 中pod绑定node节点:固定节点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示例
获取当前的节点信息
[root@k8s-master scheduler]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready master 42d v1.17.4 172.16.1.110 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8
k8s-node01 Ready <none> 42d v1.17.4 172.16.1.111 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8
k8s-node02 Ready <none> 42d v1.17.4 172.16.1.112 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8
当nodeName指定节点存在
要运行的yaml文件
[root@k8s-master scheduler]# pwd
/root/k8s_practice/scheduler
[root@k8s-master scheduler]# cat scheduler_nodeName.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: scheduler-nodename-deploylabels:app: nodename-deploy
spec:replicas: 5selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myapp-podimage: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80# 指定节点运行nodeName: k8s-master
运行yaml文件并查看信息
[root@k8s-master scheduler]# kubectl apply -f scheduler_nodeName.yaml
deployment.apps/scheduler-nodename-deploy created
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
scheduler-nodename-deploy 0/5 5 0 6s myapp-pod registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
scheduler-nodename-deploy-d5c9574bd 5 5 5 15s myapp-pod registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp,pod-template-hash=d5c9574bd
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
scheduler-nodename-deploy-d5c9574bd-6l9d8 1/1 Running 0 23s 10.244.0.123 k8s-master <none> <none>
scheduler-nodename-deploy-d5c9574bd-c82cc 1/1 Running 0 23s 10.244.0.119 k8s-master <none> <none>
scheduler-nodename-deploy-d5c9574bd-dkkjg 1/1 Running 0 23s 10.244.0.122 k8s-master <none> <none>
scheduler-nodename-deploy-d5c9574bd-hcn77 1/1 Running 0 23s 10.244.0.121 k8s-master <none> <none>
scheduler-nodename-deploy-d5c9574bd-zstjx 1/1 Running 0 23s 10.244.0.120 k8s-master <none> <none>
由上可见,yaml文件中nodeName: k8s-master生效,所有pod被调度到了k8s-master节点。如果这里是nodeName: k8s-node02,那么就会直接调度到k8s-node02节点。
当nodeName指定节点不存在
要运行的yaml文件
[root@k8s-master scheduler]# pwd
/root/k8s_practice/scheduler
[root@k8s-master scheduler]# cat scheduler_nodeName_02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: scheduler-nodename-deploylabels:app: nodename-deploy
spec:replicas: 5selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myapp-podimage: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80# 指定节点运行,该节点不存在nodeName: k8s-node08
运行yaml文件并查看信息
[root@k8s-master scheduler]# kubectl apply -f scheduler_nodeName_02.yaml
deployment.apps/scheduler-nodename-deploy created
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
scheduler-nodename-deploy 0/5 5 0 4s myapp-pod registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
scheduler-nodename-deploy-75944bdc5d 5 5 0 9s myapp-pod registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp,pod-template-hash=75944bdc5d
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
scheduler-nodename-deploy-75944bdc5d-c8f5d 0/1 Pending 0 13s <none> k8s-node08 <none> <none>
scheduler-nodename-deploy-75944bdc5d-hfdlv 0/1 Pending 0 13s <none> k8s-node08 <none> <none>
scheduler-nodename-deploy-75944bdc5d-q9qgt 0/1 Pending 0 13s <none> k8s-node08 <none> <none>
scheduler-nodename-deploy-75944bdc5d-q9zl7 0/1 Pending 0 13s <none> k8s-node08 <none> <none>
scheduler-nodename-deploy-75944bdc5d-wxsnv 0/1 Pending 0 13s <none> k8s-node08 <none> <none>
由上可见,如果指定的节点不存在,则容器将不会运行,一直处于Pending 状态。
nodeSelector调度
nodeSelector是节点选择约束的最简单推荐形式。nodeSelector是PodSpec的领域。它指定键值对的映射。
Pod.spec.nodeSelector是通过Kubernetes的label-selector机制选择节点,由调度器调度策略匹配label,而后调度Pod到目标节点,该匹配规则属于【强制】约束。由于是调度器调度,因此不能越过Taints污点进行调度。
nodeSelector示例
获取当前的节点信息
[root@k8s-master ~]# kubectl get node -o wide --show-labels
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME LABELS
k8s-master Ready master 42d v1.17.4 172.16.1.110 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8s-node01 Ready <none> 42d v1.17.4 172.16.1.111 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux
k8s-node02 Ready <none> 42d v1.17.4 172.16.1.112 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux
添加label标签
运行kubectl get nodes以获取群集节点的名称。然后可以对指定节点添加标签。比如:k8s-node01的磁盘为SSD,那么添加disk-type=ssd;k8s-node02的CPU核数高,那么添加cpu-type=hight;如果为Web机器,那么添加service-type=web。怎么添加标签可以根据实际规划情况而定。
### 给k8s-node01 添加指定标签
[root@k8s-master ~]# kubectl label nodes k8s-node01 disk-type=ssd
node/k8s-node01 labeled
#### 删除标签命令 kubectl label nodes k8s-node01 disk-type-
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-master Ready master 42d v1.17.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8s-node01 Ready <none> 42d v1.17.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk-type=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux
k8s-node02 Ready <none> 42d v1.17.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux
由上可见,已经为k8s-node01节点添加了disk-type=ssd 标签。
当nodeSelector标签存在
要运行的yaml文件
[root@k8s-master scheduler]# pwd
/root/k8s_practice/scheduler
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# cat scheduler_nodeSelector.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: scheduler-nodeselector-deploylabels:app: nodeselector-deploy
spec:replicas: 5selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myapp-podimage: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80# 指定节点标签选择,且标签存在nodeSelector:disk-type: ssd
运行yaml文件并查看信息
[root@k8s-master scheduler]# kubectl apply -f scheduler_nodeSelector.yaml
deployment.apps/scheduler-nodeselector-deploy created
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
scheduler-nodeselector-deploy 5/5 5 5 10s myapp-pod registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
scheduler-nodeselector-deploy-79455db454 5 5 5 14s myapp-pod registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp,pod-template-hash=79455db454
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
scheduler-nodeselector-deploy-79455db454-745ph 1/1 Running 0 19s 10.244.4.154 k8s-node01 <none> <none>
scheduler-nodeselector-deploy-79455db454-bmjvd 1/1 Running 0 19s 10.244.4.151 k8s-node01 <none> <none>
scheduler-nodeselector-deploy-79455db454-g5cg2 1/1 Running 0 19s 10.244.4.153 k8s-node01 <none> <none>
scheduler-nodeselector-deploy-79455db454-hw8jv 1/1 Running 0 19s 10.244.4.152 k8s-node01 <none> <none>
scheduler-nodeselector-deploy-79455db454-zrt8d 1/1 Running 0 19s 10.244.4.155 k8s-node01 <none> <none>
由上可见,所有pod都被调度到了k8s-node01节点。当然如果其他节点也有disk-type=ssd 标签,那么pod也会调度到这些节点上。
当nodeSelector标签不存在
要运行的yaml文件
[root@k8s-master scheduler]# pwd
/root/k8s_practice/scheduler
[root@k8s-master scheduler]#
[root@k8s-master scheduler]# cat scheduler_nodeSelector_02.yaml
apiVersion: apps/v1
kind: Deploymentmetadata:name: scheduler-nodeselector-deploylabels:app: nodeselector-deployspec:replicas: 5selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myapp-podimage: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80# 指定节点标签选择,且标签不存在nodeSelector:service-type: web
运行yaml文件并查看信息
1 [root@k8s-master scheduler]# kubectl apply -f scheduler_nodeSelector_02.yaml 2 deployment.apps/scheduler-nodeselector-deploy created3 [root@k8s-master scheduler]# 4 [root@k8s-master scheduler]# kubectl get deploy -o wide5 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR6 scheduler-nodeselector-deploy 0/5 5 0 26s myapp-pod registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp7 [root@k8s-master scheduler]# 8 [root@k8s-master scheduler]# kubectl get rs -o wide9 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
10 scheduler-nodeselector-deploy-799d748db6 5 5 0 30s myapp-pod registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp,pod-template-hash=799d748db6
11 [root@k8s-master scheduler]#
12 [root@k8s-master scheduler]# kubectl get pod -o wide
13 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
14 scheduler-nodeselector-deploy-799d748db6-92mqj 0/1 Pending 0 40s <none> <none> <none> <none>
15 scheduler-nodeselector-deploy-799d748db6-c2w25 0/1 Pending 0 40s <none> <none> <none> <none>
16 scheduler-nodeselector-deploy-799d748db6-c8tlx 0/1 Pending 0 40s <none> <none> <none> <none>
17 scheduler-nodeselector-deploy-799d748db6-tc5n7 0/1 Pending 0 40s <none> <none> <none> <none>
18 scheduler-nodeselector-deploy-799d748db6-z8c57 0/1 Pending 0 40s <none> <none> <none> <none>
由上可见,如果nodeSelector匹配的标签不存在,则容器将不会运行,一直处于Pending 状态。
参考
1、官网:Pod分配调度
2、Kubernetes K8S之调度器kube-scheduler详解
3、Kubernetes K8S之affinity亲和性与反亲和性详解与示例
4、Kubernetes K8S之Taints污点与Tolerations容忍详解
Kubernetes 中pod绑定node节点:固定节点nodeName和nodeSelector调度详解相关推荐
- Kubernetes K8S之固定节点nodeName和nodeSelector调度详解
Kubernetes K8S之固定节点nodeName和nodeSelector调度详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...
- Kubernetes中Pod的调度策略
Kubernetes中Pod的调度策略 1.Pod调度 在 Kubernetes 平台上,我们很少会直接创建一个 Pod,在大多数情况下会通过 RC.Deployment. DaemonSet.Job ...
- Kubernetes中pod分类、核心组件、网络模型及kubectl命令使用
文章目录 Kubernetes中pod分类.核心组件.网络模型及kubectl命令使用 1.k8s中pod分类 2.核心组件 3.网络模型 4.kubectl常用命令使用 Kubernetes中pod ...
- emule中节点加入Kad网络过程(源代码详解)【对原文部分改进】
from: http://blog.csdn.net/chenbuaa/article/details/2301656 emule中节点加入Kad网络过程(源代码详解) 程序启动: EmuleDlg. ...
- Kubernetes中Pod生命周期
在 Kubernetes中Pod是容器管理的最小单位, 有着各种各样的Pod管理器. 那么一个Pod从启动到释放, 在这期间经历了哪些过程呢? Pod自开始创建, 到正常运行, 再到释放, 其时间跨度 ...
- html注册验证radio,html中radio值的获取、赋值、注册事件示例详解分享
1,radio分组 只要name一样,就是一组的,即一组中只能选择一个,如下: 复制代码代码如下: group1: radio1 radio2 radio3 group2: radio4 radio5 ...
- 站长在线Python精讲:在Python中使用split()方法分割、使用join()方法合并字符串详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用split()方法分割.使用join()方法合并字符串详解>.本知识点主要内容有:在Python中使用s ...
- mediumtext_MySQL中tinytext、text、mediumtext和longtext等各个类型详解【图】
MySQL中tinytext.text.mediumtext和longtext等各个类型详解[图] 07-29栏目:技术 TAG:mediumtext mediumtext 一.字符串类型 www.j ...
- php self this static,PHP 中 self、static、$this 的区别和后期静态绑定详解
本篇文章给大家分享的内容是关于PHP 中 self.static.$this 的区别和后期静态绑定详解,有着一定的参考价值,有需要的朋友可以参考一下 self.static 和 $this 的区别 为 ...
- java构造块_java中的静态代码块、构造代码块、构造方法详解
运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...
最新文章
- css如何做玻璃效果_拓展训练之后的效果保持工作该如何做?
- hibernate 一对多、多对多的配置
- Linux动态链接库的使用
- mysql delette_关于字符串:首字母大写MySQL
- 信息学奥赛C++语言: 将字符串中的小写字母转换成大写字母
- Hulu诚意出品 |《百面深度学习》重磅上市
- bubbleSort 冒泡排序
- jquery 新建的元素事件绑定问题
- 使用电脑替代人力的几个优点
- 在大多数情况下病毒入侵计算机系统以后,网络支付与安全练习题库
- 使用jsMind实现可拖拽思维导图
- vue createElement后删除这个元素 the node to be removed is not a child of this node
- 无忧·企业文档自助配置完成单点登录配置,对接企业原有组织架构
- 深圳python 培训班价格
- 2019第十届蓝桥杯JAVA G组题解
- thingsboard安装源码编译
- Machine code description classes
- python面试大全 萧井陌_知乎萧井陌大神Python Flask实战课程
- vivado flash启动时间提速设置
- 六星教育php课程体系图,六星教育的PHP课程需要经历哪几个阶段?每个阶段的标准是什么?...