我花了10個(gè)小時(shí),寫出了這篇K8S架構(gòu)解析

來自公眾號(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)系:
Kubernetes 架構(gòu)簡(jiǎ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è)配置文件跃惫。
通過 kubectl 執(zhí)行 RC 配置文件

執(zhí)行了上面的命令以后叮叹,Kubernetes 會(huì)幫助我們部署副本 MySQL 的 Pod 到 Node。

此時(shí)先不著急看結(jié)果爆存,回到最開始的架構(gòu)圖蛉顽,可以看到 kubectl 會(huì)向 Master 中的 APIServer 發(fā)起命令,看看 APIServer 的結(jié)構(gòu)和信息的傳遞吧先较。
image

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ù)比搭。

APIServer 分層架構(gòu)圖

當(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ā)出來的事件。
image

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)獲取最新的鏡像文件并且加載踊赠。

通過上面 List-Watch 的介紹大家發(fā)現(xiàn)了呵扛,除了之前引入的 kubectl 和 APIServer 以外又引入了 Controller Manager,Scheduler 和 kubelet筐带。這里給大家介紹一下他們的作用和原理:
聚焦 Scheduler择份,Controller Manager,kubelet

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è)都列出來策添,就不展開描述了。

Controller Manager 中不同的 Controller 負(fù)責(zé)對(duì)不同資源的監(jiān)控和管理

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)行信息交換艘狭。

Scheduler 與 kubelet 協(xié)同工作圖

Service 和 kubelet

經(jīng)歷上面一系列的過程挎扰,終于將 Pod 和容器部署到 Node 上了。

MySQL 部署成功

作為部署在 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è)組掠哥。

Pod 通過 Service 訪問其他 Pod

寫 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:

image

再用 getsvc 命令檢查 Service 信息:

image

這里的 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)求囊卜。

集群內(nèi)部通過 kube-proxy(Service)訪問其他 Pod

正如 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 副本司浪。

image

副本創(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 資源认罩。

image

從上面的配置文件可以看出箱蝠,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 之外的負(fù)載均衡器

可以通過 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杯缺。

Pod 在 Kubernetes 內(nèi)互相訪問,外網(wǎng)訪問 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)控資源拗秘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祈惶,隨后出現(xiàn)的幾起案子雕旨,更是在濱河造成了極大的恐慌扮匠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奸腺,死亡現(xiàn)場(chǎng)離奇詭異餐禁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)突照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門帮非,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讹蘑,你說我怎么就攤上這事末盔。” “怎么了座慰?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵陨舱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我版仔,道長(zhǎng)游盲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任蛮粮,我火速辦了婚禮益缎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘然想。我一直安慰自己莺奔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布变泄。 她就那樣靜靜地躺著令哟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妨蛹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天蛙卤,我揣著相機(jī)與錄音狠半,去河邊找鬼。 笑死表窘,一個(gè)胖子當(dāng)著我的面吹牛典予,可吹牛的內(nèi)容都是我干的甜滨。 我是一名探鬼主播乐严,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼衣摩!你這毒婦竟也來了昂验?” 一聲冷哼從身側(cè)響起捂敌,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎既琴,沒想到半個(gè)月后占婉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甫恩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年逆济,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磺箕。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奖慌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出松靡,到底是詐尸還是另有隱情简僧,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布雕欺,位于F島的核電站岛马,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屠列。R本人自食惡果不足惜啦逆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脸哀。 院中可真熱鬧蹦浦,春花似錦、人聲如沸撞蜂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝌诡。三九已至溉贿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浦旱,已是汗流浹背宇色。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颁湖,地道東北人宣蠕。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甥捺,于是被迫代替她去往敵國(guó)和親抢蚀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345