一、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
- 元信息
- pod分配到哪個node
- 記錄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>