Kubernetes核心原理(一)之API Server
1. API Server簡介
k8s API Server提供了k8s各類資源物件(pod,RC,Service等)的增刪改查及watch等HTTP Rest介面,是整個系統的資料匯流排和資料中心。
kubernetes API Server的功能:
- 提供了叢集管理的REST API介面(包括認證授權、資料校驗以及叢集狀態變更);
- 提供其他模組之間的資料互動和通訊的樞紐(其他模組通過API Server查詢或修改資料,只有API Server才直接操作etcd);
- 是資源配額控制的入口;
- 擁有完備的叢集安全機制.
kube-apiserver工作原理圖
2. 如何訪問kubernetes A
k8s通過kube-apiserver這個程序提供服務,該程序執行在單個k8s-master節點上。預設有兩個埠。
2.1. 本地埠
- 該埠用於接收HTTP請求;
- 該埠預設值為8080,可以通過API Server的啟動引數“--insecure-port”的值來修改預設值;
- 預設的IP地址為“localhost”,可以通過啟動引數“--insecure-bind-address”的值來修改該IP地址;
- 非認證或授權的HTTP請求通過該埠訪問API Server。
2.2. 安全埠
- 該埠預設值為6443,可通過啟動引數“--secure-port”的值來修改預設值;
- 預設IP地址為非本地(Non-Localhost)網路埠,通過啟動引數“--bind-address”設定該值;
- 該埠用於接收HTTPS請求;
- 用於基於Tocken檔案或客戶端證書及HTTP Base的認證;
- 用於基於策略的授權;
- 預設不啟動HTTPS安全訪問控制。
2.3. 訪問方式
2.3.1. curl
curl
localhost: 8080 /api
curl
localhost: 8080 /api/v1/pods
curl
localhost: 8080 /api/v1/services
curl
localhost: 8080 /api/v1/replicationcontrollers
|
2.3.2. Kubectl Proxy
Kubectl Proxy代理程式既能作為API Server的反向代理,也能作為普通客戶端訪問API Server的代理。通過master節點的8080埠來啟動該代理程式。
kubectl proxy --port=8080 &
具體見kubectl proxy --help
2.3.3. kubectl客戶端
命令列工具kubectl客戶端,通過命令列引數轉換為對API Server的REST API呼叫,並將呼叫結果輸出。
命令格式:kubectl [command] [options]
2.3.4. 程式設計方式呼叫
使用場景:
1、執行在Pod裡的使用者程序呼叫kubernetes API,通常用來實現分散式叢集搭建的目標。
2、開發基於kubernetes的管理平臺,比如呼叫kubernetes API來完成Pod、Service、RC等資源物件的圖形化建立和管理介面。可以使用kubernetes提供的Client Library。
3. 通過API Server訪問Node、Pod和Service
k8s API Server最主要的REST介面是資源物件的增刪改查,另外還有一類特殊的REST介面—k8s Proxy API介面,這類介面的作用是代理REST請求,即kubernetes API Server把收到的REST請求轉發到某個Node上的kubelet守護程序的REST埠上,由該kubelet程序負責響應。
3.1. Node相關介面
關於Node相關的介面的REST路徑為:/api/v1/proxy/nodes/{name},其中{name}為節點的名稱或IP地址。
/api/v1/proxy/nodes/ {name} /pods/ #列出指定節點內所有Pod的資訊
/api/v1/proxy/nodes/ {name} /stats/ #列出指定節點內物理資源的統計資訊
/api/v1/prxoy/nodes/ {name} /spec/ #列出指定節點的概要資訊
|
這裡獲取的Pod資訊來自Node而非etcd資料庫,兩者時間點可能存在偏差。如果在kubelet程序啟動時加--enable-debugging-handles=true引數,那麼kubernetes Proxy API還會增加以下介面:
/api/v1/proxy/nodes/ {name} /run #在節點上執行某個容器
/api/v1/proxy/nodes/ {name} /exec #在節點上的某個容器中執行某條命令
/api/v1/proxy/nodes/ {name} /attach #在節點上attach某個容器
/api/v1/proxy/nodes/ {name} /portForward #實現節點上的Pod埠轉發
/api/v1/proxy/nodes/ {name} /logs #列出節點的各類日誌資訊
/api/v1/proxy/nodes/ {name} /metrics #列出和該節點相關的Metrics資訊
/api/v1/proxy/nodes/ {name} /runningpods #列出節點內執行中的Pod資訊
/api/v1/proxy/nodes/ {name} /debug/pprof #列出節點內當前web服務的狀態,包括CPU和記憶體的使用情況
|
3.2. Pod相關介面
/api/v1/proxy/namespaces/ {namespace} /pods/ {name}/{path:*} #訪問pod的某個服務介面
/api/v1/proxy/namespaces/ {namespace} /pods/ {name} #訪問Pod
#以下寫法不同,功能一樣
/api/v1/namespaces/ {namespace} /pods/ {name} /proxy/ {path:*} #訪問pod的某個服務介面
/api/v1/namespaces/ {namespace} /pods/ {name} /proxy #訪問Pod
|
3.3. Service相關介面
/api/v1/proxy/namespaces/ {namespace} /services/ {name}
|
Pod的proxy介面的作用:在kubernetes叢集之外訪問某個pod容器的服務(HTTP服務),可以用Proxy API實現,這種場景多用於管理目的,比如逐一排查Service的Pod副本,檢查哪些Pod的服務存在異常問題。
4. 叢集功能模組之間的通訊
kubernetes API Server作為叢集的核心,負責叢集各功能模組之間的通訊,叢集內各個功能模組通過API Server將資訊存入etcd,當需要獲取和操作這些資料時,通過API Server提供的REST介面(GET\LIST\WATCH方法)來實現,從而實現各模組之間的資訊互動。
4.1. kubelet與API Server互動
每個Node節點上的kubelet定期就會呼叫API Server的REST介面報告自身狀態,API Server接收這些資訊後,將節點狀態資訊更新到etcd中。kubelet也通過API Server的Watch介面監聽Pod資訊,從而對Node機器上的POD進行管理。
監聽資訊 | kubelet動作 | 備註 |
---|---|---|
新的POD副本被排程繫結到本節點 | 執行POD對應的容器的建立和啟動邏輯 | |
POD物件被刪除 | 刪除本節點上相應的POD容器 | |
修改POD資訊 | 修改本節點的POD容器 |
4.2. kube-controller-manager與API Server互動
kube-controller-manager中的Node Controller模組通過API Server提供的Watch介面,實時監控Node的資訊,並做相應處理。
4.3. kube-scheduler與API Server互動
Scheduler通過API Server的Watch介面監聽到新建Pod副本的資訊後,它會檢索所有符合該Pod要求的Node列表,開始執行Pod排程邏輯。排程成功後將Pod繫結到目標節點上。
4.4. 特別說明
為了緩解各模組對API Server的訪問壓力,各功能模組都採用快取機制來快取資料,各功能模組定時從API Server獲取指定的資源物件資訊(LIST/WATCH方法),然後將資訊儲存到本地快取,功能模組在某些情況下不直接訪問API Server,而是通過訪問快取資料來間接訪問API Server。
參考《kubernetes權威指南》