调度约束过程

在这里插入图片描述

从创建资源开始:
●客户发起创建资源请求给api server;api server将请求过程写入到etcd数据库中,etcd会检查语法,语法正确就会记录在etcd中,并且会返回给api server,告诉用户刚刚创建资源的语法是否存在问题,要是存在问题就不会记录在etcd中,如果创建成功会继续下面的流程;
●因为各个组件之间是独立的所以想让各组件之间配合起来就依赖于watch机制;
●watch机制代替api server去连接调度器,调度器这时会计算应该将资源分配给哪台node节点,当计算出资源应该分配到哪个节点时,创建资源的node信息会绑定pod,形成一个地址信息给api server,api server会记录在etcd当中,etcd记录完成后,返回给api server,api server通过watch机制通知调度器去分配,同时watch机制会去看控制器,查看创建的是什么资源类型;之后wtach会带着创建的资源类型和分配的地址去找kubelet,kubelet会直接找docker加载资源引擎,当dokcer容器创建成功后会将状态信息返回给kubelet;kubelet将容器的状态信息返回给api server;api server会把状态信息写入到etcd中,etcd记录成功后会告诉api server信息记录成功,api server再次告诉kubelet所有的状态信息都记录成功,可以运行

调度方式

  • nodeName用于将Pod调度到指定的Node名称上不经过调度器(跳过调度器直接分配)
  • nodeSelector用于将Pod调度到匹配Label的Node上(需要给服务器后端的Node)

示例1:以nodeName调度方式创建

[root@master demo]# vim nodename.yaml     ##编写nodename的资源
apiVersion: v1
kind: Pod  
metadata:
  name: pod-example    ##名称
  labels:
    app: nginx  
spec:
  nodeName: 192.168.148.139    ##nodename指向node01地址
  containers:
  - name: nginx    ##容器名
    image: nginx:1.15
[root@master demo]# kubectl create -f nodename.yaml    ##创建nodename资源
pod/pod-example created
[root@master demo]# kubectl get pods -o wide    ##查看容器创建的节点
NAME          READY   STATUS    RESTARTS   AGE    IP            NODE              NOMINATED NODE
pod-example   1/1     Running   0          118s   172.17.57.2   192.168.148.139   <none>    ##创建在139的节点上
[root@master demo]#  kubectl describe pod pod-example    ##进入pod容器查看创建过程

在这里插入图片描述

[root@master demo]# kubectl delete -f .      ##删除当前文件夹下创建的资源
pod "pod-example" deleted

示例2:以nodeSelector调度方式创建

[root@master demo]# kubectl label --help     ##查看获取标签的帮助
Usage:
  kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
[options]  
[root@master demo]# kubectl get nodes     ##查看节点信息
NAME              STATUS   ROLES    AGE    VERSION
192.168.148.139   Ready    <none>   6d9h   v1.12.3
192.168.148.140   Ready    <none>   6d8h   v1.12.3

给对应的node设置标签分别为kgc=a和kgc=b

[root@master demo]# kubectl label nodes 192.168.148.139 kgc=a    ##给node1节点打上kgc=a的标签
node/192.168.148.139 labeled
[root@master demo]# kubectl label nodes 192.168.148.140 kgc=b    ##给node2节点打上kgc=b的标签
node/192.168.148.140 labeled
[root@master demo]# kubectl get nodes --show-labels      ##查看标签

在这里插入图片描述

[root@master demo]# vim pod6.yaml     ##编写nodeSelector文件
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeSelector:      ##node类型
    kgc: b     ##资源创建在标签为b的节点上
  containers:
  - name: nginx
    image: nginx:1.15
[root@master demo]# kubectl create -f pod6.yaml    ##创建资源
pod/pod-example created
[root@master demo]# kubectl get pods -o wide  ##查看资源创建对应的节点
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE
pod-example   1/1     Running   0          17s   172.17.64.2   192.168.148.140   <none>     ##创建在b标签对应的140,node02的节点上
[root@master demo]# kubectl describe pod pod-example       ##查看详细信息

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