1.kubernetes介紹
k8s是一個(gè)完備的分布式系統(tǒng)支持平臺(tái),k8s具有完備的集群管理能力,包括多層次的安全防護(hù)和準(zhǔn)入機(jī)制、多租戶(hù)應(yīng)用支撐能力、透明的服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)機(jī)制、內(nèi)建智能負(fù)載均衡器、強(qiáng)大的故障發(fā)現(xiàn)和自我修復(fù)能力、服務(wù)滾動(dòng)升級(jí)能力和在線擴(kuò)容能力、可擴(kuò)展的資源自我調(diào)度機(jī)制,以及粒度度的資源配額管理能力。同時(shí)k8s提供了完善的管理工具。這些工具包含開(kāi)發(fā),部署測(cè)試,運(yùn)維監(jiān)控在內(nèi)的各個(gè)環(huán)節(jié),因此,k8s是一個(gè)全新的基于容器技術(shù)的分布式架構(gòu)解決方案,并且是一個(gè)一站式完備的分布式系統(tǒng)開(kāi)發(fā)和支撐平臺(tái)。
2.簡(jiǎn)單了解k8s的基礎(chǔ)知識(shí)
1)service服務(wù)是分布式集群架構(gòu)的核心,一個(gè)service對(duì)象擁有如下關(guān)鍵特征:
a.擁有一個(gè)唯一的制定的名字(比如mysql-server)
b.擁有一個(gè)虛擬的IP(Cluster IP,Service IP或者是VIP)和端口號(hào)
c.能夠提供某種遠(yuǎn)程服務(wù)能力
d.被映射到了提供這總服務(wù)能力的一組容器應(yīng)用上
一個(gè)service通常是由多個(gè)相關(guān)服務(wù)進(jìn)程來(lái)提供服務(wù)的,每個(gè)進(jìn)程都有獨(dú)立的(IP+port)訪問(wèn)點(diǎn),但k8s能夠通過(guò)service(虛擬Cluster+Service Port)連接指定的service上,更重要的是k8s中的service本身一旦被創(chuàng)建就不再變化了。我們不必為了服務(wù)IP地址的變化而頭疼。
2)pod對(duì)象,為service提供的這組進(jìn)程放到容器中進(jìn)行隔離。是k8s最重要也是最基本的概念。

備注:
1)每一個(gè)pod里運(yùn)行著一個(gè)特殊的容器---Pause容器,其他容器都是業(yè)務(wù)容器,這些業(yè)務(wù)容器共享pause容器的網(wǎng)絡(luò)棧和Volume(邏輯卷)掛載卷。因此他們之間的通信和數(shù)據(jù)交換更為高效。
2)k8s設(shè)計(jì)了pod對(duì)象,將每個(gè)服務(wù)進(jìn)程包裝到相應(yīng)的pod中,使其成為pod中運(yùn)行的一個(gè)容器(container),k8s為每一個(gè)pod提供一個(gè)唯一的Ip地址。一個(gè)Pod中的多個(gè)容器共享此ip地址。
3)pod運(yùn)行在一個(gè)節(jié)點(diǎn)(node)的環(huán)境中,通常一個(gè)節(jié)點(diǎn)上可以運(yùn)行幾百個(gè)pod
4)并不是每一個(gè)pod和它里面運(yùn)行的容器都能夠映射到一個(gè)service上,只有那些提供服務(wù)的一組pod才會(huì)被映射到一個(gè)service上。
5)Pod有兩中類(lèi)型:
普通的Pod:一經(jīng)創(chuàng)建,存放在etcd中,隨后被k8s master調(diào)度到某個(gè)Node并進(jìn)行綁定,隨后pod被對(duì)應(yīng)的node上的kubelet進(jìn)程實(shí)例化一組相關(guān)的Docker容器并啟動(dòng)。
靜態(tài)的Pod:不存放在etcd存儲(chǔ)中,存放在某個(gè)具體的Node上的具體文件中,并且只在此node中啟動(dòng)運(yùn)行
默認(rèn)情況下,當(dāng)pod里的某個(gè)容器停止了,k8s會(huì)自動(dòng)檢測(cè)到這個(gè)問(wèn)題并且重新啟動(dòng)這個(gè)Pod(重啟Pod里的所有容器),如果Pod所在的Node宕機(jī)了,則會(huì)將這個(gè)Node上的所有Pod重新調(diào)度少其他節(jié)點(diǎn)上。
6)Pod可以對(duì)器能使用的服務(wù)器上的計(jì)算資源進(jìn)行配額,在1.5.2版本中只能對(duì)cpu和內(nèi)存進(jìn)行限額,其中cpu和內(nèi)存的配額都是一個(gè)絕對(duì)值。
cpu配額的單位是m,通常一個(gè)容器的cpu配額定義為100~300m,即占用0.1~0.3個(gè)cpu。
內(nèi)存的單位是內(nèi)存字節(jié)數(shù)。
在k8s中,一個(gè)計(jì)算資源進(jìn)行配額限定需要設(shè)定一下兩個(gè)參數(shù)
Requests:該資源最小申請(qǐng)量,系統(tǒng)必須滿(mǎn)足要求
Limits:該資源最大允許使用的量,不能被突破,當(dāng)試圖超過(guò)這個(gè)量時(shí),會(huì)被k8s干掉并重啟。
yaml文件中配額的實(shí)例:

3.label標(biāo)簽:建立service和pod之間的關(guān)聯(lián)關(guān)系
1)k8s為mysql的pod貼上了name=mysql標(biāo)簽,然后給相應(yīng)的service定義標(biāo)簽選擇器(label selector)
2)mysql service 的標(biāo)簽選擇器的選擇條件是name=mysql 意為該service要作用于所有包含name=mysql標(biāo)簽的pod上。這樣就解決了service與pod的關(guān)聯(lián)關(guān)系,或者是基于集合的判斷(in 和 notin)
3)label Selector在k8s中重要的使用場(chǎng)景:
a.kube-controller進(jìn)程通過(guò)資源對(duì)象RC上定義的label Selector來(lái)篩選要監(jiān)控的Pod副本的數(shù)量,從而實(shí)現(xiàn)Pod副本的數(shù)量始終符合預(yù)期設(shè)定的全自動(dòng)控制流程
b.kube-proxy進(jìn)程通過(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)Servcice的智能負(fù)載均衡機(jī)制。
c.通過(guò)對(duì)某些Node定義特定的label,并且在Pod定義文件中使用NodeSelector這種標(biāo)簽調(diào)度策略,kube-scheduler進(jìn)程可以實(shí)現(xiàn)Pod定向調(diào)度的特性
4.集群管理方面
a.組成:master節(jié)點(diǎn)和一群node節(jié)點(diǎn)
master節(jié)點(diǎn):
1.master指的是集群控制節(jié)點(diǎn),每一個(gè)k8s集群都有一個(gè)master節(jié)點(diǎn)來(lái)負(fù)責(zé)集群中管理和控制,所有執(zhí)行命令都是master節(jié)點(diǎn)上運(yùn)行的。通常master會(huì)占用一臺(tái)服務(wù)器或者虛擬機(jī)。
2.運(yùn)行著集群管理相關(guān)的一組進(jìn)程:
kube-apiserver:提供HTTP Reset借口的關(guān)鍵服務(wù)進(jìn)程,是k8s里所有資源增刪改查操作的唯一入口,也是集群控制的入口進(jìn)程
kube-controller-manager:所有資源對(duì)象的自動(dòng)化控制中心,-------資源的大管家
kube-scheduler: 負(fù)責(zé)資源調(diào)度(pod調(diào)度)的進(jìn)程,----------公司調(diào)度室
作用:
實(shí)現(xiàn)整個(gè)集群的資源調(diào)度,pod調(diào)度,彈性伸展,安全控制,系統(tǒng)監(jiān)控,和糾錯(cuò)等管理功能,并且都是全自動(dòng)完成
補(bǔ)充:master節(jié)點(diǎn)上還啟動(dòng)一個(gè)etcd Server進(jìn)程,因?yàn)閗8s里的所有的資源對(duì)象的數(shù)據(jù)全部是保存在etcd(非關(guān)系數(shù)據(jù)庫(kù))中的。
node節(jié)點(diǎn):
1.node節(jié)點(diǎn)可以是物理機(jī)也可以是虛擬機(jī),node節(jié)點(diǎn)是k8s集群中的工作負(fù)載節(jié)點(diǎn),每一個(gè)node都會(huì)被master分配一些工作負(fù)載(docker 容器),當(dāng)某個(gè)node宕機(jī)時(shí),其上的工作負(fù)載會(huì)被master自動(dòng)轉(zhuǎn)移到其他節(jié)點(diǎn)上去。在node上k8s管理的最小運(yùn)行單元是pod
node上運(yùn)行關(guān)鍵進(jìn)程:
kubelet:負(fù)責(zé)pod對(duì)應(yīng)的容器的創(chuàng)建,啟停等任務(wù),同時(shí)與master節(jié)點(diǎn)密切協(xié)作,實(shí)現(xiàn)集群管理的基本功能
kube-proxy:實(shí)現(xiàn)kubernetes Service(kube-apiserver)的通信與負(fù)載均衡機(jī)制的重要組件
docker: docker 引擎,負(fù)責(zé)本機(jī)的容器創(chuàng)建和管理工作
作用:
負(fù)責(zé)pod的建立,啟動(dòng),監(jiān)控,重啟,銷(xiāo)毀,以及實(shí)現(xiàn)軟件模式的負(fù)載均衡器
補(bǔ)充:
node節(jié)點(diǎn)可以在運(yùn)行期間動(dòng)態(tài)添加到k8s的集群中。默認(rèn)情況下,kubelet會(huì)向master注冊(cè)自己,一旦node被納入集群管理范疇,kubelet會(huì)定時(shí)向master匯報(bào)自己的相關(guān)操作系統(tǒng)信息和有哪些pod在運(yùn)行,這樣master才能知道每個(gè)node的資源使用情況和實(shí)現(xiàn)高效均衡的資源調(diào)度策略。一旦master沒(méi)有收到node上報(bào)信息,會(huì)判定該node已經(jīng)不在了,會(huì)自動(dòng)創(chuàng)建node。
5.擴(kuò)容的處理
k8s集群中只需要為擴(kuò)容service關(guān)聯(lián)的pod創(chuàng)建一個(gè)Replication Controller(RC)文件
在一個(gè)RC文件中包含3個(gè)關(guān)鍵的信息:目標(biāo)pod的定義,目標(biāo)pod需要運(yùn)行的副本數(shù)量(Replicas)和要監(jiān)控的目標(biāo)pod的標(biāo)簽(label)
可以動(dòng)態(tài)縮放實(shí)現(xiàn)RC的副本數(shù)量:
kubectl? scale? ?rc? ?pod_name? --replicas=num??
RC set 的一些特征和作用:
