主机配置规划

服务器名称(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调度详解相关推荐

  1. Kubernetes K8S之固定节点nodeName和nodeSelector调度详解

    Kubernetes K8S之固定节点nodeName和nodeSelector调度详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...

  2. Kubernetes中Pod的调度策略

    Kubernetes中Pod的调度策略 1.Pod调度 在 Kubernetes 平台上,我们很少会直接创建一个 Pod,在大多数情况下会通过 RC.Deployment. DaemonSet.Job ...

  3. Kubernetes中pod分类、核心组件、网络模型及kubectl命令使用

    文章目录 Kubernetes中pod分类.核心组件.网络模型及kubectl命令使用 1.k8s中pod分类 2.核心组件 3.网络模型 4.kubectl常用命令使用 Kubernetes中pod ...

  4. emule中节点加入Kad网络过程(源代码详解)【对原文部分改进】

    from: http://blog.csdn.net/chenbuaa/article/details/2301656 emule中节点加入Kad网络过程(源代码详解) 程序启动: EmuleDlg. ...

  5. Kubernetes中Pod生命周期

    在 Kubernetes中Pod是容器管理的最小单位, 有着各种各样的Pod管理器. 那么一个Pod从启动到释放, 在这期间经历了哪些过程呢? Pod自开始创建, 到正常运行, 再到释放, 其时间跨度 ...

  6. html注册验证radio,html中radio值的获取、赋值、注册事件示例详解分享

    1,radio分组 只要name一样,就是一组的,即一组中只能选择一个,如下: 复制代码代码如下: group1: radio1 radio2 radio3 group2: radio4 radio5 ...

  7. 站长在线Python精讲:在Python中使用split()方法分割、使用join()方法合并字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用split()方法分割.使用join()方法合并字符串详解>.本知识点主要内容有:在Python中使用s ...

  8. mediumtext_MySQL中tinytext、text、mediumtext和longtext等各个类型详解【图】

    MySQL中tinytext.text.mediumtext和longtext等各个类型详解[图] 07-29栏目:技术 TAG:mediumtext mediumtext 一.字符串类型 www.j ...

  9. php self this static,PHP 中 self、static、$this 的区别和后期静态绑定详解

    本篇文章给大家分享的内容是关于PHP 中 self.static.$this 的区别和后期静态绑定详解,有着一定的参考价值,有需要的朋友可以参考一下 self.static 和 $this 的区别 为 ...

  10. java构造块_java中的静态代码块、构造代码块、构造方法详解

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...

最新文章

  1. css如何做玻璃效果_拓展训练之后的效果保持工作该如何做?
  2. hibernate 一对多、多对多的配置
  3. Linux动态链接库的使用
  4. mysql delette_关于字符串:首字母大写MySQL
  5. 信息学奥赛C++语言: 将字符串中的小写字母转换成大写字母
  6. Hulu诚意出品 |《百面深度学习》重磅上市
  7. bubbleSort 冒泡排序
  8. jquery 新建的元素事件绑定问题
  9. 使用电脑替代人力的几个优点
  10. 在大多数情况下病毒入侵计算机系统以后,网络支付与安全练习题库
  11. 使用jsMind实现可拖拽思维导图
  12. vue createElement后删除这个元素 the node to be removed is not a child of this node
  13. 无忧·企业文档自助配置完成单点登录配置,对接企业原有组织架构
  14. 深圳python 培训班价格
  15. 2019第十届蓝桥杯JAVA G组题解
  16. thingsboard安装源码编译
  17. Machine code description classes
  18. python面试大全 萧井陌_知乎萧井陌大神Python Flask实战课程
  19. vivado flash启动时间提速设置
  20. 六星教育php课程体系图,六星教育的PHP课程需要经历哪几个阶段?每个阶段的标准是什么?...

热门文章

  1. 年轻人的第一个自定义Springboot starter
  2. 内存泄漏(memory leak)的理解与应用
  3. Spring Cloud Zuul网关集成JWT身份验证学习总结
  4. SpringBoot项目文件下载
  5. 029——VUE中键盘语义修饰符
  6. Apache目录禁止解析
  7. Struts 2.0 入门
  8. module.exports,exports,export和export default,import与require区别与联系
  9. python 爬poj.org的题目
  10. MySQL(my.ini)配置文件详解