K8S 核心組件 api server 介紹

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

以上命令在8001對(duì)外暴露 rest api, 對(duì)于/api/v1/replicationcontrollers 的API 不允許訪(fǎng)問(wèn)

  1. 方式2

也可以使用--accept-hosts 參數(shù)指定訪(fǎng)問(wèn)白名單

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

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

api server list watch 機(jī)制解析

image.png

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

  1. 資源對(duì)象的元數(shù)據(jù)(Schema)的定義: 可以將其理解為數(shù)據(jù)庫(kù)的table定義,定義了資源的數(shù)據(jù)結(jié)構(gòu), 官方建議內(nèi)建資源對(duì)象的元數(shù)據(jù)定義固話(huà)在源代碼中.
  2. 資源對(duì)象的校驗(yàn)邏輯: 確保用戶(hù)提交的資源對(duì)象的屬性的合法性
  3. 資源對(duì)象的CRUD操作代碼: 可以將其裂解為數(shù)據(jù)庫(kù)表的CRUD代碼.
  4. 資源對(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.

集群功能模塊之間的通信

image.png

原創(chuàng)不易如果文章對(duì)您有所幫助

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怎抛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子洞豁,更是在濱河造成了極大的恐慌挨约,老刑警劉巖莲蜘,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡查邢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)酵幕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扰藕,“玉大人,你說(shuō)我怎么就攤上這事芳撒〉松睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵笔刹,是天一觀(guān)的道長(zhǎng)芥备。 經(jīng)常有香客問(wèn)我,道長(zhǎng)舌菜,這世上最難降的妖魔是什么萌壳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上袱瓮,老公的妹妹穿的比我還像新娘缤骨。我一直安慰自己,他們只是感情好尺借,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布绊起。 她就那樣靜靜地躺著,像睡著了一般褐望。 火紅的嫁衣襯著肌膚如雪勒庄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天瘫里,我揣著相機(jī)與錄音实蔽,去河邊找鬼。 笑死谨读,一個(gè)胖子當(dāng)著我的面吹牛局装,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劳殖,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铐尚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哆姻?” 一聲冷哼從身側(cè)響起宣增,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矛缨,沒(méi)想到半個(gè)月后爹脾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箕昭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年灵妨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落竹。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泌霍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出述召,到底是詐尸還是另有隱情朱转,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布积暖,位于F島的核電站肋拔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏呀酸。R本人自食惡果不足惜凉蜂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窿吩,春花似錦茎杂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至轧邪,卻和暖如春刽脖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忌愚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工曲管, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硕糊。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓院水,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親简十。 傳聞我的和親對(duì)象是個(gè)殘疾皇子檬某,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容