溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes核心原理中的API Server是怎么樣的

發(fā)布時間:2021-12-03 17:07:36 來源:億速云 閱讀:99 作者:柒染 欄目:云計(jì)算

這篇文章給大家介紹Kubernetes核心原理中的API Server是怎么樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1. API Server簡介

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

kubernetes API Server的功能:

  1. 提供了集群管理的REST API接口(包括認(rèn)證授權(quán)、數(shù)據(jù)校驗(yàn)以及集群狀態(tài)變更);

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

  3. 是資源配額控制的入口;

  4. 擁有完備的集群安全機(jī)制.

kube-apiserver工作原理圖

Kubernetes核心原理中的API Server是怎么樣的

2. 如何訪問kubernetes API

k8s通過kube-apiserver這個進(jìn)程提供服務(wù),該進(jìn)程運(yùn)行在單個k8s-master節(jié)點(diǎn)上。默認(rèn)有兩個端口。

2.1. 本地端口

  1. 該端口用于接收HTTP請求;

  2. 該端口默認(rèn)值為8080,可以通過API Server的啟動參數(shù)“--insecure-port”的值來修改默認(rèn)值;

  3. 默認(rèn)的IP地址為“l(fā)ocalhost”,可以通過啟動參數(shù)“--insecure-bind-address”的值來修改該IP地址;

  4. 非認(rèn)證或授權(quán)的HTTP請求通過該端口訪問API Server。

2.2. 安全端口

  1. 該端口默認(rèn)值為6443,可通過啟動參數(shù)“--secure-port”的值來修改默認(rèn)值;

  2. 默認(rèn)IP地址為非本地(Non-Localhost)網(wǎng)絡(luò)端口,通過啟動參數(shù)“--bind-address”設(shè)置該值;

  3. 該端口用于接收HTTPS請求;

  4. 用于基于Tocken文件或客戶端證書及HTTP Base的認(rèn)證;

  5. 用于基于策略的授權(quán);

  6. 默認(rèn)不啟動HTTPS安全訪問控制。

2.3. 訪問方式

Kubernetes REST API可參考https://kubernetes.io/docs/api-reference/v1.6/

2.3.1. curl

curl localhost:8080/api

curl localhost:8080/api/v1/pods

curl localhost:8080/api/v1/services

curl localhost:8080/api/v1/replicationcontrollers

2.3.2. Kubectl Proxy

Kubectl Proxy代理程序既能作為API Server的反向代理,也能作為普通客戶端訪問API Server的代理。通過master節(jié)點(diǎn)的8080端口來啟動該代理程序。

kubectl proxy --port=8080 &

具體見kubectl proxy --help

2.3.3. kubectl客戶端

命令行工具kubectl客戶端,通過命令行參數(shù)轉(zhuǎn)換為對API Server的REST API調(diào)用,并將調(diào)用結(jié)果輸出。

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

具體可參考Kubernetes常用命令

2.3.4. 編程方式調(diào)用

使用場景:

1、運(yùn)行在Pod里的用戶進(jìn)程調(diào)用kubernetes API,通常用來實(shí)現(xiàn)分布式集群搭建的目標(biāo)。

2、開發(fā)基于kubernetes的管理平臺,比如調(diào)用kubernetes API來完成Pod、Service、RC等資源對象的圖形化創(chuàng)建和管理界面。可以使用kubernetes提供的Client Library。

具體可參考https://github.com/kubernetes/client-go。

3. 通過API Server訪問Node、Pod和Service

k8s API Server最主要的REST接口是資源對象的增刪改查,另外還有一類特殊的REST接口—k8s Proxy API接口,這類接口的作用是代理REST請求,即kubernetes API Server把收到的REST請求轉(zhuǎn)發(fā)到某個Node上的kubelet守護(hù)進(jìn)程的REST端口上,由該kubelet進(jìn)程負(fù)責(zé)響應(yīng)。

3.1. Node相關(guān)接口

關(guān)于Node相關(guān)的接口的REST路徑為:/api/v1/proxy/nodes/{name},其中{name}為節(jié)點(diǎn)的名稱或IP地址。

/api/v1/proxy/nodes/{name}/pods/    #列出指定節(jié)點(diǎn)內(nèi)所有Pod的信息

/api/v1/proxy/nodes/{name}/stats/   #列出指定節(jié)點(diǎn)內(nèi)物理資源的統(tǒng)計(jì)信息

