K8s之調度約束

注意此篇文章接上篇:K8s之Pod進階
https://blog.51cto.com/14464303/2472123

原理:

kubernetes通過watch的機制進行每個組件的協作,每個組件之間的設計實現瞭解耦

在這裏插入圖片描述

調度方式:

nodeName用於將Pod調度到指定的Node名稱上(跳過調度器直接分配)

nodeSelector用於將Pod調度到匹配Label的Node上(前提是node要有標籤)

圖解:

左上角的運維人員往節點中創建一個nginx資源

(1)API Server和etcd和Scheduler是master

(2)Kubelet和Docker是node節點

API Server做爲唯一入口,接受create創建資源的屬性信息寫入到etcd中(屬性信息:名稱,鏡像名稱,限制條件),etcd完善發現機制(watch)給Scheduler調度器(查看那個節點適合),然後綁定相關pod的網絡信息,反饋給API Server,收到信息後api寫入etcd中,此時etcd存儲了pod的網絡信息(IP),node1、中的kubelet會管理pod資源,會觸發容器的創建命令,安裝完成後docker就會反饋狀態信息給API Server,當API Server收到狀態信息寫入到etcd中

總結:

apiserver相當於是平臺中的書記(負責記錄)

etcd相當於書記的記事本(內容寫在其中)

結論:API Server如果掛了,什麼都玩不了


示例1: nodeName

指定創建到某一臺節點服務器上

[root@master1 demo]# vim pod5.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeName: 192.168.18.148      #指定給node1節點
  containers:
  - name: nginx
    image: nginx:1.15
#驗證就可以到node1上看是否創建了nginx

`創建`
[root@master1 demo]# kubectl create -f pod5.yaml
pod/pod-example created

[root@master1 demo]# kubectl get pods
NAME                                READY   STATUS             RESTARTS   AGE
pod-example                         1/1     Running            0          37s

`查看詳細事件(發現未經過調度器)`
[root@master1 demo]# kubectl describe pod pod-example
Events:
  Type    Reason   Age   From                      Message
  ----    ------   ----  ----                      -------
  Normal  Pulled   37s   kubelet, 192.168.18.148  Container image "nginx:1.15" already present on machine       #此處未經過Scheduled調度器直接拉取鏡像
  Normal  Created  37s   kubelet, 192.168.18.148  Created container
  Normal  Started  37s   kubelet, 192.168.18.148  Started container

`清空pod資源`
[root@master1 demo]# kubectl delete -f .
[root@master1 demo]# kubectl get pods
No resources found.

示例2:nodeSelector

`獲取標籤幫助`

`需要獲取node上的NAME名稱`
[root@master1 demo]# kubectl get node
NAME             STATUS   ROLES    AGE   VERSION
192.168.18.145   Ready    <none>   14d   v1.12.3
192.168.18.148   Ready    <none>   14d   v1.12.3

`給對應的node設置標籤分別爲ky=a和ky=b`
[root@master1 demo]# kubectl label nodes 192.168.18.148 ky=a
node/192.168.18.148 labeled
[root@master1 demo]# kubectl label nodes 192.168.18.145 ky=b
node/192.168.18.145 labeled

`查看標籤`
[root@master1 demo]# kubectl get nodes --show-labels
NAME             STATUS   ROLES    AGE   VERSION   LABELS
192.168.18.145   Ready    <none>   14d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.18.145,ky=b
192.168.18.148   Ready    <none>   14d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.18.148,ky=a

`pod5.yaml文件做如下修改`
[root@master1 demo]# vim pod5.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeSelector:     #修改處
    ky: a           #修改處
  containers:
  - name: nginx
    image: nginx:1.15
#修改完成後按Esc退出插入模式,輸入:wq保存退出

`創建新資源`
[root@master1 demo]# kubectl create -f pod5.yaml
pod/pod-example created
[root@master1 demo]# kubectl get pods
NAME                                READY   STATUS             RESTARTS   AGE
pod-example                         1/1     Running            0          3s

`查看詳細事件(通過事件可以觀察經過調度器分配)`
[root@master1 demo]# kubectl describe pod pod-example
Events:
  Type    Reason     Age   From                     Message
  ----    ------     ----  ----                     -------
  Normal  Scheduled  85s   default-scheduler        Successfully assigned default/pod-example to 192.168.18.148     #此時經過了Scheduled調度器
  Normal  Pulled     85s   kubelet, 192.168.18.148  Container image "nginx:1.15" already present on machine
  Normal  Created    85s   kubelet, 192.168.18.148  Created container
  Normal  Started    84s   kubelet, 192.168.18.148  Started container

`查看分配節點`
[root@master1 demo]# kubectl get pods -o wide
NAME          READY  STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE
pod-example   1/1    Running   0          3m35s   172.17.32.2   192.168.18.148   <none>

故障排除

在這裏插入圖片描述

1.查看pod事件

kubectl describe TYPE NAME_PREFIX

2.查看pod日誌(Failed狀態下)

kubectl logs POD_NAME

3.進入pod(狀態爲running,但是服務沒有提供)

kubectl exec –it POD_NAME bash

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