理論+實操: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 證明可行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章