應(yīng)用部署方式演變
傳統(tǒng)部署---->虛擬化部署---->容器化部署
容器化部署出現(xiàn)的問題
1肋乍、一個(gè)容器故障停機(jī)了鹅颊,怎么樣讓另外一個(gè)容器立刻啟動(dòng)去替補(bǔ)停機(jī)的容器
2、當(dāng)并發(fā)訪問量變大的時(shí)候墓造,怎么樣做到橫向擴(kuò)展容器數(shù)量
容器管理的問題統(tǒng)稱為容器編排問題
解決方式:
產(chǎn)生了容器編排的軟件(市場占有率最高的是Kubernetes:Google開源的的容器編排工具)
k8s的主要功能
1堪伍、自我修復(fù):一旦某一個(gè)容器崩潰,能夠在1秒中左右迅速啟動(dòng)新的容器(比如圖中掛了一個(gè)nginx觅闽,那么1s左右就會(huì)有一個(gè)ngnix啟動(dòng)帝雇,總數(shù)5個(gè)不變)
2、彈性伸縮:可以根據(jù)需要蛉拙,自動(dòng)對(duì)集群中正在運(yùn)行的容器數(shù)量進(jìn)行調(diào)整(比如圖中5個(gè)ngnix上限支持1000個(gè)并發(fā)尸闸,當(dāng)并發(fā)量突然增大到1200,那么k8s集群會(huì)自動(dòng)地增加一個(gè)ngnix去分擔(dān)流量孕锄,當(dāng)并發(fā)量高峰過去以后吮廉,會(huì)自動(dòng)地把新啟動(dòng)的ngnix刪掉。)
3畸肆、服務(wù)發(fā)現(xiàn):服務(wù)可以通過自動(dòng)發(fā)現(xiàn)的形式找到它所依賴的服務(wù)(比如ngnix需要redis和mysql的幫助宦芦,那么它會(huì)在k8s內(nèi)部以自動(dòng)發(fā)現(xiàn)的形式去尋找這兩個(gè)服務(wù)【左上的nginx會(huì)自動(dòng)地去找到右上地mysql和右下地redis)
4、負(fù)載均衡:如果一個(gè)服務(wù)起動(dòng)了多個(gè)容器轴脐,能夠自動(dòng)實(shí)現(xiàn)請(qǐng)求的負(fù)載均衡(比如圖中集群中有5個(gè)ngnix调卑,比如有1000個(gè)并發(fā)請(qǐng)求抡砂,那么它會(huì)自動(dòng)地分擔(dān)到5個(gè)ngnix上去)
5、版本回退:如果發(fā)現(xiàn)新發(fā)布的程序版本有問題恬涧,可以立即回退到原來的版本注益。
6、存儲(chǔ)編排:可以根據(jù)容器自身的需求自動(dòng)創(chuàng)建存儲(chǔ)卷(比如mysql創(chuàng)數(shù)據(jù)需要存儲(chǔ)溯捆,那么它就要去中間的那個(gè)紫色的寫著存儲(chǔ)的地方要存儲(chǔ)卷丑搔,那么它直接告訴k8s它需要多少存儲(chǔ)。待日后學(xué)完再補(bǔ)充細(xì)節(jié)现使。)
k8s組件
一個(gè)kubernetes集群主要是由控制節(jié)點(diǎn)(master)低匙、工作節(jié)點(diǎn)(node)構(gòu)成,每個(gè)節(jié)點(diǎn)上都會(huì)安裝不同的組件碳锈。
master:集群的控制平面顽冶,負(fù)責(zé)集群的決策 ( 管理 )
ApiServer : 資源操作的唯一入口,接收用戶輸入的命令售碳,提供認(rèn)證强重、授權(quán)、API注冊(cè)和發(fā)現(xiàn)等機(jī)制
Scheduler : 負(fù)責(zé)集群資源調(diào)度贸人,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的node節(jié)點(diǎn)上【如果我要用這個(gè)集群间景,那么就要發(fā)起請(qǐng)求,請(qǐng)求進(jìn)入master后就進(jìn)入到ApiServer中艺智,然而右邊上下有兩個(gè)node倘要,所以要決策一下給哪個(gè)node干活,Scheduler就擔(dān)任決策的工作十拣》馀。】
ControllerManager : 負(fù)責(zé)維護(hù)集群的狀態(tài),比如程序部署安排夭问、故障檢測泽西、自動(dòng)擴(kuò)展、滾動(dòng)更新等【Scheduler決策完畢讓node1干活缰趋,需要有人安排捧杉,ControllerManager就把這個(gè)活安排給node1告訴它怎么去做∶匮】
Etcd :負(fù)責(zé)存儲(chǔ)集群中各種資源對(duì)象的信息【記錄這個(gè)服務(wù)在哪里味抖,體現(xiàn)的是一個(gè)數(shù)據(jù)庫功能(k8s默認(rèn)用這個(gè),如果想用mysql就自己配)】
node:集群的數(shù)據(jù)平面灰粮,負(fù)責(zé)為容器提供運(yùn)行環(huán)境 ( 干活 )
Kubelet : 負(fù)責(zé)維護(hù)容器的生命周期非竿,即通過控制docker,來創(chuàng)建谋竖、更新红柱、銷毀容器(接收master傳達(dá)的信息,接收完了它再把活安排下去蓖乘,它要控制docker將服務(wù)跑起來锤悄,也就是說要啟動(dòng)一個(gè)該服務(wù)的pod,pod是kubernetes的最小操作單元嘉抒,容器必須跑在pod中)
KubeProxy : 負(fù)責(zé)提供集群內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡(服務(wù)跑在了docker上了零聚,但是要提供對(duì)外訪問,就通過KubeProxyy來對(duì)pod產(chǎn)生訪問的代理些侍。和ApiServer入口訪問的區(qū)別:KubeProxy只是訪問這個(gè)布在docker上的服務(wù)隶症,而不是控制程序。)
Docker : 負(fù)責(zé)節(jié)點(diǎn)上容器的各種操作
kubernetes概念
Master:集群控制節(jié)點(diǎn)岗宣,每個(gè)集群需要至少一個(gè)master節(jié)點(diǎn)負(fù)責(zé)集群的管控
Node:工作負(fù)載節(jié)點(diǎn)蚂会,由master分配容器到這些node工作節(jié)點(diǎn)上,然后node節(jié)點(diǎn)上的docker負(fù)責(zé)容器的運(yùn)行
Pod:kubernetes的最小控制單元耗式,容器都是運(yùn)行在pod中的胁住,一個(gè)pod中可以有1個(gè)或者多個(gè)容器
Controller:控制器,通過它來實(shí)現(xiàn)對(duì)pod的管理刊咳,比如啟動(dòng)pod彪见、停止pod、伸縮pod的數(shù)量等等
Service:pod對(duì)外服務(wù)的統(tǒng)一入口娱挨,下面可以維護(hù)者同一類的多個(gè)pod
Label:標(biāo)簽余指,用于對(duì)pod進(jìn)行分類,同一類pod會(huì)擁有相同的標(biāo)簽(圖中service把流量打到3個(gè)tomcat上是因?yàn)檫@三個(gè)tomcat的標(biāo)簽相同)
NameSpace:命名空間跷坝,用來隔離pod的運(yùn)行環(huán)境(本來圖中四個(gè)pod是可以相互訪問的酵镜,如果不想讓他們相互訪問了,就設(shè)個(gè)namespace探孝,同一個(gè)namespace里面的pod才能相互訪問笋婿。)