來自公眾號(hào):51CTO技術(shù)棧
作者:崔皓
作者簡(jiǎn)介:十六年開發(fā)和架構(gòu)經(jīng)驗(yàn)痘煤,曾擔(dān)任過惠普武漢交付中心技術(shù)專家凑阶,需求分析師,項(xiàng)目經(jīng)理衷快,后在創(chuàng)業(yè)公司擔(dān)任技術(shù)/產(chǎn)品經(jīng)理宙橱。善于學(xué)習(xí),樂于分享蘸拔。目前專注于技術(shù)架構(gòu)與研發(fā)管理师郑。
互聯(lián)網(wǎng)技術(shù)飛速發(fā)展的今天,為了承載請(qǐng)求的高并發(fā)和業(yè)務(wù)的多樣性调窍,微服務(wù)的架構(gòu)成了各個(gè)公司的標(biāo)配呕乎。
每個(gè)微服務(wù)通過 Docker 進(jìn)行發(fā)布,隨著業(yè)務(wù)的發(fā)展陨晶,系統(tǒng)中遍布著各種各樣的容器。于是,容器的資源調(diào)度先誉,部署運(yùn)行湿刽,擴(kuò)容縮容就是我們要面臨的問題。
基于 Kubernetes 作為容器集群的管理平臺(tái)被廣泛應(yīng)用褐耳,今天我們一起來看看 Kubernetes 的架構(gòu)中有那些常用的組件以及運(yùn)行原理诈闺。
Kubernetes 架構(gòu)概述
Kubernetes 是用來管理容器集群的平臺(tái)。既然是管理集群铃芦,那么就存在被管理節(jié)點(diǎn)雅镊,針對(duì)每個(gè) Kubernetes 集群都由一個(gè) Master 負(fù)責(zé)管理和控制集群節(jié)點(diǎn)。
我們通過 Master 對(duì)每個(gè)節(jié)點(diǎn) Node 發(fā)送命令刃滓。簡(jiǎn)單來說仁烹,Master 就是管理者,Node 就是被管理者咧虎。
Node 可以是一臺(tái)機(jī)器或者一臺(tái)虛擬機(jī)卓缰。在 Node 上面可以運(yùn)行多個(gè) Pod,Pod 是 Kubernetes 管理的最小單位砰诵,同時(shí)每個(gè) Pod 可以包含多個(gè)容器(Docker)征唬。
通過下面的 Kubernetes 架構(gòu)簡(jiǎn)圖可以看到 Master 和 Node 之間的關(guān)系:通常我們都是通過 kubectl 對(duì) Kubernetes 下命令的,它通過 APIServer 去調(diào)用各個(gè)進(jìn)程來完成對(duì) Node 的部署和控制茁彭。
APIServer 的核心功能是對(duì)核心對(duì)象(例如:Pod总寒,Service,RC)的增刪改查操作理肺,同時(shí)也是集群內(nèi)模塊之間數(shù)據(jù)交換的樞紐摄闸。
它包括了常用的 API,訪問(權(quán)限)控制哲嘲,注冊(cè)贪薪,信息存儲(chǔ)(etcd)等功能。在它的下面我們可以看到 Scheduler眠副,它將待調(diào)度的 Pod 綁定到 Node 上画切,并將綁定信息寫入 etcd 中。
etcd 包含在 APIServer 中囱怕,用來存儲(chǔ)資源信息霍弹。接下來就是 Controller Manager 了,如果說 Kubernetes 是一個(gè)自動(dòng)化運(yùn)行的系統(tǒng)娃弓,那么就需要有一套管理規(guī)則來控制這套系統(tǒng)典格。
Controller Manager 就是這個(gè)管理者,或者說是控制者台丛。它包括 8 個(gè) Controller耍缴,分別對(duì)應(yīng)著副本砾肺,節(jié)點(diǎn),資源防嗡,命名空間变汪,服務(wù)等等。
緊接著蚁趁,Scheduler 會(huì)把 Pod 調(diào)度到 Node 上裙盾,調(diào)度完以后就由 kubelet 來管理 Node 了。
kubelet 用于處理 Master 下發(fā)到 Node 的任務(wù)(即 Scheduler 的調(diào)度任務(wù))他嫡,同時(shí)管理 Pod 及 Pod 中的容器番官。
在完成資源調(diào)度以后,kubelet 進(jìn)程也會(huì)在 APIServer 上注冊(cè) Node 信息钢属,定期向 Master 匯報(bào) Node 信息徘熔,并通過 cAdvisor 監(jiān)控容器和節(jié)點(diǎn)資源。
由于署咽,微服務(wù)的部署都是分布式的近顷,所以對(duì)應(yīng)的 Pod 以及容器的部署也是。為了能夠方便地找到這些 Pod 或者容器宁否,引入了 Service(kube-proxy)進(jìn)程窒升,它來負(fù)責(zé)反向代理和負(fù)載均衡的實(shí)施。
上面就是 Kubernetes 架構(gòu)的簡(jiǎn)易說明慕匠,涉及到了一些核心概念以及簡(jiǎn)單的信息流動(dòng)饱须。
將一些功能收錄到了 APIServer 中,這個(gè)簡(jiǎn)圖比官網(wǎng)的圖顯得簡(jiǎn)單一些台谊,主要是方便大家記憶蓉媳。
后面我們會(huì)用一個(gè)簡(jiǎn)單的例子,帶大家把 Kubernetes 的概念的由來做深入的了解锅铅。
從一個(gè)例子開始
假設(shè)使用 Kubernetes 部署 Tomcat 和 MySQL 服務(wù)到兩個(gè) Node 上面酪呻。其中 Tomcat 服務(wù)生成兩個(gè)實(shí)例也就是生成兩個(gè) Pod,用來對(duì)其做水平擴(kuò)展盐须。
MySQL 只部署一個(gè)實(shí)例玩荠,也就是一個(gè) Pod≡舻耍可以通過外網(wǎng)訪問 Tomcat阶冈,而 Tomcat 可以在內(nèi)網(wǎng)訪問 MySQL。這里我們假設(shè) Kubernetes 和 Docker 的安裝都已經(jīng)完成塑径,并且鏡像文件都已經(jīng)準(zhǔn)備好了女坑。重點(diǎn)看 Kubernetes 如何部署和管理容器。
kubectl 和 APIServer
既然我們要完成上面的例子统舀,接下來就要部署兩個(gè)應(yīng)用匆骗。
首先劳景,根據(jù)要部署的應(yīng)用建立 Replication Controller(RC)。RC 是用來聲明應(yīng)用副本的個(gè)數(shù)碉就,也就是 Pod 的個(gè)數(shù)枢泰。
按照上面的例子,Tomcat 的 RC 就是 2铝噩,MySQL 的 RC 就是 1。
由于 kubectl 作為用戶接口向 Kubernetes 下發(fā)指令窿克,那么指令是通過“.yaml”的配置文件編寫的骏庸。
定義 mysql-rc.yaml 的配置文件來描述 MySQL 的 RC:
apiVersion: V1
kind: ReplicationController
metadata:
name: mysql#RC的名稱,全局唯一
spec:
replicas:1 #Pod 副本的期待數(shù)量
selector :
app: mysql
template: #Pod模版年叮,用這個(gè)模版來創(chuàng)建Pod
metadata:
labels:
app:mysql#Pod副本的標(biāo)簽
spec:
containers:#容器定義部分
-name:mysql
Image:mysql#容器對(duì)應(yīng)的DockerImage
Ports:
-containerPort:3306#容器應(yīng)用監(jiān)聽的端口號(hào)
Env:#注入容器的環(huán)境變量
-name:MYSQL_ROOT_PASSWORD
Value:”123456”
從上面的配置文件可以看出具被,需要對(duì)這個(gè) RC 定義一個(gè)名字,以及期望的副本數(shù)只损,以及容器中的鏡像文件一姿。然后通過 kubectl 作為客戶端的 cli 工具,執(zhí)行這個(gè)配置文件跃惫。執(zhí)行了上面的命令以后叮叹,Kubernetes 會(huì)幫助我們部署副本 MySQL 的 Pod 到 Node。
此時(shí)先不著急看結(jié)果爆存,回到最開始的架構(gòu)圖蛉顽,可以看到 kubectl 會(huì)向 Master 中的 APIServer 發(fā)起命令,看看 APIServer 的結(jié)構(gòu)和信息的傳遞吧先较。Kubernetes API Server 通過一個(gè)名為 kube-apiserver 的進(jìn)程提供服務(wù)携冤,該進(jìn)程運(yùn)行在 Master 上。
可以通過 Master 的 8080 端口訪問 kube-apiserver 進(jìn)程闲勺,它提供 REST 服務(wù)曾棕。
因此可以通過命令行工具 kubectl 來與 Kubernetes APIServer 交互,它們之間的接口是 RESTful API菜循。
APIServer 的架構(gòu)從上到下分為四層:
API 層:主要以 REST 方式提供各種 API 接口翘地,針對(duì) Kubernetes 資源對(duì)象的 CRUD 和 Watch 等主要 API,還有健康檢查债朵、UI子眶、日志、性能指標(biāo)等運(yùn)維監(jiān)控相關(guān)的 API序芦。
訪問控制層:負(fù)責(zé)身份鑒權(quán)臭杰,核準(zhǔn)用戶對(duì)資源的訪問權(quán)限,設(shè)置訪問邏輯(Admission Control)谚中。
注冊(cè)表層:選擇要訪問的資源對(duì)象渴杆。PS:Kubernetes 把所有資源對(duì)象都保存在注冊(cè)表(Registry)中寥枝,例如:Pod,Service磁奖,Deployment 等等囊拜。
etcd 數(shù)據(jù)庫(kù):保存創(chuàng)建副本的信息。用來持久化 Kubernetes 資源對(duì)象的 Key-Value 數(shù)據(jù)庫(kù)比搭。
當(dāng) kubectl 用 Create 命令建立 Pod 時(shí)冠跷,是通過 APIServer 中的 API 層調(diào)用對(duì)應(yīng)的 RESTAPI 方法。
之后會(huì)進(jìn)入權(quán)限控制層身诺,通過 Authentication 獲取調(diào)用者身份蜜托,Authorization 獲取權(quán)限信息。
AdmissionControl 中可配置權(quán)限認(rèn)證插件霉赡,通過插件來檢查請(qǐng)求約束橄务。例如:?jiǎn)?dòng)容器之前需要下載鏡像,或者檢查具備某命名空間的資源穴亏。
還記得 mysql-rc.yaml 中配置需要生成的 Pod 的個(gè)數(shù)為 1蜂挪。到了 Registry 層會(huì)從 CoreRegistry 資源中取出 1 個(gè) Pod 作為要?jiǎng)?chuàng)建的 Kubernetes 資源對(duì)象。
然后將 Node嗓化,Pod 和 Container 信息保存在 etcd 中去棠涮。這里的 etcd 可以是一個(gè)集群,由于里面保存集群中各個(gè) Node/Pod/Container 的信息蟆湖,所以必要時(shí)需要備份故爵,或者保證其可靠性。
Controller Manager隅津,Scheduler 和 kubelet
前面通過 kubectl 根據(jù)配置文件诬垂,向 APIServer 發(fā)送命令,在 Node 上面建立 Pod 和 Container伦仍。
在 APIServer结窘,經(jīng)過 API 調(diào)用,權(quán)限控制充蓝,調(diào)用資源和存儲(chǔ)資源的過程隧枫。實(shí)際上還沒有真正開始部署應(yīng)用。
這里需要 Controller Manager谓苟,Scheduler 和 kubelet 的協(xié)助才能完成整個(gè)部署過程官脓。
在介紹他們協(xié)同工作之前,要介紹一下在 Kubernetes 中的監(jiān)聽接口涝焙。從上面的操作知道卑笨,所有部署的信息都會(huì)寫到 etcd 中保存。
實(shí)際上 etcd 在存儲(chǔ)部署信息的時(shí)候仑撞,會(huì)發(fā)送 Create 事件給 APIServer赤兴,而 APIServer 會(huì)通過監(jiān)聽(Watch)etcd 發(fā)過來的事件妖滔。其他組件也會(huì)監(jiān)聽(Watch)APIServer 發(fā)出來的事件。Kubernetes 就是用這種 List-Watch 的機(jī)制保持?jǐn)?shù)據(jù)同步的桶良,如上圖:
這里有三個(gè) List-Watch座舍,分別是 kube-controller-manager(運(yùn)行在Master),kube-scheduler(運(yùn)行在 Master)陨帆,kublete(運(yùn)行在 Node)曲秉。他們?cè)谶M(jìn)程已啟動(dòng)就會(huì)監(jiān)聽(Watch)APIServer 發(fā)出來的事件。
kubectl 通過命令行疲牵,在 APIServer 上建立一個(gè) Pod 副本岸浑。
這個(gè)部署請(qǐng)求被記錄到 etcd 中,存儲(chǔ)起來瑰步。
當(dāng) etcd 接受創(chuàng)建 Pod 信息以后,會(huì)發(fā)送一個(gè) Create 事件給 APIServer璧眠。
由于 Kubecontrollermanager 一直在監(jiān)聽 APIServer 中的事件缩焦。此時(shí) APIServer 接受到了 Create 事件,又會(huì)發(fā)送給 Kubecontrollermanager责静。
-
Kubecontrollermanager 在接到 Create 事件以后袁滥,調(diào)用其中的 Replication Controller 來保證 Node 上面需要?jiǎng)?chuàng)建的副本數(shù)量。
上面的例子 MySQL 應(yīng)用是 1 個(gè)副本灾螃,Tomcat 應(yīng)用是兩個(gè)副本题翻。一旦副本數(shù)量少于 RC 中定義的數(shù)量,Replication Controller 會(huì)自動(dòng)創(chuàng)建副本腰鬼∏对總之它是保證副本數(shù)量的 Controller。PS:擴(kuò)容縮容的擔(dān)當(dāng)熄赡。
在 Controller Manager 創(chuàng)建 Pod 副本以后姜挺,APIServer 會(huì)在 etcd 中記錄這個(gè) Pod 的詳細(xì)信息。例如在 Pod 的副本數(shù)彼硫,Container 的內(nèi)容是什么炊豪。
同樣的 etcd 會(huì)將創(chuàng)建 Pod 的信息通過事件發(fā)送給 APIServer。
-
由于 Scheduler 在監(jiān)聽(Watch)APIServer拧篮,并且它在系統(tǒng)中起到了“承上啟下”的作用词渤,“承上”是指它負(fù)責(zé)接收創(chuàng)建的 Pod 事件,為其安排 Node串绩;“啟下”是指安置工作完成后缺虐,Node 上的 kubelet 服務(wù)進(jìn)程接管后繼工作,負(fù)責(zé) Pod 生命周期中的“下半生”赏参。
換句話說志笼,Scheduler 的作用是將待調(diào)度的 Pod 按照調(diào)度算法和策略綁定到集群中 Node 上沿盅,并將綁定信息寫入 etcd 中。
Scheduler 調(diào)度完畢以后會(huì)更新 Pod 的信息纫溃,此時(shí)的信息更加豐富了腰涧。除了知道 Pod 的副本數(shù)量,副本內(nèi)容紊浩。還知道部署到哪個(gè) Node 上面了窖铡。
同樣,將上面的 Pod 信息更新到 etcd 中坊谁,保存起來费彼。
etcd 將更新成功的事件發(fā)送給 APIServer。
-
注意這里的 kubelet 是在 Node 上面運(yùn)行的進(jìn)程口芍,它也通過 List-Watch 的方式監(jiān)聽(Watch)APIServer 發(fā)送的 Pod 更新的事件箍铲。實(shí)際上,在第 9 步的時(shí)候創(chuàng)建 Pod 的工作就已經(jīng)完成了鬓椭。
為什么 kubelete 還要一直監(jiān)聽呢颠猴?原因很簡(jiǎn)單,假設(shè)這個(gè)時(shí)候 kubectl 發(fā)命令小染,需要把原來的 MySQL 的 1 個(gè) RC 副本擴(kuò)充成 2 個(gè)翘瓮。那么這個(gè)流程又會(huì)觸發(fā)一遍。
作為 Node 的管理者 kubelet 也會(huì)根據(jù)最新的 Pod 的部署情況調(diào)整 Node 端的資源裤翩。
又或者 MySQL 應(yīng)用的 RC 個(gè)數(shù)沒有發(fā)生變化资盅,但是其中的鏡像文件升級(jí)了,kubelet 也會(huì)自動(dòng)獲取最新的鏡像文件并且加載踊赠。
Controller Manager
Kubernetes 需要管理集群中的不同資源烫堤,所以針對(duì)不同的資源要建立不同的 Controller荣赶。
每個(gè) Controller 通過監(jiān)聽機(jī)制獲取 APIServer 中的事件(消息),它們通過 API Server 提供的(List-Watch)接口監(jiān)控集群中的資源鸽斟,并且調(diào)整資源的狀態(tài)拔创。
可以把它想象成一個(gè)盡職的管理者,隨時(shí)管理和調(diào)整資源富蓄。比如 MySQL 所在的 Node 意外宕機(jī)了剩燥,Controller Manager 中的 Node Controller 會(huì)及時(shí)發(fā)現(xiàn)故障,并執(zhí)行修復(fù)流程。
在部署了成百上千微服務(wù)的系統(tǒng)中灭红,這個(gè)功能極大地協(xié)助了運(yùn)維人員侣滩。從此可以看出,Controller Manager 是 Kubernetes 資源的管理者变擒,是運(yùn)維自動(dòng)化的核心君珠。
它分為 8 個(gè) Controller,上面我們介紹了 Replication Controller娇斑,這里我們把其他幾個(gè)都列出來策添,就不展開描述了。
Scheduler 與 kubelet
Scheduler 的作用是毫缆,將待調(diào)度的 Pod 按照算法和策略綁定到 Node 上唯竹,同時(shí)將信息保存在 etcd 中。
如果把 Scheduler 比作調(diào)度室苦丁,那么這三件事就是它需要關(guān)注的浸颓,待調(diào)度的 Pod、可用的 Node旺拉,調(diào)度算法和策略猾愿。
簡(jiǎn)單地說,就是通過調(diào)度算法/策略把 Pod 放到合適的 Node 中去账阻。此時(shí) Node 上的 kubelet 通過 APIServer 監(jiān)聽到 Scheduler 產(chǎn)生的 Pod 綁定事件,然后通過 Pod 的描述裝載鏡像文件泽本,并且啟動(dòng)容器淘太。
也就是說 Scheduler 負(fù)責(zé)思考,Pod 放在哪個(gè) Node规丽,然后將決策告訴 kubelet蒲牧,kubelet 完成 Pod 在 Node 的加載工作。
說白了赌莺,Scheduler 是 boss冰抢,kubelet 是干活的工人,他們都通過 APIServer 進(jìn)行信息交換艘狭。
Service 和 kubelet
經(jīng)歷上面一系列的過程挎扰,終于將 Pod 和容器部署到 Node 上了。
作為部署在 Kubernetes 中巢音,Pod 如何訪問其他的 Pod 呢遵倦?答案是通過 Kubernetes 的 Service 機(jī)制。
在 Kubernetes 中的 Service 定義了一個(gè)服務(wù)的訪問入口地址(IP+Port)官撼。Pod 中的應(yīng)用通過這個(gè)地址訪問一個(gè)或者一組 Pod 副本梧躺。
Service 與后端 Pod 副本集群之間是通過 Label Selector 來實(shí)現(xiàn)連接的。Service 所訪問的這一組 Pod 都會(huì)有同樣的 Label傲绣,通過這樣的方法知道這些 Pod 屬于同一個(gè)組掠哥。
寫 MySQL 服務(wù)的配置文件(mysql-svc.yaml)如下:
apiVersion : v1
kind: Service #說明創(chuàng)建資源對(duì)象的類型是Service
metadata:
name: mysql#Service全局唯一名稱
spec:
prots:
-port: 3306#Service的服務(wù)端口號(hào)
selector:#Service對(duì)應(yīng)的Pod標(biāo)簽巩踏,用來給Pod分類
app: mysql
按照慣例運(yùn)行 kubectl,創(chuàng)建 Service:
再用 getsvc 命令檢查 Service 信息:
這里的 Cluster-IP 169.169.253.143 是由 Kubernetes 自動(dòng)分配的续搀。當(dāng)一個(gè) Pod 需要訪問其他的 Pod 的時(shí)候就需要通過 Service 的 Cluster-IP 和 Port塞琼。
也就是說 Cluster-IP 和 Port 是 Kubernetes 集群的內(nèi)部地址,是提供給集群內(nèi)的 Pod 之間訪問使用的目代,外部系統(tǒng)是無法通過這個(gè) Cluster-IP 來訪問 Kubernetes 中的應(yīng)用的屈梁。
上面提到的 Service 只是一個(gè)概念,而真正將 Service 落實(shí)的是 kube-proxy榛了。
只有理解了 kube-proxy 的原理和機(jī)制在讶,我們才能真正理解 Service 背后的實(shí)現(xiàn)邏輯。
在 Kubernetes 集群的每個(gè) Node 上都會(huì)運(yùn)行一個(gè) kube-proxy 服務(wù)進(jìn)程霜大,我們可以把這個(gè)進(jìn)程看作 Service 的負(fù)載均衡器构哺,其核心功能是將到 Service 的請(qǐng)求轉(zhuǎn)發(fā)到后端的多個(gè) Pod 上。
此外战坤,Service 的 Cluster-IP 與 NodePort 是 kube-proxy 服務(wù)通過 iptables 的 NAT 轉(zhuǎn)換實(shí)現(xiàn)的曙强。kube-proxy 在運(yùn)行過程中動(dòng)態(tài)創(chuàng)建與 Service 相關(guān)的 iptables 規(guī)則。
由于 iptables 機(jī)制針對(duì)的是本地的 kube-proxy 端口途茫,所以在每個(gè) Node 上都要運(yùn)行 kube-proxy 組件碟嘴。
因此在 Kubernetes 集群內(nèi)部,可以在任意 Node 上發(fā)起對(duì) Service 的訪問請(qǐng)求囊卜。
正如 MySQL 服務(wù)娜扇,可以被 Kubernetes 內(nèi)部的 Tomcat 調(diào)用,那么 Tomcat 如何被 Kubernetes 外部調(diào)用栅组?
先生成配置文件雀瓢,myweb-rc.yaml 看看:
apiVersion: V1
kind: ReplicationController
metadata:
name: myweb#RC的名稱,全局唯一
spec:
replicas:2#Pod 副本的期待數(shù)量玉掸,這里的數(shù)量是2刃麸,需要建立兩個(gè)Tomcat的副本
selector :
app: myweb
template: #Pod模版,用這個(gè)模版來創(chuàng)建Pod
metadata:
labels:
app:myweb#Pod副本的標(biāo)簽
spec:
containers: #容器定義部分
-name:mysql
Image:kubeguide/tomcat-app:v1#容器對(duì)應(yīng)的DockerImage
Ports:
-containerPort:8080#容器應(yīng)用監(jiān)聽的端口號(hào)
在 kubectl 中使用 Create 建立 myweb 副本司浪。
副本創(chuàng)建完畢以后泊业,創(chuàng)建對(duì)應(yīng)的服務(wù)配置文件 myweb-svc.yaml。
apiVersion : v1
kind: Service #說明創(chuàng)建資源對(duì)象的類型是Service
metadata:
name: myweb#Service全局唯一名稱
spec:
prots:
-port: 8080#Service的服務(wù)端口號(hào)
nodePort: 30001#這個(gè)就是外網(wǎng)訪問Kubernetes內(nèi)部應(yīng)用的端口啊易。
selector: #Service對(duì)應(yīng)的Pod標(biāo)簽脱吱,用來給Pod分類
app: myweb
同樣在 kubectl 中運(yùn)行 Create 命令,建立 Service 資源认罩。
從上面的配置文件可以看出箱蝠,Tomcat 的 Service 中多了一個(gè) nodePort 的配置,值為 30001。
也就是說外網(wǎng)通過 30001 這個(gè)端口加上 NodeIP 就可以訪問 Tomcat 了宦搬。
運(yùn)行命令之后牙瓢,得到一個(gè)提示,大致意思是“如果你要將服務(wù)暴露給外網(wǎng)使用间校,你需要設(shè)置防火墻規(guī)則讓 30001 端口能夠通行矾克。”
由于 Cluster-IP 是一個(gè)虛擬的 IP憔足,僅供 Kubernetes 內(nèi)部的 Pod 之間的通信胁附。
Node 作為一個(gè)物理節(jié)點(diǎn),因此需要使用 Node-IP 和 nodePort 的組合來從 Kubernetes 外面訪問內(nèi)部的應(yīng)用滓彰。
如果按照上面的配置控妻,部署了兩個(gè) Tomcat 應(yīng)用,當(dāng)外網(wǎng)訪問時(shí)選擇那個(gè) Pod 呢揭绑?這里需要通過 Kubernetes 之外的負(fù)載均衡器來實(shí)現(xiàn)的弓候。
可以通過 Kubernetes 的 LoadBlancerService 組件來協(xié)助實(shí)現(xiàn)。通過云平臺(tái)申請(qǐng)創(chuàng)建負(fù)載均衡器他匪,向外暴露服務(wù)菇存。
目前 LoadBlancerService 組件支持的云平臺(tái)比較完善,比如國(guó)外的 GCE邦蜜、DigitalOcean依鸥,國(guó)內(nèi)的阿里云,私有云 OpenStack 等等悼沈。
從用法上只要把 Service 的 type=NodePort 改為 type=LoadBalancer贱迟,Kubernetes 就會(huì)自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)的 Load Balancer 實(shí)例并返回它的 IP 地址供外部客戶端使用。
至此井辆,MySQL(RC 1)和 Tomcat(RC 2)已經(jīng)在 Kubernetes 部署了。并在 Kubernetes 內(nèi)部 Pod 之間是可以互相訪問的溶握,在外網(wǎng)也可以訪問到 Kubernetes 內(nèi)部的 Pod杯缺。
另外睡榆,作為資源監(jiān)控 Kubernetes 在每個(gè) Node 和容器上都運(yùn)行了 cAdvisor萍肆。它是用來分析資源使用率和性能的工具,支持 Docker 容器胀屿。
kubelet 通過 cAdvisor 獲取其所在 Node 及容器(Docker)的數(shù)據(jù)塘揣。cAdvisor 自動(dòng)采集 CPU、內(nèi)存宿崭、文件系統(tǒng)和網(wǎng)絡(luò)使用的統(tǒng)計(jì)信息亲铡。
kubelet 作為 Node 的管理者,把 cAdvisor 采集上來的數(shù)據(jù)通過 RESTAPI 的形式暴露給 Kubernetes 的其他資源,讓他們知道 Node/Pod 中的資源使用情況奖蔓。
總結(jié)
由于微服務(wù)的迅猛發(fā)展赞草,Kubernetes 作為微服務(wù)治理平臺(tái)被廣泛應(yīng)用。由于其發(fā)展時(shí)間長(zhǎng)吆鹤,包含服務(wù)功能多我們無法一一列出厨疙。
因此,從一個(gè)簡(jiǎn)單的創(chuàng)建應(yīng)用副本的例子入手疑务,介紹了各個(gè)重要組件的概念和基本原理。
Kubernetes 是用來管理容器集群的,Master 作為管理者冶匹,包括 APIServer椰弊,Scheduler,Controller Manager廊镜。
Node作為副本部署的載體牙肝,包含多個(gè) Pod,每個(gè) Pod 又包含多個(gè)容器(container)嗤朴。用戶通過 kubectl 給 Master 中的 APIServer 下部署命令配椭。
命令主體是以“.yaml”結(jié)尾的配置文件,包含副本的類型雹姊,副本個(gè)數(shù)股缸,名稱,端口吱雏,模版等信息敦姻。
APIServer 接受到請(qǐng)求以后,會(huì)分別進(jìn)行以下操作:權(quán)限驗(yàn)證(包括特殊控制)歧杏,取出需要?jiǎng)?chuàng)建的資源镰惦,保存副本信息到etcd。
APIServer 和 Controller Manager犬绒,Scheduler 以及 kubelete 之間通過 List-Watch 方式通信(事件發(fā)送與監(jiān)聽)旺入。
Controller Manager 通過 etcd 獲取需要?jiǎng)?chuàng)建資源的副本數(shù),交由 Scheduler 進(jìn)行策略分析凯力。
最后 kubelet 負(fù)責(zé)最終的 Pod 創(chuàng)建和容器加載茵瘾。部署好容器以后,通過 Service 進(jìn)行訪問咐鹤,通過 cAdvisor 監(jiān)控資源拗秘。