《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

k8s API Server提供了k8s各類資源對象(pod,RC,Service等)的增刪改查及watch等HTTP Rest接口,是整個系統的數據總線和數據中心。

(一)kubernetes API Server的功能:

提供了集群管理的REST API接口(包括認證授權、數據校驗以及集群狀態變更);

提供其他模塊之間的數據交互和通信的樞紐(其他模塊通過API Server查詢或修改數據,只有API Server才直接操作etcd);

是資源配額控制的入口;

擁有完備的集群安全機制。

(二)工作原理:

結合上圖來從四步驟來學學習API Server的原理:

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖2:API-server原理

1、REST API

kube-apiserver支持同時提供https(默認監聽在6443端口)和http API(默認監聽在 127.0.0.1的8080 端口)兩個接口提供的 REST API 格式相同。kube-apiserver的API調用格式如下圖所示:

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖3:API接口調用方式

查看API接口地址

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖4:查看API接口地址

查詢 Kubernetes API 支持的 API 版本

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖5:查看API接口版本

查詢Kubernetes API的資源對象

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖6:查看Kubernetes資源對象

2、訪問控制

(1)認證

開啟 TLS 時,所有的請求都需要首先認證。Kubernetes 支持多種認證機制,並支持同時開啟多個認證插件(只要有一個認證通過即可)。如果認證成功,則用戶的 username 會傳入授權模塊做進一步授權驗證;而對於認證失敗的請求則返回 HTTP 401。

認證之後的請求就到了授權模塊。跟認證類似,Kubernetes 也支持多種授權機制,並支持同時開啟多個授權插件(只要有一個驗證通過即可)。如果授權成功,則用戶的請求會發送到准入控制模塊做進一步的請求驗證;而對於授權失敗的請求則返回 HTTP 403.

(3)准入控制

准入控制(Admission Control)用來對請求做進一步的驗證或添加默認參數。不同於授權和認證只關心請求的用戶和操作,准入控制還處理請求的內容,並且僅對創建、更新、刪除或連接(如代理)等有效,而對讀操作無效。准入控制也支持同時開啟多個插件,它們依次調用,只有全部插件都通過的請求才可以放過進入系統。

3、訪問方式

(1)使用curl訪問

<code>[root@k8s-master ~]# curl https://192.168.1.3:6443/api --cacert /usr/local/kubernetes/ssl/ca.pem --cert /usr/local/kubernetes/ssl/kube-controller-manager.pem --key /usr/local/kubernetes/ssl/kube-controller-manager-key.pem/<code>
《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖7:使用curl訪問API接口

<code>[root@k8s-master ~]# curl https://192.168.1.3:6443/api/v1 --cacert /usr/local/kubernetes/ssl/ca.pem --cert /usr/local/kubernetes/ssl/kube-controller-manager.pem --key /usr/local/kubernetes/ssl/kube-controller-manager-key.pem
[root@k8s-master ~]# curl https://192.168.1.3:6443/api/v1/pods --cacert /usr/local/kubernetes/ssl/ca.pem --cert /usr/local/kubernetes/ssl/kube-controller-manager.pem --key /usr/local/kubernetes/ssl/kube-controller-manager-key.pem

[root@k8s-master ~]# curl https://192.168.1.3:6443/api/v1/replicationcontrollers --cacert /usr/local/kubernetes/ssl/ca.pem --cert /usr/local/kubernetes/ssl/kube-controller-manager.pem --key /usr/local/kubernetes/ssl/kube-controller-manager-key.pem

[root@k8s-master ~]# curl https://192.168.1.3:6443/api/v1/services --cacert /usr/local/kubernetes/ssl/ca.pem --cert /usr/local/kubernetes/ssl/kube-controller-manager.pem --key /usr/local/kubernetes/ssl/kube-controller-manager-key.pem/<code>

(2)使用Kubectl Proxy

啟動端口:

注意:必須要開啟端口,否則無法查看

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖8:開啟代理

查看默認(所有)API接口

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖9:查看API接口

查看指定接口

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖10:查看指定API接口

查看version信息

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖11:查看Kubernetes版本

(3)kubectl客戶端

命令行工具kubectl客戶端,通過命令行參數轉換為對API Server的REST API調用,並將調用結果輸出。

命令格式:kubectl [command] [options]

例如:

查看

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖12:查看API接口

查看服務

《蹲坑學kubernetes》之9-1: kube-apiserver原理詳解

圖13:查看service

(4)編程方式調用

使用場景:

運行在Pod裡的用戶進程調用kubernetes API,通常用來實現分佈式集群搭建的目標。

開發基於kubernetes的管理平臺,比如調用kubernetes API來完成Pod、Service、RC等資源對象的圖形化創建和管理界面。

4、集群功能模塊之間的通信

kubernetes API Server作為集群的核心,負責集群各功能模塊之間的通信,集群內各個功能模塊通API Server將信息存入etcd當需要獲取和操作這些數據時,通過API Server提供的REST接口(GET\\LIST\\WATCH方法)來實現,從而實現各模塊之間的信息交互。

(1)kubelet與API Server交互

每個Node節點上的kubelet定期就會調用API Server的REST接口報告自身狀態,API Server接收這些信息後,將節點狀態信息更新到etcd中。kubelet也通過API Server的Watch接口監聽Pod信息,從而對Node機器上的POD進行管理。

(2)kube-controller-manager與API Server交互

kube-controller-manager中的Node Controller模塊通過API Server提供的Watch接口,實時監控Node的信息,並做相應處理。

(3)kube-scheduler與API Server交互

Scheduler通過API Server的Watch接口監聽到新建Pod副本的信息後,它會檢索所有符合該Pod要求的Node列表,開始執行Pod調度邏輯。調度成功後將Pod綁定到目標節點上。


分享到:


相關文章: