乾貨!K8S之pod創建流程+調度約束

一、pod創建過程

Kubernetes通過watch的機制進行每個組件的協作,每個組件之間的設計實現瞭解耦。
在這裏插入圖片描述

  • 用戶使用create yaml創建pod,請求給apiseerver,apiserver.將yaml中的屬性信息(metadata)寫入etcd
  • apiserver觸發watch機制準備創建pod,信息轉發給調度器,調度器使用調度算法選擇node,調度器將node信息給apiserver,apiserver_將綁定的node信息寫入etcd
  • apiserver又通過watch機制,調用kubelet,指定pod信息,觸發docker run命 令創建容器
  • 創建完成之後反饋給kubelet, kubelet又將pod的狀態信息給apiserver,
    apiserver又將pod的狀態信息寫入etcd。
  • 其中kubectl get pods命令調用的時etcd_的信息

注意:圖中有三次write

  1. 元信息
  2. pod分配到哪個node
  3. 記錄pod狀態

二、調度方式(指定節點創建pod)

兩種調度方式:

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

示例1:nodeName

  • 創建nginx的pod資源,指定分配到192.168.5.20節點上
###編寫yaml文件
[root@k8s_master ~]# vim nginx1.yaml
apiVersion: v1  
kind: Pod  
metadata:
  name: pod-example  
  labels:
    app: nginx  
spec:
  nodeName: 192.168.5.20
  containers:
  - name: nginx  
    image: nginx:1.15

##執行創建
[root@k8s_master ~]# kubectl  apply -f nginx1.yaml 
pod/pod-example created
  • 查看資源分配情況
##查看資源分配到哪個節點
[root@k8s_master ~]# kubectl  get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE
pod-example   1/1     Running   0          56s   172.17.50.3   192.168.5.20   <none>

##查看創建日誌,發現直接跳過了調度器
[root@k8s_master ~]# kubectl  describe pod pod-example
....省略部分
  Type    Reason   Age   From                   Message
  ----    ------   ----  ----                   -------
  Normal  Pulling  2m6s  kubelet, 192.168.5.20  pulling image "nginx:1.15"
  Normal  Pulled   102s  kubelet, 192.168.5.20  Successfully pulled image "nginx:1.15"
  Normal  Created  102s  kubelet, 192.168.5.20  Created container
  Normal  Started  102s  kubelet, 192.168.5.20  Started container

實例2:nodeSelector

先給node創建標籤》》創建資源指定匹配該標籤

  • 給後端2個node節點設置標籤,分別爲abc=node1和abc=node2
##創建標籤
[root@k8s_master ~]# kubectl label node 192.168.5.20 abc=node1
node/192.168.5.20 labeled
[root@k8s_master ~]# kubectl label node 192.168.5.30 abc=node2
node/192.168.5.30 labeled

##查看已經創建的標籤
[root@k8s_master ~]# kubectl get nodes --show-labels
NAME           STATUS   ROLES    AGE   VERSION   LABELS
192.168.5.20   Ready    <none>   23d   v1.12.3   abc=node1,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.5.20
192.168.5.30   Ready    <none>   23d   v1.12.3   abc=node2,abcd=1,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.5.30

  • 創建資源,指定分配到abc=node2標籤上
##編寫yaml文件
[root@k8s_master ~]# vim nginx2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example2
  labels:
    app: nginx
spec:
  nodeSelector: 
    abc: node2
  containers:
  - name: nginx
    image: nginx:1.15

##創建pod資源
[root@k8s_master ~]# kubectl create -f nginx2.yaml 
  • 查看資源分配情況
[root@k8s_master ~]# kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE
pod-example2   1/1     Running   0          50s   172.17.32.2   192.168.5.30   <none>

##查看創建日誌
[root@k8s_master ~]# kubectl describe pod pod-example2
.....省略部分內容
  Type    Reason     Age   From                   Message
  ----    ------     ----  ----                   -------
  Normal  Scheduled  112s  default-scheduler      Successfully assigned default/pod-example2 to 192.168.5.30
  Normal  Pulling    110s  kubelet, 192.168.5.30  pulling image "nginx:1.15"
  Normal  Pulled     98s   kubelet, 192.168.5.30  Successfully pulled image "nginx:1.15"
  Normal  Created    98s   kubelet, 192.168.5.30  Created container
  Normal  Started    98s   kubelet, 192.168.5.30  Started container

三、pod資源狀態解析

在這裏插入圖片描述
查看pod詳細信息

kubectl describ <type>  <name>

查看pod日誌(Failed狀態下)

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