K8S 核心組件 api server 介紹

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. 方式1
kubectl proxy --reject-paths="/api/v1/replicationcontrollers" ---port=8001

以上命令在8001對外暴露 rest api, 對于/api/v1/replicationcontrollers 的API 不允許訪問

  1. 方式2

也可以使用--accept-hosts 參數指定訪問白名單

kubectl proxy --accept-hosts="^localhost.^127\\.0\\.0\\.1$,\\[::1\\]$" ---port=8001
  1. 方式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 架構解析

image.png
  1. api層: 主要提供對外的 rest api
  2. 訪問控制層: 驗證身份與鑒權,根據配置的各種資源訪問許可邏輯(Adminssion control) ,判斷是否允許訪問
  3. 注冊表層: K8S 將所有對象都保存在registry 中, 針對 registry 中的各種資源對象, 都定義對象類型, 如何創建資源對象, 如何轉換不同版本, 以及如何將資源編碼和解碼為json 或protobuf 格式進行存儲.
  4. etcd 數據庫: 用于持久化存儲快s 資源對象.

api server list watch 機制解析

image.png

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 內置資源都包含了如下主要功能

  1. 資源對象的元數據(Schema)的定義: 可以將其理解為數據庫的table定義,定義了資源的數據結構, 官方建議內建資源對象的元數據定義固話在源代碼中.
  2. 資源對象的校驗邏輯: 確保用戶提交的資源對象的屬性的合法性
  3. 資源對象的CRUD操作代碼: 可以將其裂解為數據庫表的CRUD代碼.
  4. 資源對象相關的自動控制,比如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.

集群功能模塊之間的通信

image.png

原創不易如果文章對您有所幫助

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容