ApiServer 核心功能
- 集群管理的API 入口
- 資源配置控制入口
- 提供完備的集群安全機制
api server 是通過kube-apiserver 進程來提供服務的. 默認情況下在本機8080端口提供 rest 服務(--insecure-port), 也可以啟用HTTPS 安全端口 (--secure-port=6443)
roger@microk8s:~$ curl localhost:8080/api
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "192.168.10.5:16443"
}
]
}
可以看到API 版本是v1
使用下面的url 來查詢資源
curl localhost:8080/api/v1/serivces
curl localhost:8080/api/v1/pods
curl localhost:8080/api/v1/replicaioncontrollers
curl localhost:8080/apis #查看API 分組
注意以上命令都是在master 節點執行
對外暴露REST api
- 方式1
kubectl proxy --reject-paths="/api/v1/replicationcontrollers" ---port=8001
以上命令在8001對外暴露 rest api, 對于/api/v1/replicationcontrollers 的API 不允許訪問
- 方式2
也可以使用--accept-hosts 參數指定訪問白名單
kubectl proxy --accept-hosts="^localhost.^127\\.0\\.0\\.1$,\\[::1\\]$" ---port=8001
- 方式3
通過編程方式調用api server. 這種方式一般分為兩種場景
- 運行在POD里的用戶進程需要調用 api server 以獲取集群信息,通常應用在分布式集群搭建目標中, 比如ES集群.
- 開發基于K8S的管理平臺.
在第一種場景中 apiserver 在K8S 集群中體現為名為 kubernetes的 service
roger@microk8s:~$ kubectl get service --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default default-http-backend ClusterIP 10.152.183.69 <none> 80/TCP 18d
default http-svc ClusterIP 10.152.183.164 <none> 80/TCP 18d
default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 87d
kube-system heapster ClusterIP 10.152.183.79 <none> 80/TCP 18d
kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 28d
kube-system kubernetes-dashboard ClusterIP 10.152.183.163 <none> 443/TCP 18d
kube-system monitoring-grafana ClusterIP 10.152.183.244 <none> 80/TCP 18d
kube-system monitoring-influxdb ClusterIP 10.152.183.223 <none> 8083/TCP,8086/TCP 18d
api server 架構解析
- api層: 主要提供對外的 rest api
- 訪問控制層: 驗證身份與鑒權,根據配置的各種資源訪問許可邏輯(Adminssion control) ,判斷是否允許訪問
- 注冊表層: K8S 將所有對象都保存在registry 中, 針對 registry 中的各種資源對象, 都定義對象類型, 如何創建資源對象, 如何轉換不同版本, 以及如何將資源編碼和解碼為json 或protobuf 格式進行存儲.
- etcd 數據庫: 用于持久化存儲快s 資源對象.
api server list watch 機制解析
api server 通過etcd的watch 接口監聽資源的變更情況,當事件發生時 etcd 會通知 api server 比如步驟3, 為了讓K8S的其他組件不依賴于etcd, api server 模仿etcd 提供了watch 機制, 當事件發生時,通知對應的組件 比如 4 8 12步驟中的實踐 0 表示最開始進行watch 監控.
api server的api 版本控制
api server 針對每種資源都引入了一個相對不便的interal版本, 所有其他版本的資源對象(數據結構)只要支持能夠轉換為internal 就可以與其他版本的對象互換.
customer resource definition CRD
K8S 內置資源都包含了如下主要功能
- 資源對象的元數據(Schema)的定義: 可以將其理解為數據庫的table定義,定義了資源的數據結構, 官方建議內建資源對象的元數據定義固話在源代碼中.
- 資源對象的校驗邏輯: 確保用戶提交的資源對象的屬性的合法性
- 資源對象的CRUD操作代碼: 可以將其裂解為數據庫表的CRUD代碼.
- 資源對象相關的自動控制,比如deployment對象后的控制器. 這是很重要的一個功能, 用戶給出期望的資源對象聲明, 運行過程中擇優背后的"自動控制器"負責, 確保對應的資源對象數量, 狀態, 行為 都符合預期.
現在CRD 的1-3 步無序編程實現,直接寫yaml 即可, 第四部, 通過調用用 api server 的api 來實現.
k8s proxy api 接口
proxy api 接口是指 api server 會把rest 請求轉發到其K8S 組件, 又其他組件(比如kubelet)來響應的特殊接口.
比如node 相關的接口由kubelet響應
/api/v1/proxy/nodes/{name}/pods # 獲取節點上所有pod
/api/v1/proxy/nodes/{name}/stats #獲取節點的物理資源統計
/api/v1/proxy/nodes/{name}/spec #獲取節點的概要信息
注意{name} 是節點的名稱或者地址,這里獲取的數據都來自kubelet 而非 etcd,所以兩者的數據有時候會有偏差, 如果kubelet 啟動時包含了 --enable--debugging-handlers=true 參數 那么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}/portForwad # 實現節點上的pod 端口轉發
/api/v1/proxy/nodes/{name}/log # 列出節點的個類日志信息,例如tallylog lastlog wtmp ppp/ shsm/ audit/ tuned/ 和 annaconda 等
/api/v1/proxy/nodes/{name}/metrics # 獲取節點上相關的metrics信息
/api/v1/proxy/nodes/{name}/runningpods
/api/v1/proxy/nodes/{name}/debug/pprof # 列出當前節點web服務狀態包括CPU 占用和內存占用情ingkuang.
集群功能模塊之間的通信
原創不易如果文章對您有所幫助