ApiServer 核心功能
- 集群管理的API 入口
- 資源配置控制入口
- 提供完備的集群安全機(jī)制
api server 是通過(guò)kube-apiserver 進(jìn)程來(lái)提供服務(wù)的. 默認(rèn)情況下在本機(jī)8080端口提供 rest 服務(wù)(--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 來(lái)查詢(xún)資源
curl localhost:8080/api/v1/serivces
curl localhost:8080/api/v1/pods
curl localhost:8080/api/v1/replicaioncontrollers
curl localhost:8080/apis #查看API 分組
注意以上命令都是在master 節(jié)點(diǎn)執(zhí)行
對(duì)外暴露REST api
- 方式1
kubectl proxy --reject-paths="/api/v1/replicationcontrollers" ---port=8001
以上命令在8001對(duì)外暴露 rest api, 對(duì)于/api/v1/replicationcontrollers 的API 不允許訪(fǎng)問(wèn)
- 方式2
也可以使用--accept-hosts 參數(shù)指定訪(fǎng)問(wèn)白名單
kubectl proxy --accept-hosts="^localhost.^127\\.0\\.0\\.1$,\\[::1\\]$" ---port=8001
- 方式3
通過(guò)編程方式調(diào)用api server. 這種方式一般分為兩種場(chǎng)景
- 運(yùn)行在POD里的用戶(hù)進(jìn)程需要調(diào)用 api server 以獲取集群信息,通常應(yīng)用在分布式集群搭建目標(biāo)中, 比如ES集群.
- 開(kāi)發(fā)基于K8S的管理平臺(tái).
在第一種場(chǎng)景中 apiserver 在K8S 集群中體現(xiàn)為名為 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 架構(gòu)解析
- api層: 主要提供對(duì)外的 rest api
- 訪(fǎng)問(wèn)控制層: 驗(yàn)證身份與鑒權(quán),根據(jù)配置的各種資源訪(fǎng)問(wèn)許可邏輯(Adminssion control) ,判斷是否允許訪(fǎng)問(wèn)
- 注冊(cè)表層: K8S 將所有對(duì)象都保存在registry 中, 針對(duì) registry 中的各種資源對(duì)象, 都定義對(duì)象類(lèi)型, 如何創(chuàng)建資源對(duì)象, 如何轉(zhuǎn)換不同版本, 以及如何將資源編碼和解碼為json 或protobuf 格式進(jìn)行存儲(chǔ).
- etcd 數(shù)據(jù)庫(kù): 用于持久化存儲(chǔ)快s 資源對(duì)象.
api server list watch 機(jī)制解析
api server 通過(guò)etcd的watch 接口監(jiān)聽(tīng)資源的變更情況,當(dāng)事件發(fā)生時(shí) etcd 會(huì)通知 api server 比如步驟3, 為了讓K8S的其他組件不依賴(lài)于etcd, api server 模仿etcd 提供了watch 機(jī)制, 當(dāng)事件發(fā)生時(shí),通知對(duì)應(yīng)的組件 比如 4 8 12步驟中的實(shí)踐 0 表示最開(kāi)始進(jìn)行watch 監(jiān)控.
api server的api 版本控制
api server 針對(duì)每種資源都引入了一個(gè)相對(duì)不便的interal版本, 所有其他版本的資源對(duì)象(數(shù)據(jù)結(jié)構(gòu))只要支持能夠轉(zhuǎn)換為internal 就可以與其他版本的對(duì)象互換.
customer resource definition CRD
K8S 內(nèi)置資源都包含了如下主要功能
- 資源對(duì)象的元數(shù)據(jù)(Schema)的定義: 可以將其理解為數(shù)據(jù)庫(kù)的table定義,定義了資源的數(shù)據(jù)結(jié)構(gòu), 官方建議內(nèi)建資源對(duì)象的元數(shù)據(jù)定義固話(huà)在源代碼中.
- 資源對(duì)象的校驗(yàn)邏輯: 確保用戶(hù)提交的資源對(duì)象的屬性的合法性
- 資源對(duì)象的CRUD操作代碼: 可以將其裂解為數(shù)據(jù)庫(kù)表的CRUD代碼.
- 資源對(duì)象相關(guān)的自動(dòng)控制,比如deployment對(duì)象后的控制器. 這是很重要的一個(gè)功能, 用戶(hù)給出期望的資源對(duì)象聲明, 運(yùn)行過(guò)程中擇優(yōu)背后的"自動(dòng)控制器"負(fù)責(zé), 確保對(duì)應(yīng)的資源對(duì)象數(shù)量, 狀態(tài), 行為 都符合預(yù)期.
現(xiàn)在CRD 的1-3 步無(wú)序編程實(shí)現(xiàn),直接寫(xiě)yaml 即可, 第四部, 通過(guò)調(diào)用用 api server 的api 來(lái)實(shí)現(xiàn).
k8s proxy api 接口
proxy api 接口是指 api server 會(huì)把rest 請(qǐng)求轉(zhuǎn)發(fā)到其K8S 組件, 又其他組件(比如kubelet)來(lái)響應(yīng)的特殊接口.
比如node 相關(guān)的接口由kubelet響應(yīng)
/api/v1/proxy/nodes/{name}/pods # 獲取節(jié)點(diǎn)上所有pod
/api/v1/proxy/nodes/{name}/stats #獲取節(jié)點(diǎn)的物理資源統(tǒng)計(jì)
/api/v1/proxy/nodes/{name}/spec #獲取節(jié)點(diǎn)的概要信息
注意{name} 是節(jié)點(diǎn)的名稱(chēng)或者地址,這里獲取的數(shù)據(jù)都來(lái)自kubelet 而非 etcd,所以?xún)烧叩臄?shù)據(jù)有時(shí)候會(huì)有偏差, 如果kubelet 啟動(dòng)時(shí)包含了 --enable--debugging-handlers=true 參數(shù) 那么proxy api 還會(huì)增加以下接口
/api/v1/proxy/nodes/{name}/run # 獲取節(jié)點(diǎn)上運(yùn)行某個(gè)容器
/api/v1/proxy/nodes/{name}/exec # 獲取節(jié)點(diǎn)上的某個(gè)容器中運(yùn)行某調(diào)命令
/api/v1/proxy/nodes/{name}/attach # 在節(jié)點(diǎn)上attach某個(gè)容器
/api/v1/proxy/nodes/{name}/portForwad # 實(shí)現(xiàn)節(jié)點(diǎn)上的pod 端口轉(zhuǎn)發(fā)
/api/v1/proxy/nodes/{name}/log # 列出節(jié)點(diǎn)的個(gè)類(lèi)日志信息,例如tallylog lastlog wtmp ppp/ shsm/ audit/ tuned/ 和 annaconda 等
/api/v1/proxy/nodes/{name}/metrics # 獲取節(jié)點(diǎn)上相關(guān)的metrics信息
/api/v1/proxy/nodes/{name}/runningpods
/api/v1/proxy/nodes/{name}/debug/pprof # 列出當(dāng)前節(jié)點(diǎn)web服務(wù)狀態(tài)包括CPU 占用和內(nèi)存占用情ingkuang.
集群功能模塊之間的通信
原創(chuàng)不易如果文章對(duì)您有所幫助