注意此篇文章接上篇: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