理论+实操:K8S的scheduler调度约束

前言:

调度约束,即创建的pod节点可以指定

kubernetes通过warch的机制进行每个组件的协作,每个组件之间的设计实现了解耦

一:K8S的工作流程图

在这里插入图片描述
流程概述:

控制器放在etcd和scheduler中间

1.创建pod时,会把命令中的pod的属性信息写入到etcd中,记录pod元信息

2.etcd会把信息记录完成的结果告诉api

3.api会把创建pod的告知给scheduler,要求调度分配

4.scheduler会给后端打分,将优先级高的node与pod绑定,bind pod

5.这时会把信息转告给api,node节点IP也知道了,api会把信息写入到etcd,node的地址,pod的节点信息

6.etcd告诉api自己已记录

7.api去调用kubelet,分配dockerIP地址,

8.开始docker run,镜像

9.完成后会反馈给kubelet

10.kubelet会把状态属性告诉api

11.api又将收到的信息写入到etcd中,pod的状态信息

12.etcd反馈已写入

13.再去找kubelet

此时再用kubectl get pods 去找etcd

二:scheduler调度方式

  • nodeName用于将Pod调度到指定的node名称上(跳过调度器直接分配)
  • nodeSelector用于将pod调度到匹配label的node上

2.1 nodeName演示

2.1.1 编写yaml文件,其中指定nodename

[root@master1 ~]# vim nodename.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeName: 192.168.247.144
  containers:
  - name: nginx
    image: nginx:1.15

2.1.2 启动

[root@master1 ~]# kubectl apply -f nodename.yaml 
pod/pod-example created
[root@master1 ~]# kubectl get pods -w
NAME          READY   STATUS              RESTARTS   AGE
pod-example   0/1     ContainerCreating   0          8s
pod-example   1/1   Running   0     25s

2.1.3 查看描述信息中的详细事件,没有经过调度器

[root@master1 ~]# kubectl describe pod pod-example 
Events:
  Type    Reason   Age   From                      Message
  ----    ------   ----  ----                      -------
  Normal  Pulling  2m3s  kubelet, 192.168.247.144  pulling image "nginx:1.15"
  Normal  Pulled   100s  kubelet, 192.168.247.144  Successfully pulled image "nginx:1.15"
  Normal  Created  99s   kubelet, 192.168.247.144  Created container
  Normal  Started  99s   kubelet, 192.168.247.144  Started container

2.1.4 查看网络

[root@master1 ~]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE
pod-example   1/1     Running   0          2m45s   172.17.42.2   192.168.247.144   <none>

2.2 nodeSelector选择器

标签需要经过调度器

2.2.1 使用label标签给节点打标签

[root@master1 ~]# kubectl label --help
Usage:
  kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
[options]

2.2.2 查看node节点名称

[root@master1 ~]# kubectl get nodes
NAME              STATUS   ROLES    AGE   VERSION
192.168.247.143   Ready    <none>   13d   v1.12.3
192.168.247.144   Ready    <none>   13d   v1.12.3

2.2.3 依据名字,给node打标签

[root@master1 ~]# kubectl label nodes 192.168.247.143 gsy=01
node/192.168.247.143 labeled
[root@master1 ~]# kubectl label nodes 192.168.247.144 gsy=02
node/192.168.247.144 labeled

2.2.4 查看标签:

[root@master1 ~]# kubectl get nodes --show-labels
NAME              STATUS   ROLES    AGE   VERSION   LABELS
192.168.247.143   Ready    <none>   13d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gsy=01,kubernetes.io/hostname=192.168.247.143
192.168.247.144   Ready    <none>   13d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gsy=02,kubernetes.io/hostname=192.168.247.144

2.2.5 编写yaml文件

[root@master1 ~]# vim nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeSelector:
    gsy: 01
  containers:
  - name: nginx
    image: nginx:1.15
[root@master1 ~]# kubectl apply -f nodeselector.yaml 
for: "nodeselector.yaml": cannot convert int64 to string

2.2.6 出现报错,换个标签

发现可以,证明标签不能这么写

[root@master1 ~]# kubectl label nodes 192.168.247.143 shl=one
node/192.168.247.143 labeled
[root@master1 ~]# vim nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod8
  labels:
    app: nginx
spec:
  nodeSelector:
    shl: one
  containers:
  - name: nginx
    image: nginx:1.15
[root@master1 ~]# kubectl apply -f nodeselector.yaml 
pod/pod8 created
[root@master1 ~]# kubectl get pods -w -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE
pod-example   1/1     Running   0          30m   172.17.42.2   192.168.247.144   <none>
pod8          1/1     Running   0          27s   172.17.45.2   192.168.247.143   <none>

2.2.7 查看详细事件

[root@master1 ~]# kubectl describe pod pod8
Events:
  Type    Reason     Age   From                      Message
  ----    ------     ----  ----                      -------
  Normal  Scheduled  114s  default-scheduler         Successfully assigned default/pod8 to 192.168.247.143
  Normal  Pulling    114s  kubelet, 192.168.247.143  pulling image "nginx:1.15"
  Normal  Pulled     97s   kubelet, 192.168.247.143  Successfully pulled image "nginx:1.15"
  Normal  Created    97s   kubelet, 192.168.247.143  Created container
  Normal  Started    97s   kubelet, 192.168.247.143  Started container

标签需要经过调度器

2.2.8 再测试node原有的标签是否可行

[root@master1 ~]# vim 1nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod9
  labels:
    app: nginx
spec:
  nodeSelector:
    kubernetes.io/hostname: 192.168.247.144
  containers:
  - name: nginx
    image: nginx:1.15
[root@master1 ~]# kubectl get pods
[root@master1 ~]# kubectl apply -f 1nodeselector.yaml 
pod/pod9 created
[root@master1 ~]# kubectl get pods -w
NAME   READY   STATUS    RESTARTS   AGE
pod9   1/1     Running   0          12s
[root@master1 ~]# kubectl describe pod pod9
Events:
  Type    Reason     Age   From                      Message
  ----    ------     ----  ----                      -------
  Normal  Scheduled  33s   default-scheduler         Successfully assigned default/pod9 to 192.168.247.144
  Normal  Pulled     32s   kubelet, 192.168.247.144  Container image "nginx:1.15" already present on machine
  Normal  Created    32s   kubelet, 192.168.247.144  Created container
  Normal  Started    32s   kubelet, 192.168.247.144  Started container

2.2.9 证明可行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值