一、Kubernetes 是什么怎茫?
1.Kubernetes 定義:
Kubernetes 是一個(gè)全新的基于容器技術(shù)的分布式建構(gòu)領(lǐng)先方案收壕,他是基于容器技術(shù),目的是實(shí)現(xiàn)資源管理的自動(dòng)化轨蛤,以及跨多個(gè)數(shù)據(jù)中心的資源利用率的最大化~
2.Kubernetes 特點(diǎn):
? 遵循Kubernetes的設(shè)計(jì)思想蜜宪,我們只需要關(guān)注我們的業(yè)務(wù)模塊,那些和業(yè)務(wù)不相干的底層代碼和功能模塊祥山,都可以不用關(guān)注圃验,比如我們可以不用費(fèi)心去部署負(fù)載均衡器,不用考慮自己搭建一個(gè)復(fù)雜的服務(wù)之力框架缝呕,不用再去操心服務(wù)的監(jiān)控和故障處理模塊~Kubernetes提供的一整套解決方案澳窑,可以讓開(kāi)發(fā)者將精力集中于業(yè)務(wù)本身,Kubernetes本身也提供了強(qiáng)大的自動(dòng)化機(jī)制供常,大大減少了運(yùn)維成本摊聋。
? Kubernetes是一個(gè)開(kāi)放的平臺(tái),不局限于任何一種語(yǔ)言栈暇,所以你可以把Java ,Go 又或者是C++映射成Kubernetes的Service麻裁,并通過(guò)標(biāo)準(zhǔn)的TCP協(xié)議進(jìn)行交互。而且源祈,對(duì)于現(xiàn)有的系統(tǒng)我們也可以很容易改造并升級(jí)到Kubernetes平臺(tái)上煎源。
? Kubernetes是一個(gè)完備的分布式系統(tǒng)支撐平臺(tái),Kubernetes 具有完備的集群管理能力香缺,包括多層次的安全防護(hù)和準(zhǔn)入機(jī)制手销,多租戶應(yīng)用支撐能力,透明的服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)機(jī)制赫悄,內(nèi)建智能負(fù)載均衡器原献,強(qiáng)大的故障發(fā)現(xiàn)和自我修復(fù)能力,服務(wù)滾動(dòng)升級(jí)和在線擴(kuò)容能力等等埂淮。
3.為什么用Kubernetes :
我們知道姑隅,Docker的出現(xiàn),很好的解決了環(huán)境不一致的問(wèn)題倔撞,但是對(duì)于日益普及的微服務(wù)架構(gòu)讲仰,我們可能需要部署的服務(wù)器成百上千,我們無(wú)法做到手動(dòng)啟用和維護(hù)這些服務(wù)器痪蝇,因此鄙陡,容器編排就顯得尤為重要冕房,簡(jiǎn)單的說(shuō),容器編排的目的就是告訴服務(wù)器集群要使用哪些機(jī)器來(lái)運(yùn)行當(dāng)前的服務(wù)趁矾。
? 加強(qiáng)團(tuán)隊(duì)協(xié)作耙册,采用Kubernetes解決方案之后,我們只需要一名架構(gòu)師專注于系統(tǒng)中“服務(wù)組件”的提煉毫捣,幾名開(kāi)發(fā)工程師專注于業(yè)務(wù)開(kāi)發(fā)详拙,一名系統(tǒng)兼運(yùn)維工程師負(fù)責(zé)Kubernetes的部署和運(yùn)維。
? Kubernetes 全面擁抱微服務(wù)蔓同,微服務(wù)的核心就是將一個(gè)巨大的單體應(yīng)用分解為很多小的互相關(guān)聯(lián)的微服務(wù)饶辙,一個(gè)微服務(wù)背后可能有多個(gè)實(shí)例副本支撐,副本的數(shù)量可能隨著系統(tǒng)的負(fù)荷變化而調(diào)整斑粱,我們有內(nèi)嵌的負(fù)載均衡器來(lái)實(shí)現(xiàn)這樣的功能弃揽。
? Kubernetes 可隨時(shí)遷移到公有云上,以及基于OpenStack的私有云上则北。
? Kubernetes系統(tǒng)架構(gòu)具備了超強(qiáng)的橫向擴(kuò)容能力矿微,不用修改代碼,一個(gè)Kubernetes集群即可從只包含幾個(gè)Node的小集群平滑擴(kuò)展到擁有上百個(gè)Node的大規(guī)模集群尚揣。
二蒋失、Kubernetes 基本概念和術(shù)語(yǔ)
Kubernetes有三種主要訪問(wèn)入口:API 躁锁、UI 栏尚、CLI栅隐。
Kubernetes中的大部分概念如Node挖息、Pod背桐、Replication Controller系宜、Service等都可以看做一種“資源對(duì)象”骑丸,幾乎所有的資源對(duì)象都可以通過(guò)kubetcl工具執(zhí)行crud的操作并使用etcd做持久化存儲(chǔ)俺叭。我們首先來(lái)了解下兩個(gè)重要的管理角色:Master & Node
1.Master:
? ? Kubernetes 里面的Master指的是集群控制節(jié)點(diǎn)恭取,每個(gè)Kubernetes的集群里面需要有一個(gè)Master節(jié)點(diǎn)來(lái)負(fù)責(zé)整個(gè)集群的管理和控制,基本所有的Kubernetes所有控制指令都發(fā)給他熄守,他來(lái)負(fù)責(zé)具體的執(zhí)行過(guò)程蜈垮。Master節(jié)點(diǎn)通常會(huì)占領(lǐng)一個(gè)獨(dú)立的服務(wù)器,甚至我們需要3臺(tái)左右來(lái)做高可用裕照,畢竟他是整個(gè)集群的首腦攒发,一旦宕機(jī),整個(gè)集群就會(huì)處于癱瘓狀態(tài)晋南。
Master節(jié)點(diǎn)有如下幾個(gè)關(guān)鍵模塊:
? Kubernetes API Server (K8S自有模塊): 提供了Http Rest接口的關(guān)鍵服務(wù)進(jìn)程惠猿,是Kubernetes集群里面所有資源的crud(接收客戶端請(qǐng)求)的唯一操作入口,并驗(yàn)證客戶請(qǐng)求是都符合規(guī)范负间,也是集群控制的入口進(jìn)程偶妖。
? Kubernetes Controller Manager(K8S自有模塊): Kubernetes 所有資源對(duì)象自動(dòng)化控制中心姜凄。申明式的(用戶不關(guān)心是怎么創(chuàng)建出來(lái)的)資源創(chuàng)建,并確保創(chuàng)建出來(lái)的資源完全滿足要求趾访,并且處于健康的運(yùn)行狀態(tài)(Controller Loop管理)态秧。一旦用戶有請(qǐng)求過(guò)來(lái),Controller模塊會(huì)watch到需要的變更扼鞋,
? Kubernetes Scheduler(K8S自有模塊) : 負(fù)責(zé)資源調(diào)度(Pod調(diào)度)的進(jìn)程申鱼,當(dāng)我們通過(guò)API 、UI 藏鹊、CLI向Master申請(qǐng)創(chuàng)建一個(gè)容器润讥,這個(gè)容器到底要運(yùn)行在哪個(gè)Node上,那么Schedule就是主要用來(lái)評(píng)估哪個(gè)Node節(jié)點(diǎn)是最佳的盘寡,然后將我們要起的Pod在哪個(gè)Node上運(yùn)行
? Kubernetes etcd: Kubernetes 持久化存儲(chǔ)楚殿,etcd本不屬于Master,是由CoreOS公司開(kāi)發(fā)的一款持久化存儲(chǔ)
2.Node:
除了Master節(jié)點(diǎn)竿痰,Kubernetes 集群中的其他節(jié)點(diǎn)被稱為Node節(jié)點(diǎn)脆粥,他可以是物理機(jī)也可以是虛擬機(jī),Node節(jié)點(diǎn)是整個(gè)集群中的工作負(fù)載影涉,每個(gè)Node都會(huì)被Master分配一些工作負(fù)載(Docker Container)变隔,當(dāng)某個(gè)Node宕機(jī)時(shí),他的工作負(fù)載會(huì)被轉(zhuǎn)移到其他的節(jié)點(diǎn)上去蟹倾。
每個(gè)Node節(jié)點(diǎn)上都會(huì)運(yùn)行下一組關(guān)鍵進(jìn)程:
? kubelet:負(fù)責(zé)Pod對(duì)應(yīng)的容器的創(chuàng)建匣缘、啟停等任務(wù),同時(shí)與Master節(jié)點(diǎn)密切合作鲜棠,實(shí)現(xiàn)集群管理的基本功能
? kube-proxy:實(shí)現(xiàn)Kubernetes Service的通信與負(fù)載均衡機(jī)制的重要組件
? Docker Engine:Docker引擎肌厨,負(fù)責(zé)本機(jī)的容器的創(chuàng)建和管理
Node節(jié)點(diǎn)可以在運(yùn)行期間動(dòng)態(tài)增加到Kubernetes集群中去,前提是這個(gè)節(jié)點(diǎn)上已經(jīng)正確安裝豁陆、配置和啟動(dòng)了上述的所有關(guān)鍵進(jìn)程柑爸,默認(rèn)情況下kubelet會(huì)向Master注冊(cè)自己。一旦Node被納入集群管理范圍盒音,kubelet會(huì)定時(shí)向Master節(jié)點(diǎn)匯報(bào)自身的情況表鳍,如操作系統(tǒng)、Docker版本祥诽、機(jī)器的CPU和memory使用情況譬圣。當(dāng)某個(gè)Node超過(guò)指定的時(shí)間不上報(bào)信息的時(shí)候,會(huì)被Master判定為失聯(lián)原押,Node狀態(tài)會(huì)被標(biāo)記為不可用胁镐,隨后會(huì)將該Node的工作負(fù)載轉(zhuǎn)移到其他Node。
3.Pod:
Pod是一組容器的組合,每個(gè)Pod都包含一個(gè)Pause容器以及若干個(gè)業(yè)務(wù)相關(guān)的容器
為什么Kubernetes會(huì)設(shè)計(jì)出Pod這樣一個(gè)概念盯漂,并且有這樣的組成結(jié)構(gòu)呢颇玷?
? 原因1:在一組容器作為一個(gè)單元的情況下,我們很難根據(jù)一臺(tái)機(jī)器的狀態(tài)來(lái)判斷整體的狀態(tài)就缆,因此我們引入與業(yè)務(wù)無(wú)關(guān)并且不容易死亡的Pause容器作為Pod的根容器帖渠,他來(lái)代表整個(gè)容器組的狀態(tài)
? 原因2:Pod里多個(gè)業(yè)務(wù)容器共享Pause容器的IP,共享Pause容器的Volume竭宰,這樣既簡(jiǎn)化了密切關(guān)聯(lián)的業(yè)務(wù)容器之間的通信問(wèn)題空郊,也解決了他們之間的文件共享問(wèn)題
我們用一張圖來(lái)表示Node Pod和Container之間的關(guān)系:
普通的Pod一旦被創(chuàng)建,會(huì)被放到etcd中存儲(chǔ)切揭,隨后會(huì)被Master調(diào)度到某個(gè)具體的Node上并進(jìn)行綁定狞甚,隨后該P(yáng)od被對(duì)應(yīng)Node上的kubelet進(jìn)程實(shí)例化程一組相關(guān)的Docker容器并啟動(dòng)起來(lái)。
4.Label:
Lable是Kubernetes系統(tǒng)中另外一個(gè)核心概念廓旬,一個(gè)Label是一個(gè)key=value的鍵值對(duì)哼审,key和value由用戶自己定義,Label可以附加到各種資源對(duì)象上孕豹,例如Node涩盾,Pod,Service励背,RC等等春霍,一個(gè)資源對(duì)象可以定義任意數(shù)量的Label,同一個(gè)Label也能被添加到任意數(shù)量的資源對(duì)像上去叶眉。例如:
? 版本標(biāo)簽:"release" : "stable"
? 環(huán)境標(biāo)簽:"Environment" : "DEV"
? 分區(qū)標(biāo)簽 :"partition" : "customerA"
我們可以用Label Selector查詢和篩選擁有某些Label的資源對(duì)象址儒。我們查詢方式有兩種:
? name = redis-slave : 匹配所有具有標(biāo)簽name = redis-slave 的資源對(duì)象
? name in (redis-master , redis-slave):匹配素有具有標(biāo)簽name = redis-master和name = redis-slave的資源對(duì)象
我們的label標(biāo)簽主要有以下幾種使用場(chǎng)景:
? kube-controller : 通過(guò)資源對(duì)象RC上定義的Label Selector來(lái)篩選要監(jiān)控的Pod副本的數(shù)量,從而實(shí)現(xiàn)Pod副本數(shù)量實(shí)在符合預(yù)期設(shè)定的全自動(dòng)控制流程衅疙。
? kube-proxy :? 通過(guò)Service的Label Selector來(lái)選擇對(duì)應(yīng)的Pod离福,自動(dòng)建立起每個(gè)Service到對(duì)應(yīng)Pod的請(qǐng)求轉(zhuǎn)發(fā)路由表,從而實(shí)現(xiàn)Service的智能負(fù)載均衡機(jī)制炼蛤。
總之,使用Label可以給對(duì)象創(chuàng)建多組標(biāo)簽蝶涩,Label和Label Selector共同構(gòu)成了Kubernetes 系統(tǒng)中最核心的應(yīng)用模型理朋,使得被管理對(duì)象能夠被精細(xì)的分組管理,同時(shí)實(shí)現(xiàn)整個(gè)集群的高可用性绿聘。
5.Replication Controller:
RC是Kubernetes 核心概念之一嗽上,他定義了一個(gè)期望的場(chǎng)景,即聲明某種Pod的副本數(shù)量在任意時(shí)刻符合某個(gè)預(yù)期值熄攘,了解云平臺(tái)的小伙伴都知道兽愤,類似于AutoScaling所定義的虛機(jī)數(shù)目,可以設(shè)置在任意時(shí)刻必須要有N臺(tái)機(jī)器處于運(yùn)行狀態(tài)。RC定義包括:
? Pod期待的副本數(shù)(replicas)
? 用于篩選目標(biāo)Pod的Label Selector
? 當(dāng)副本數(shù)小于預(yù)期數(shù)時(shí)浅萧,用于創(chuàng)建新的Pod的Pod模板(template)
當(dāng)我們定義好一個(gè)RC并提交到Kubernetes 集群后逐沙,Master節(jié)點(diǎn)上的Controller Manager組件就得到通知,定期巡檢系統(tǒng)中當(dāng)前存活的目標(biāo)Pod洼畅,并且確保目標(biāo)Pod實(shí)例的數(shù)量剛好等于此RC的期望值吩案,如果有過(guò)多的Pod在運(yùn)行,系統(tǒng)就會(huì)停掉一些Pod帝簇,否則系統(tǒng)會(huì)在創(chuàng)建一些Pod徘郭。
假如我們?cè)赗C里定義redis-slave這個(gè)Pod需要2個(gè)副本,那么系統(tǒng)會(huì)在其中兩個(gè)Node上保持兩個(gè)Pod丧肴。如下圖:
此外残揉,在運(yùn)行時(shí),我們可以通過(guò)修改RC的副本數(shù)量芋浮,來(lái)實(shí)現(xiàn)Pod的動(dòng)態(tài)縮放:
? ? ? ? ? ? ? ? kubectl scale rc redis-slave --replicas=3
我們需要注意的是抱环,刪除RC不會(huì)刪除已經(jīng)創(chuàng)建好的Pod,如果需要?jiǎng)h除所有符合條件的Pod途样,可以設(shè)置replicas的值為0江醇,然后更新RC即可。
在Kubernetes 1.2中我們升級(jí)成另一個(gè)概念:Replica Set何暇。功能方面陶夜,Repica Set支持Set-based selector.
最后我們來(lái)看下RC(Replica Set)的特性:
? 我們通過(guò)定義一個(gè)RC來(lái)實(shí)現(xiàn)Pod的創(chuàng)建過(guò)程以及副本數(shù)量的控制
? RC中包括完整的Pod定義模板
? RC通過(guò)Label Selector機(jī)制實(shí)現(xiàn)對(duì)Pod副本的自動(dòng)控制
? 通過(guò)改變RC里的Pod數(shù)量,可以實(shí)現(xiàn)Pod的擴(kuò)容
? 通過(guò)改變RC中的Pod模板的鏡像版本裆站,可以實(shí)現(xiàn)Pod的滾動(dòng)升級(jí)功能
6.Deployment:
Deployment是Kubernetes 1.2引入的新概念条辟,引入的目的是為了更好的解決Pod的編排問(wèn)題。Deployment在內(nèi)部使用的是Replica Set來(lái)實(shí)現(xiàn)目的宏胯,因此他可以看做是R
3.C的一次升級(jí)羽嫡。
Deployment相對(duì)于RC最大的一個(gè)升級(jí)是可以隨時(shí)知道當(dāng)前Pod的部署進(jìn)度,實(shí)際上由于一個(gè)Pod的創(chuàng)建肩袍、調(diào)度杭棵、綁定節(jié)點(diǎn)以及在目標(biāo)Node上啟動(dòng)對(duì)應(yīng)容器這一完整過(guò)程需要一定時(shí)間,所以我們期待系統(tǒng)啟動(dòng)N個(gè)Pod副本的目標(biāo)狀態(tài)氛赐,其實(shí)是一個(gè)連續(xù)的過(guò)程魂爪。
Deployment使用場(chǎng)景有如下幾個(gè):
? 創(chuàng)建一個(gè)Deployment對(duì)象來(lái)生成對(duì)應(yīng)的Replica Set 并完成Pod副本的創(chuàng)建過(guò)程
? 檢查Deployment的狀態(tài)來(lái)看部署動(dòng)作是否完成
? 更新Deployment以創(chuàng)建新的Pod
? 如果當(dāng)前的Deployment不穩(wěn)定,則回滾到早先的Deployment版本
? 查看Deployment狀態(tài)艰管,一次作為發(fā)布是否成功的目標(biāo)
7.Service:
Kubernetes中的每個(gè)服務(wù)其實(shí)就是微服務(wù)滓侍,之前的Pod RC等等,都是為Service服務(wù)的:
? Service定義了一個(gè)服務(wù)的訪問(wèn)入口地址
? 前端應(yīng)用(Pod)通過(guò)這個(gè)入口地址訪問(wèn)其背后的一組由Pod副本組成的集群實(shí)例牲芋。
? Service與其后端Pod副本集群之間是通過(guò)Label Selector來(lái)實(shí)現(xiàn)無(wú)縫對(duì)接的
? RC保證Service的服務(wù)能力和服務(wù)質(zhì)量始終處于預(yù)期標(biāo)準(zhǔn)
運(yùn)行在每個(gè)Node上的Kube-proxy進(jìn)程其實(shí)就是一個(gè)只能的負(fù)載均衡器撩笆,他負(fù)責(zé)把對(duì)Service的請(qǐng)求轉(zhuǎn)發(fā)到后端的某個(gè)Pod上捺球,并在內(nèi)部實(shí)現(xiàn)服務(wù)的負(fù)載均衡與會(huì)話保持機(jī)制。Service不是共用一個(gè)負(fù)載均衡器的IP地址夕冲,而是每個(gè)Service分配了一個(gè)全局的IP地址氮兵,這個(gè)虛擬IP稱為Cluster IP。
外部系統(tǒng)訪問(wèn)Service的問(wèn)題:
在Kubernetes中我們有三種IP:
? Node IP: Node節(jié)點(diǎn)的IP地址耘擂,是集群中每個(gè)節(jié)點(diǎn)的物理網(wǎng)卡的IP地址胆剧,是一個(gè)真實(shí)存在的物理網(wǎng)絡(luò)
? Pod IP: Pod的IP地址,是Docker Enginne根據(jù)docker()網(wǎng)橋的IP地址段進(jìn)行分配的醉冤,通常是一個(gè)虛擬的二層網(wǎng)絡(luò)
? Cluster IP :Service的IP地址秩霍,是一種虛擬IP,僅僅作用于Kubernetes Service這個(gè)對(duì)象蚁阳,并且由Kubernetes管理和分配IP地址铃绒,他是無(wú)法被ping到的,因?yàn)樗且粋€(gè)虛擬的對(duì)象
小結(jié):Service的Cluster IP屬于Kubernetes集群內(nèi)部的地址螺捐,無(wú)法在集群外部直接使用這個(gè)地址颠悬,如果需要提供給外部用戶使用,可以采用NodePort解決
8.Volume
Volume是Pod中能夠被多個(gè)容器訪問(wèn)的共享目錄
如何使用:在Pod上聲明一個(gè)Volume定血,然后在容器里引用該Volume并Mount到容器的某個(gè)目錄上
我們來(lái)看下Kubernetes提供的Volume類型:
? emptyDir:在Pod分配到Node時(shí)創(chuàng)建的臨時(shí)空間赔癌,初始內(nèi)容為空,并且無(wú)需指定宿主機(jī)上對(duì)應(yīng)的目錄文件澜沟,因?yàn)檫@個(gè)是Kubernetes自動(dòng)分配的一個(gè)目錄灾票,當(dāng)Pod從Node上移除時(shí),emptyDir中的數(shù)據(jù)也會(huì)被永久刪除茫虽。
? hostPath:在Pod上掛在宿主機(jī)上的文件或目錄刊苍,可以用于以下幾個(gè)方面:
? ? 1.容器應(yīng)用程序生成的日志文件需要永久保存時(shí),可以使用宿主機(jī)的高度文件系統(tǒng)進(jìn)行存儲(chǔ)
? ? 2.需要訪問(wèn)宿主機(jī)上的Docker引擎內(nèi)部數(shù)據(jù)結(jié)構(gòu)的容器應(yīng)用時(shí)濒析,可以通過(guò)定義hostPath為宿主機(jī)/var/lib/docker目錄正什,使得容器內(nèi)部應(yīng)用可以直接訪問(wèn)Docker的文件系統(tǒng)。
? Persistent Volume:前面兩種是定義在Pod上的計(jì)算資源号杏,而網(wǎng)絡(luò)存儲(chǔ)是相對(duì)獨(dú)立于計(jì)算資源的一種實(shí)體資源婴氮,例如AWSElasticBlockStore,AzureFile等~
9.NameSpace
在Kubernetes中,NameSpace在很多情況下用于資源隔離盾致,NameSpace通過(guò)將集群內(nèi)部的資源對(duì)象分配到不同的NameSpace中莹妒,形成邏輯上的不同分組,便于不同分組在共享使用整個(gè)集群的資源的同時(shí)還能被分別管理绰上。
Kubernetes集群子啟動(dòng)后,會(huì)創(chuàng)建一個(gè)default的NameSpace渠驼。一旦創(chuàng)建了NameSpace我們?cè)诙x資源的時(shí)候就可以指定這個(gè)資源屬于哪個(gè)NameSpace蜈块。
當(dāng)我們?cè)诮o每個(gè)用戶創(chuàng)建NameSpace來(lái)實(shí)現(xiàn)多個(gè)用戶資源隔離時(shí),還可以結(jié)合Kubernetes的資源配額管理,限定不同用戶能占用的資源百揭,比如CPU爽哎、內(nèi)存等等~
10.Anotation
Annotation與Label類似,也是使用Key/Value的形式定義器一,但是Label有嚴(yán)格的命名規(guī)則课锌,當(dāng)天定義的是Kubernetes對(duì)象元素(Metadata),并且勇于Label Selector;Annotation則是用戶定義的附加信息祈秕,以便于外部工具進(jìn)行查找渺贤,比如,Annotation可以定義如下信息:
build信息请毛,release信息志鞍,Docker鏡像信息等。
小結(jié)
上述這些組件是Kubernetes系統(tǒng)的核心組件方仿,他們共同構(gòu)成了Kubernetes系統(tǒng)的框架和計(jì)算模型固棚。通過(guò)對(duì)他們進(jìn)行靈活組合,用戶可以快速仙蚜、方便的對(duì)容器和集群進(jìn)行配置此洲、創(chuàng)建和管理。
下面我們會(huì)對(duì)各個(gè)模塊最詳細(xì)的闡述委粉。