/api/v1/prxoy/nodes/{name}/spec/    #列出指定節(jié)點(diǎn)的概要信息

這里獲取的Pod信息來自Node而非etcd數(shù)據(jù)庫,兩者時間點(diǎn)可能存在偏差。如果在kubelet進(jìn)程啟動時加--enable-debugging-handles=true參數(shù),那么kubernetes Proxy API還會增加以下接口:

/api/v1/proxy/nodes/{name}/run      #在節(jié)點(diǎn)上運(yùn)行某個容器

/api/v1/proxy/nodes/{name}/exec     #在節(jié)點(diǎn)上的某個容器中運(yùn)行某條命令

/api/v1/proxy/nodes/{name}/attach   #在節(jié)點(diǎn)上attach某個容器

/api/v1/proxy/nodes/{name}/portForward   #實(shí)現(xiàn)節(jié)點(diǎn)上的Pod端口轉(zhuǎn)發(fā)

/api/v1/proxy/nodes/{name}/logs     #列出節(jié)點(diǎn)的各類日志信息

/api/v1/proxy/nodes/{name}/metrics  #列出和該節(jié)點(diǎn)相關(guān)的Metrics信息

/api/v1/proxy/nodes/{name}/runningpods  #列出節(jié)點(diǎn)內(nèi)運(yùn)行中的Pod信息

/api/v1/proxy/nodes/{name}/debug/pprof  #列出節(jié)點(diǎn)內(nèi)當(dāng)前web服務(wù)的狀態(tài),包括CPU和內(nèi)存的使用情況

3.2. Pod相關(guān)接口

/api/v1/proxy/namespaces/{namespace}/pods/{name}/{path:*}      #訪問pod的某個服務(wù)接口

/api/v1/proxy/namespaces/{namespace}/pods/{name}               #訪問Pod

#以下寫法不同,功能一樣

/api/v1/namespaces/{namespace}/pods/{name}/proxy/{path:*}      #訪問pod的某個服務(wù)接口

/api/v1/namespaces/{namespace}/pods/{name}/proxy               #訪問Pod

3.3. Service相關(guān)接口

/api/v1/proxy/namespaces/{namespace}/services/{name}

Pod的proxy接口的作用:在kubernetes集群之外訪問某個pod容器的服務(wù)(HTTP服務(wù)),可以用Proxy API實(shí)現(xiàn),這種場景多用于管理目的,比如逐一排查Service的Pod副本,檢查哪些Pod的服務(wù)存在異常問題。

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

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

4.1. kubelet與API Server交互

每個Node節(jié)點(diǎn)上的kubelet定期就會調(diào)用API Server的REST接口報(bào)告自身狀態(tài),API Server接收這些信息后,將節(jié)點(diǎn)狀態(tài)信息更新到etcd中。kubelet也通過API Server的Watch接口監(jiān)聽Pod信息,從而對Node機(jī)器上的POD進(jìn)行管理。

監(jiān)聽信息

kubelet動作

備注

新的POD副本被調(diào)度綁定到本節(jié)點(diǎn)執(zhí)行POD對應(yīng)的容器的創(chuàng)建和啟動邏輯 
POD對象被刪除刪除本節(jié)點(diǎn)上相應(yīng)的POD容器 
修改POD信息修改本節(jié)點(diǎn)的POD容器 

4.2. kube-controller-manager與API Server交互

kube-controller-manager中的Node Controller模塊通過API Server提供的Watch接口,實(shí)時監(jiān)控Node的信息,并做相應(yīng)處理。

4.3. kube-scheduler與API Server交互

Scheduler通過API Server的Watch接口監(jiān)聽到新建Pod副本的信息后,它會檢索所有符合該P(yáng)od要求的Node列表,開始執(zhí)行Pod調(diào)度邏輯。調(diào)度成功后將Pod綁定到目標(biāo)節(jié)點(diǎn)上。

4.4. 特別說明

為了緩解各模塊對API Server的訪問壓力,各功能模塊都采用緩存機(jī)制來緩存數(shù)據(jù),各功能模塊定時從API Server獲取指定的資源對象信息(LIST/WATCH方法),然后將信息保存到本地緩存,功能模塊在某些情況下不直接訪問API Server,而是通過訪問緩存數(shù)據(jù)來間接訪問API Server。

關(guān)于Kubernetes核心原理中的API Server是怎么樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI