云原生簡介
一、什么是云原生
云原生是一種提供了可應(yīng)用于生產(chǎn)環(huán)境的方法論,方便企業(yè)快速運行應(yīng)用程序尊搬,企業(yè)不需要將人效用于底層運行環(huán)境,而是主要聚焦在業(yè)務(wù)功能開發(fā)土涝,從而實現(xiàn)產(chǎn)品的快速交付佛寿、迭代及穩(wěn)定運行,從而整體降低成本支出并提高交付效率但壮。
二冀泻、云原生技術(shù)棧
容器化:以docker、containerd為代表的容器運行技術(shù)蜡饵。
服務(wù)網(wǎng)格:比如Service Mesh等弹渔。
微服務(wù):在微服務(wù)體系結(jié)構(gòu)中,一個項目是由多個松耦合且可獨立部署的較小組件或服務(wù)組成溯祸。
不可變基礎(chǔ)設(shè)施:不可變基礎(chǔ)設(shè)施可以理解為一個應(yīng)用運行所需要的基本運行需求肢专,不可變最基本的就是指運行服務(wù)的服務(wù)器在完成部署后,就不再進行更改焦辅,比如鏡像等博杖。
聲明式API:描述應(yīng)用程序的運行狀態(tài),并且由系統(tǒng)來決定如何來創(chuàng)建這個環(huán)境筷登,例如聲明一個pod剃根,會有k8s執(zhí)行創(chuàng)建并維持副本。
Kubernetes簡介
Kubernetes最初源于谷歌內(nèi)部的Borg前方,Borg是谷歌內(nèi)部的大規(guī)模集群管理系統(tǒng)狈醉,負(fù)責(zé)對谷歌內(nèi)部很多核心服務(wù)的調(diào)度和管理,Borg的目的是讓用戶能夠不必操心資源管理的問題惠险,讓他們專注于自己的核心業(yè)務(wù)苗傅,并且做到跨多個數(shù)據(jù)中心的資源利用率最大化。
Borg主要由BorgMaster班巩、Borglet渣慕、Borgcfg和Scheduler組成:
Kubernetes組件簡介
1.kube-apiserver:
Kubernetes API Server提供了k8s各類資源對象的增刪改查及watch等HTTP REST接口,提供鑒權(quán)趣竣、準(zhǔn)入,這些對象包括旱物,pods遥缕、services、replicasets等宵呛,API Server為REST操作提供認(rèn)證单匣、授權(quán)等服務(wù),并為集群的共享狀態(tài)提供前端,所有其他組件都通過該前端進行交互户秤。
RESTful API:是REST風(fēng)格的網(wǎng)絡(luò)接口码秉,REST描述的是在網(wǎng)絡(luò)中client和server的一種交互形式。
REST:是一種軟件架構(gòu)風(fēng)格鸡号,或者說是一種規(guī)范转砖,其強調(diào)HTTP應(yīng)當(dāng)以資源為中心,并且規(guī)范了URI的風(fēng)格鲸伴,規(guī)范了HTTP請求動作(GET府蔗、PUT、POST汞窗、DELETE姓赤、HEAD、OPTIONS)的使用仲吏,具有對應(yīng)的語義不铆。
2.運行時簡介:
OCI(Open Container Initiative):2015年Google、Docker裹唆、Redhat誓斥、IBM共同成立,定義了運行標(biāo)準(zhǔn)和鏡像標(biāo)準(zhǔn)品腹。
CRI(Container Runtime Interface):2016年12月Kubernetes發(fā)布CRI(容器運行時接口)岖食,可以支持RKT等不同的運行時。
CRI-O:由Redhat發(fā)起并開源舞吭,用于替代Docker成為Kubernetes的運行時泡垃,2016年開發(fā),2019年4月8日進入CNCF孵化羡鸥。
K8S版本大于1.23? containerd或cri-docker
K8S版本小于等于1.23? docker
對于kubectl的管理和使用無區(qū)別蔑穴,主要是安裝部署K8S的時候有區(qū)別。
3.kube-scheduler:
Kubernetes調(diào)度器是一個控制面進程惧浴,負(fù)責(zé)將Pods指派到節(jié)點上存和。
通過調(diào)度算法為待調(diào)度Pod列表的每個Pod從可用Node列表中選擇一個最適合的Node,并將信息寫入etcd中衷旅。
node節(jié)點上的kubelet通過API Server監(jiān)聽到Kubernetes Scheduler產(chǎn)生的Pod綁定信息捐腿,然后獲取對應(yīng)的Pod清單,下載Image柿顶,并啟動容器茄袖。
策略
LeastRequestedPriority:優(yōu)先從備選節(jié)點列表中選擇資源消耗最小的節(jié)點(CPU+內(nèi)存)。
CalculateNodeLabelPriority:優(yōu)先選擇含有指定label的節(jié)點嘁锯。
BalancedResourceAllocation:優(yōu)先從備選節(jié)點列表中選擇各項資源使用率最均衡的節(jié)點宪祥。
4.kube-controller-manager:
Controller Manager還包括一些子控制器(副本控制器聂薪、節(jié)點控制器、命名空間控制器和服務(wù)賬號控制器等)蝗羊,控制器作為集群內(nèi)部的管理控制中心藏澳,負(fù)責(zé)集群內(nèi)的Node、Pod副本耀找、服務(wù)端點(Endpoint)翔悠、命名空間(Namespace)、服務(wù)賬號(ServiceAccount)涯呻、資源定額(ResourceQuota)的管理凉驻,當(dāng)某個Node意外宕機時,Controller Manager會及時發(fā)現(xiàn)并執(zhí)行自動化修復(fù)流程复罐,確保集群中的Pod副本始終處于預(yù)期的工作狀態(tài)涝登。
controller-manager控制器每間隔5秒檢查一次節(jié)點的狀態(tài)。
如果controller-manager控制器沒有收到來自Node節(jié)點的心跳效诅,則將該節(jié)點標(biāo)記為不可達胀滚。
controller-manager將在標(biāo)記為無法訪問之前等待40秒。
如果該Node節(jié)點被標(biāo)記為無法訪問后5分鐘還沒有恢復(fù)乱投,controller-manager會刪除當(dāng)前Node節(jié)點的所有Pod并在其他可用節(jié)點重建這些Pod咽笼。
pod高可用機制
node monitor period:節(jié)點監(jiān)視周期,5s戚炫。
node monitor grace period:節(jié)點監(jiān)視器寬限期剑刑,40s。
pod eviction timeout:pod驅(qū)逐超時時間双肤,5m施掏。
5.kube-proxy:
Kubernetes運行在Node上的網(wǎng)絡(luò)代理,反映了Node上Kubernetes API中定義的服務(wù)茅糜,并可以通過一組后端進行簡單的TCP七芭、UDP和SCTP流轉(zhuǎn)發(fā)或者在一組后端進行循環(huán)TCP、UDP和SCTP轉(zhuǎn)發(fā)蔑赘,用戶必須使用apiserver API創(chuàng)建一個服務(wù)來配置代理狸驳,其實就是kube-proxy通過在主機上維護網(wǎng)絡(luò)規(guī)則并執(zhí)行連接轉(zhuǎn)發(fā)來實現(xiàn)Kubernetes服務(wù)訪問。
kube-proxy運行在每一個節(jié)點上缩赛,監(jiān)聽API Server中服務(wù)對象的變化耙箍,再通過管理iptables或者ipvs規(guī)則來實現(xiàn)網(wǎng)絡(luò)的轉(zhuǎn)發(fā)。
三種網(wǎng)絡(luò)
node網(wǎng)絡(luò):服務(wù)器宿主機的網(wǎng)絡(luò)酥馍。
pod網(wǎng)絡(luò):容器的網(wǎng)絡(luò)辩昆,容器創(chuàng)建好之后會使用pod網(wǎng)絡(luò)的IP。
service網(wǎng)絡(luò):是為了實現(xiàn)從node訪問到pod的轉(zhuǎn)發(fā)物喷,通過label匹配pod卤材。
IPVS
ipvs相對于iptables效率會更高一些,使用ipvs模式需要在運行kube-proxy的節(jié)點上安裝ipvsadm峦失、ipset工具包和加載ip_vs內(nèi)核模塊扇丛,當(dāng)kube-proxy以ipvs代理模式啟動時,kube-proxy將驗證節(jié)點上是否安裝ipvs模塊尉辑,如果未安裝帆精,kube-proxy將返回到iptables代理模式。
使用ipvs模式隧魄,kube-proxy會監(jiān)視Kubernetes Service對象和Endpoints卓练,調(diào)用宿主機內(nèi)核Netlink接口以相應(yīng)地創(chuàng)建ipvs規(guī)則,并定期與Kubernetes Service對象和Endpoints對象同步ipvs規(guī)則购啄,以確保ipvs狀態(tài)與期望一致襟企,訪問服務(wù)時,流量將被重定向到其中一個后端pod狮含,ipvs使用哈希表作為底層數(shù)據(jù)結(jié)構(gòu)并在內(nèi)核空間中工作顽悼,這意味著ipvs可以更快的重定向流量,并且在同步代理規(guī)則時具有更好的性能几迄。此外蔚龙,ipvs為負(fù)載均衡算法提供了更多選項,例如:rr(輪詢調(diào)度)映胁、lc(最小連接數(shù))木羹、dh(目標(biāo)哈希)、sh(源哈希)解孙、sed(最短期望延遲)坑填、nq(不排隊調(diào)度等)。
6.kubelet:
kubelet是運行在每個worker節(jié)點的代理組件妆距,它會監(jiān)視已分配給節(jié)點的pod穷遂,具體功能如下:
向master匯報node節(jié)點的狀態(tài)信息;
接受指令并在pod中創(chuàng)建docker容器娱据;
準(zhǔn)備pod所需的數(shù)據(jù)卷蚪黑;
返回pod的運行狀態(tài);
在node節(jié)點執(zhí)行容器健康檢查中剩。
7.kubectl:
是一個通過命令行對Kubernetes集群進行管理的客戶端工具忌穿。
8.etcd:
由CoreOS公司開發(fā),目前是Kubernetes默認(rèn)使用的key-value數(shù)據(jù)存儲系統(tǒng)结啼,用于保存Kubernetes的所有集群數(shù)據(jù)掠剑,etcd支持分布式集群功能,生產(chǎn)環(huán)境使用時需要為etcd數(shù)據(jù)提供定期備份機制郊愧。
9.DNS:
負(fù)責(zé)為整個集群提供DNS服務(wù)朴译,從而實現(xiàn)服務(wù)之間的訪問井佑。
10.Dashboard:
Dashboard是基于網(wǎng)頁的Kubernetes用戶界面,可以使用Dashboard獲取運行在集群中的應(yīng)用的概覽信息眠寿,也可以創(chuàng)建或者修改Kubernetes資源(Deployment躬翁、Job、DaemonSet等等)盯拱,也可以對Deployment實現(xiàn)彈性伸縮盒发、發(fā)起滾動升級、重啟pod或者使用向?qū)?chuàng)建新的應(yīng)用狡逢。