kubernetes--調度約束

基本原理

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

調度方式

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

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

#插圖#

原理詳解

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

API Server和etcd和Scheduler是master.

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中.

API Server相當於是平臺中的管理員,負責記錄相關信息,

etcd相當於管理員的記事本,相關信息內容寫在其中,

如果API Server掛了,那麼k8s基本上就癱瘓了.

範例演示-nodeName

  • 編輯yaml文件
vim pod5.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeName: 192.168.142.131
  #指定給node1節點
  containers:
  - name: nginx
    image: nginx:1.15
    #驗證是否創建了nginx
  • 創建yaml文件
kubectl create -f pod5.yaml

kubectl get pods
  • 查看詳細事件,發現未經過調度器
kubectl describe pod pod-example
  • 清空pod資源
kubectl delete -f .

kubectl get pods

範例演示-nodeSelector

  • 獲取標籤幫助
kubectl label --help
  • 需要獲取node上的NAME名稱
kubectl get node
  • 給對應的node設置標籤分別爲kgc=a和kgc=b
kubectl label nodes 192.168.142.130 kgc=a

kubectl label nodes 192.168.142.131 kgc=b
  • 查看標籤
kubectl get nodes --show-labels

vim pod5.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeSelector: 
    kgc: b
  containers:
  - name: nginx
    image: nginx:1.15

kubectl apply -f pod5.yaml
  • 查看詳細事件,通過事件可以觀察經過調度器分配
kubectl describe pod pod-example

故障排除

  • 查看pod事件
kubectl describe TYPE NAME_PREFIX
  • 查看pod日誌(Failed狀態下)
kubectl logs POD_NAME
  • 進入pod(狀態爲running,但是服務沒有提供)
kubectl exec –it POD_NAME bash

#插圖#

謝謝閱讀!

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