k8s API Server提供了k8s各種資源對象(pod,RC,Service等)的增刪改查及watch等HTTP Rest接口,是整個系統的數據總線和數據中心。node
kubernetes API Server的功能:git
kube-apiserver工做原理圖github
k8s經過kube-apiserver這個進程提供服務,該進程運行在單個k8s-master節點上。默認有兩個端口。web
Kubernetes REST API可參考https://kubernetes.io/docs/api-reference/v1.6/數據庫
1 |
curl localhost:8080/api |
Kubectl Proxy代理程序既能做爲API Server的反向代理,也能做爲普通客戶端訪問API Server的代理。經過master節點的8080端口來啓動該代理程序。express
kubectl proxy --port=8080 &編程
具體見kubectl proxy --helpapi
|
[root@node5 ~]# kubectl proxy --help |
命令行工具kubectl客戶端,經過命令行參數轉換爲對API Server的REST API調用,並將調用結果輸出。緩存
命令格式:kubectl [command] [options]安全
具體可參考k8s經常使用命令
使用場景:
一、運行在Pod裏的用戶進程調用kubernetes API,一般用來實現分佈式集羣搭建的目標。
二、開發基於kubernetes的管理平臺,好比調用kubernetes API來完成Pod、Service、RC等資源對象的圖形化建立和管理界面。可使用kubernetes提供的Client Library。
具體可參考https://github.com/kubernetes/client-go。
k8s API Server最主要的REST接口是資源對象的增刪改查,另外還有一類特殊的REST接口—k8s Proxy API接口,這類接口的做用是代理REST請求,即kubernetes API Server把收到的REST請求轉發到某個Node上的kubelet守護進程的REST端口上,由該kubelet進程負責響應。
關於Node相關的接口的REST路徑爲:/api/v1/proxy/nodes/{name},其中{name}爲節點的名稱或IP地址。
1 |
/api/v1/proxy/nodes/{name}/pods/ #列出指定節點內全部Pod的信息 |
這裏獲取的Pod信息來自Node而非etcd數據庫,二者時間點可能存在誤差。若是在kubelet進程啓動時加–enable-debugging-handles=true參數,那麼kubernetes Proxy API還會增長如下接口:
1 |
/api/v1/proxy/nodes/{name}/run #在節點上運行某個容器 |
1 |
/api/v1/proxy/namespaces/{namespace}/pods/{name}/{path:*} #訪問pod的某個服務接口 |
1 |
/api/v1/proxy/namespaces/{namespace}/services/{name} |
Pod的proxy接口的做用:在kubernetes集羣以外訪問某個pod容器的服務(HTTP服務),能夠用Proxy API實現,這種場景多用於管理目的,好比逐一排查Service的Pod副本,檢查哪些Pod的服務存在異常問題。
kubernetes API Server做爲集羣的核心,負責集羣各功能模塊之間的通訊,集羣內各個功能模塊經過API Server將信息存入etcd,當須要獲取和操做這些數據時,經過API Server提供的REST接口(GET/LIST/WATCH方法)來實現,從而實現各模塊之間的信息交互。
每一個Node節點上的kubelet按期就會調用API Server的REST接口報告自身狀態,API Server接收這些信息後,將節點狀態信息更新到etcd中。kubelet也經過API Server的Watch接口監聽Pod信息,從而對Node機器上的POD進行管理。
監聽信息 | kubelet動做 | 備註 |
---|---|---|
新的POD副本被調度綁定到本節點 | 執行POD對應的容器的建立和啓動邏輯 | - |
POD對象被刪除 | 刪除本節點上相應的POD容器 | - |
修改POD信息 | 修改本節點的POD容器 | - |
kube-controller-manager中的Node Controller模塊經過API Server提供的Watch接口,實時監控Node的信息,並作相應處理。
Scheduler經過API Server的Watch接口監聽到新建Pod副本的信息後,它會檢索全部符合該Pod要求的Node列表,開始執行Pod調度邏輯。調度成功後將Pod綁定到目標節點上。
爲了緩解各模塊對API Server的訪問壓力,各功能模塊都採用緩存機制來緩存數據,各功能模塊定時從API Server獲取指定的資源對象信息(LIST/WATCH方法),而後將信息保存到本地緩存,功能模塊在某些狀況下不直接訪問API Server,而是經過訪問緩存數據來間接訪問API Server。
參考《kubernetes權威指南》
https://www.huweihuang.com/article/kubernetes/core-principle/kubernetes-core-principle-api-server/