1. 程式人生 > >Kubernetes核心原理(一)之API Server

Kubernetes核心原理(一)之API Server

1. API Server簡介

k8s API Server提供了k8s各類資源物件(pod,RC,Service等)的增刪改查及watch等HTTP Rest介面,是整個系統的資料匯流排和資料中心。

kubernetes API Server的功能:

  1. 提供了叢集管理的REST API介面(包括認證授權、資料校驗以及叢集狀態變更);
  2. 提供其他模組之間的資料互動和通訊的樞紐(其他模組通過API Server查詢或修改資料,只有API Server才直接操作etcd);
  3. 是資源配額控制的入口;
  4. 擁有完備的叢集安全機制.

kube-apiserver工作原理圖


2. 如何訪問kubernetes A

PI

k8s通過kube-apiserver這個程序提供服務,該程序執行在單個k8s-master節點上。預設有兩個埠。

2.1. 本地埠

  1. 該埠用於接收HTTP請求;
  2. 該埠預設值為8080,可以通過API Server的啟動引數“--insecure-port”的值來修改預設值;
  3. 預設的IP地址為“localhost”,可以通過啟動引數“--insecure-bind-address”的值來修改該IP地址;
  4. 非認證或授權的HTTP請求通過該埠訪問API Server。

2.2. 安全埠

  1. 該埠預設值為6443,可通過啟動引數“--secure-port”的值來修改預設值;
  2. 預設IP地址為非本地(Non-Localhost)網路埠,通過啟動引數“--bind-address”設定該值;
  3. 該埠用於接收HTTPS請求;
  4. 用於基於Tocken檔案或客戶端證書及HTTP Base的認證;
  5. 用於基於策略的授權;
  6. 預設不啟動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權威指南》