0.前言
首先要說(shuō)的一點(diǎn):這篇文章不是什么教程呵恢,單純是自己學(xué)習(xí)的筆記,如果有錯(cuò)誤望各位大佬指正。
1. Kubernetes
1.1 什么是Kubernetes
Kubernetes是一個(gè)開(kāi)源容器協(xié)調(diào)器逃魄,由Google開(kāi)發(fā)携茂,用于管理在容器環(huán)境中運(yùn)行的應(yīng)用程序坦辟。
1.2 為什么要使用容器
我們?cè)谶x擇的時(shí)候主要是在虛擬機(jī)和容器之間選擇鳄橘,這兩者具體的區(qū)別很多声离,但他們都有著類似的使命:對(duì)應(yīng)用程序及其關(guān)聯(lián)性進(jìn)行隔離,從而構(gòu)建起一套能夠隨處運(yùn)行的自容納單元瘫怜。
??主要區(qū)別术徊,在于:虛擬機(jī)多了一層Guest OS,虛擬機(jī)的Hypervisor會(huì)對(duì)硬件資源也進(jìn)行虛擬化鲸湃,而Container會(huì)直接使用宿主機(jī)的硬件資源赠涮。
??如下圖的左圖的虛擬機(jī)架構(gòu)中,我們的主機(jī)虛擬化了3個(gè)VM暗挑,每個(gè)VM又有自己的Guest OS笋除,這個(gè)就意味著需要模擬3個(gè)操作系統(tǒng)。對(duì)比右圖的容器架構(gòu)中炸裆,我們的3個(gè)容器都在一個(gè)操作系統(tǒng)上運(yùn)行垃它,并不需要模擬任何操作系統(tǒng)。所以相對(duì)左圖我們會(huì)消耗更少的資源烹看,并達(dá)到跟虛擬機(jī)架構(gòu)中等同的效果国拇。
簡(jiǎn)而言之,容器小巧惯殊,靈活且可移植酱吝,因此它們可以幫助您快速部署和管理應(yīng)用程序,并根據(jù)需求進(jìn)行擴(kuò)展或縮小靠胜。在容器部署模型中掉瞳,應(yīng)用程序不依賴于特定的主機(jī),因此可以以更有效的方式跨可用資源分布它們浪漠。這種環(huán)境非常適合部署微服務(wù)陕习。
1.3 什么是微服務(wù)
微服務(wù)是一種架構(gòu)風(fēng)格,它將應(yīng)用程序分解為一組松散耦合的服務(wù)址愿,這些服務(wù)可以是細(xì)粒度和輕量級(jí)的该镣。這種風(fēng)格促進(jìn)了模塊化,并行開(kāi)發(fā)响谓,持續(xù)交付以及許多其他好處损合。
1.4 微服務(wù)與kubernates的關(guān)系
擁有許多在容器上運(yùn)行的微服務(wù)可能會(huì)變得難以管理,因此這就是Kubernetes的用武之地:Kubernetes自動(dòng)化應(yīng)用程序容器的部署娘纷,擴(kuò)展和操作嫁审。并提供工具和API來(lái)管理容器上的生產(chǎn)工作負(fù)載。它還支持多個(gè)云和裸機(jī)環(huán)境赖晶,并且是為可擴(kuò)展性而設(shè)計(jì)的律适,因此有一個(gè)豐富的插件生態(tài)系統(tǒng)可以擴(kuò)展其功能辐烂。有用于調(diào)度,存儲(chǔ)捂贿,網(wǎng)絡(luò)等的插件纠修。
2. Kubernetes集群架構(gòu)
從上圖可以看出Kubernetes架構(gòu)基于Cluster的概念。集群由一個(gè)或多個(gè)稱為Node的虛擬機(jī)組成厂僧。每個(gè)Node代表一個(gè)計(jì)算主機(jī)扣草,我們可以在其中部署,運(yùn)行和管理容器化應(yīng)用程序颜屠。
2.1 Master節(jié)點(diǎn)
Node節(jié)點(diǎn)由Kubernetes的Master節(jié)點(diǎn)管理辰妙,Master節(jié)點(diǎn)控制和監(jiān)視集群中的所有Kubernetes資源。 kube-scheduler服務(wù)決定部署應(yīng)用程序的位置汽纤,同時(shí)考慮集群中的部署要求和可用容量上岗。Kubernetes主要由以下幾個(gè)核心組件組成:
-
etcd:
用于 Kubernetes 的后端存儲(chǔ)。所有集群數(shù)據(jù)都存儲(chǔ)在此處蕴坪,始終為 Kubernetes 集群的 etcd 數(shù)據(jù)提供備份計(jì)劃; -
apiserver:
提供了資源操作的唯一入口敬锐,并提供認(rèn)證背传、授權(quán)、訪問(wèn)控制台夺、API注冊(cè)和發(fā)現(xiàn)等機(jī)制径玖; -
controller manager:
負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測(cè)颤介、自動(dòng)擴(kuò)展梳星、滾動(dòng)更新等; -
scheduler:
監(jiān)視沒(méi)有分配節(jié)點(diǎn)的新創(chuàng)建的 Pod滚朵,選擇一個(gè)節(jié)點(diǎn)供他們運(yùn)行冤灾。
2.2 Node節(jié)點(diǎn)
Node節(jié)點(diǎn)在 Kubernetes 主節(jié)點(diǎn)的控制下執(zhí)行被分配的任務(wù)。Kubernetes的node節(jié)點(diǎn)主要由以下幾個(gè)核心組件組成:
-
kubelet:
是一個(gè)代理辕近,它在集群中的每個(gè)節(jié)點(diǎn)上運(yùn)行韵吨,與主服務(wù)器通信,并管理節(jié)點(diǎn)上的活動(dòng)和資源移宅,例如通過(guò)Docker運(yùn)行Pod容器归粉。它負(fù)責(zé)維護(hù)容器的生命周期,同時(shí)也負(fù)責(zé)Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理漏峰; -
kube-proxy:
負(fù)責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡糠悼; -
Pod:
Kubernetes創(chuàng)建一個(gè)Pod來(lái)托管應(yīng)用程序?qū)嵗?Pod可以包括一個(gè)或多個(gè)應(yīng)用程序Container和一些共享資源,例如存儲(chǔ)浅乔,網(wǎng)絡(luò)信息等倔喂。 Pod中的Container共享IP地址和端口空間,始終位于同一位置并共同調(diào)度,并在同一節(jié)點(diǎn)上的共享上下文中運(yùn)行滴劲。
由于可以在向上或向下擴(kuò)展或進(jìn)行滾動(dòng)更新的過(guò)程中動(dòng)態(tài)創(chuàng)建和銷毀Pod攻晒,因此Pod IP地址可能會(huì)隨著時(shí)間的推移而發(fā)生變化。如果某些Pod為其他Pod提供功能班挖,并且地址發(fā)生變化鲁捏,他們?nèi)绾蜗嗷ジ櫍?/p>
答案是Service!
2.3 Service
Service是一種策略萧芙,它將一組Pod定義為端點(diǎn)给梅,以及用于訪問(wèn)它們。當(dāng)Service中的Pod集發(fā)生變化時(shí)双揪,Kubernetes可以更新端點(diǎn)动羽。
與部署一樣,我們可以在YAML文件中定義服務(wù)渔期。 Kubernetes為服務(wù)分配“集群IP地址”运吓,kube-proxy使用此地址來(lái)適當(dāng)?shù)芈酚烧?qǐng)求。
具體的在下一節(jié)介紹疯趟。
3. Kubernetes資源
Kubernetes資源之間的關(guān)系:
- 用戶通過(guò) kubectl 創(chuàng)建 Deployment拘哨。
- Deployment 創(chuàng)建 ReplicaSet。
- ReplicaSet 創(chuàng)建 Pod信峻。
3.1 Deployments
Deployments是kubernetes中的一種控制器倦青,是比ReplicaSet更高級(jí)的概念,它最重的特性是支持對(duì)pod與ReplicaSet的聲明式升級(jí)盹舞,聲明式升級(jí)比其它方式的升級(jí)更安全可靠产镐。需要注意的是用戶不應(yīng)該手動(dòng)管理被Deployments創(chuàng)建的ReplicaSet。
以下是幾種典型的Deployments使用案例:
- Create a Deployment to rollout a ReplicaSet. The ReplicaSet creates Pods in the background. Check the status of the rollout to see if it succeeds or not.
- Declare the new state of the Pods by updating the PodTemplateSpec of the Deployment. A new ReplicaSet is created and the Deployment manages moving the Pods from the old + **ReplicaSet to the new one at a controlled rate. Each new ReplicaSet updates the revision of the Deployment.
- Rollback to an earlier Deployment revision if the current state of the Deployment is not stable. Each rollback updates the revision of the Deployment.
- Scale up the Deployment to facilitate more load.
- Pause the Deployment to apply multiple fixes to its PodTemplateSpec and then resume it to start a new rollout.
- Use the status of the Deployment as an indicator that a rollout has stuck.
- Clean up older ReplicaSets that you don’t need anymore.
3.2 ReplicaSets
用戶創(chuàng)建指定數(shù)量的pod副本數(shù)量踢步,確保pod副本數(shù)量符合預(yù)期狀態(tài)癣亚,并且支持滾動(dòng)式自動(dòng)擴(kuò)容和縮容功能。
ReplicaSet主要三個(gè)組件組成:
- 用戶期望的pod副本數(shù)量
- 標(biāo)簽選擇器贾虽,判斷哪個(gè)pod歸自己管理
- 當(dāng)現(xiàn)存的pod數(shù)量不足逃糟,會(huì)根據(jù)pod資源模板進(jìn)行新建
幫助用戶管理無(wú)狀態(tài)的pod資源,精確反應(yīng)用戶定義的目標(biāo)數(shù)量蓬豁,但是RelicaSet不是直接使用的控制器绰咽,而是使用Deployment。
3.3 Pods
Pod是Kubernetes最基本的操作單元地粪,包含一個(gè)或多個(gè)緊密相關(guān)的容器取募,一個(gè)Pod可以被一個(gè)容器化的環(huán)境看作應(yīng)用層的“邏輯宿主機(jī)”;一個(gè)Pod中的多個(gè)容器應(yīng)用通常是緊密耦合的蟆技,Pod在Node上被創(chuàng)建玩敏、啟動(dòng)或者銷毀斗忌;每個(gè)Pod里運(yùn)行著一個(gè)特殊的被稱之為Pause的容器,其他容器則為業(yè)務(wù)容器旺聚,這些業(yè)務(wù)容器共享Pause容器的網(wǎng)絡(luò)棧和Volume掛載卷织阳,因此他們之間通信和數(shù)據(jù)交換更為高效,在設(shè)計(jì)時(shí)我們可以充分利用這一特性將一組密切相關(guān)的服務(wù)進(jìn)程放入同一個(gè)Pod中砰粹。
同一個(gè)Pod里的容器之間僅需通過(guò)localhost就能互相通信唧躲。
Pod的生命周期通過(guò)Replication Controller來(lái)管理;通過(guò)模板進(jìn)行定義碱璃,然后分配到一個(gè)Node上運(yùn)行弄痹,在Pod所包含容器運(yùn)行結(jié)束后,Pod結(jié)束嵌器。
&Kubernetes為Pod設(shè)計(jì)了一套獨(dú)特的網(wǎng)絡(luò)配置肛真,包括:為每個(gè)Pod分配一個(gè)IP地址,使用Pod名作為容器間通信的主機(jī)名等爽航。
3.4 Services
如前所述蚓让,Service是一種對(duì)象抽象,它定義了訪問(wèn)Pod或Pod集的策略岳掐。 Kubernetes Services支持協(xié)議的TCP和UDP凭疮。默認(rèn)值為T(mén)CP。
在Kubernetes中串述,Kubernetes有4種外部訪問(wèn)方式,Service types確定服務(wù)的部署方式及其行為方式:
-
ClusterIP:
將服務(wù)內(nèi)部暴露給Cluster IP地址上寞肖。此類型是默認(rèn)類型纲酗。 -
NodePort:在NodePort指定的端口上的每個(gè)集群節(jié)點(diǎn)的IP地址上公開(kāi)服務(wù)。將自動(dòng)創(chuàng)建關(guān)聯(lián)的ClusterIP服務(wù)新蟆。
該服務(wù)可通過(guò)<任何節(jié)點(diǎn)IP>:<NodePort>訪問(wèn)觅赊,也可通過(guò)ClusterIP在內(nèi)部訪問(wèn),并可指定或自動(dòng)分配琼稻。 -
LoadBalancer:
使用云提供商的負(fù)載均衡器在外部公開(kāi)服務(wù)吮螺。創(chuàng)建關(guān)聯(lián)的NodePort和ClusterIP服務(wù)。 -
ExternalName:
通過(guò)返回帶有值的CNAME記錄將服務(wù)映射到externalName字段帕翻。沒(méi)有配置任何類型的代理鸠补。
集群外部訪問(wèn)Pod或Service的方法?
大多數(shù)組織不希望將敏感數(shù)據(jù)直接暴露給Internet嘀掸,通常紫岩,可以為前端(BFF)或API網(wǎng)關(guān)構(gòu)建后端,以控制對(duì)后端資源的訪問(wèn)睬塌。然后泉蝌,請(qǐng)求通過(guò)Kubernetes內(nèi)部網(wǎng)絡(luò)歇万,可由LoadBalancer,Ingress或NodePort處理勋陪。NodePort不適用生產(chǎn)環(huán)境贪磺,所以只有LoadBalancer,Ingress可供選擇诅愚,他們兩個(gè)的優(yōu)缺點(diǎn)如下所示:
3.5 Volumn
Volumn是具有生命周期寒锚,并且可以比容器更長(zhǎng),從而在容器重啟之間保留數(shù)據(jù)呻粹。 Kubernetes Volumn是可由Pod中的容器訪問(wèn)的目錄壕曼。
**emptyDir:
**將Pod分配給節(jié)點(diǎn)時(shí)創(chuàng)建emptyDir實(shí)例。 Pod在該節(jié)點(diǎn)上運(yùn)行時(shí)存在emptyDir等浊。如其名稱所示腮郊,它最初是空的。當(dāng)出于任何原因從節(jié)點(diǎn)中刪除Pod時(shí)筹燕,將永久刪除emptyDir中的數(shù)據(jù)轧飞。**NFS:
**允許將NFS(網(wǎng)絡(luò)文件系統(tǒng))共享安裝到Pod中的volumn。與刪除Pod時(shí)刪除的emptyDir不同撒踪,NFSvolumn的內(nèi)容將被保留过咬,并且將卸載Volume。 NFS volumn可以預(yù)先填充數(shù)據(jù)制妄,并且可以在Pod之間移動(dòng)數(shù)據(jù)掸绞。 NFS可以由多個(gè)編寫(xiě)器同時(shí)安裝。
如下圖所示耕捞,Kubernetes Volumn主要解決了以下問(wèn)題:
- Pods(容器)是短暫的衔掸。如果容器崩潰,數(shù)據(jù)將丟失俺抽。
- Pod中運(yùn)行多個(gè)容器敞映,這些容器可能需要共享數(shù)據(jù)。
- Docker也有Volume的概念磷斧,但它只是磁盤(pán)或容器中的目錄振愿。
名詞解釋:
PV(PersistentVolume):
集群中已由管理員配置的一段網(wǎng)絡(luò)存儲(chǔ)。 集群中的資源就像一個(gè)節(jié)點(diǎn)是一個(gè)集群資源弛饭。 PV是諸如卷之類的卷插件冕末,但是具有獨(dú)立于使用PV的任何單個(gè)pod的生命周期。 該API對(duì)象捕獲存儲(chǔ)的實(shí)現(xiàn)細(xì)節(jié)孩哑,即NFS栓霜,iSCSI或云提供商特定的存儲(chǔ)系統(tǒng)。PVC(PersistentVolumeClaim):
是用戶存儲(chǔ)的請(qǐng)求横蜒。 它類似于pod胳蛮。Pod消耗節(jié)點(diǎn)資源销凑,PVC消耗存儲(chǔ)資源。 pod可以請(qǐng)求特定級(jí)別的資源(CPU和內(nèi)存)仅炊。 權(quán)限要求可以請(qǐng)求特定的大小和訪問(wèn)模式斗幼。StorageClass:
雖然PersistentVolumeClaims允許用戶使用抽象存儲(chǔ)資源,但是用戶需要具有不同屬性(如性能)的PersistentVolumes抚垄,用于不同的問(wèn)題蜕窿。 群集管理員需要能夠提供多種不同于PersistentVolumes的PersistentVolumes,而不僅僅是大小和訪問(wèn)模式呆馁,而不會(huì)使用戶了解這些卷的實(shí)現(xiàn)細(xì)節(jié)桐经。 對(duì)于這些需求,存在StorageClass資源浙滤。
??StorageClass為管理員提供了一種描述他們提供的存儲(chǔ)的“類”的方法阴挣。 不同的類可能映射到服務(wù)質(zhì)量級(jí)別,或備份策略纺腊,或者由群集管理員確定的任意策略畔咧。 Kubernetes本身對(duì)于什么類別代表是不言而喻的。 這個(gè)概念有時(shí)在其他存儲(chǔ)系統(tǒng)中稱為“配置文件”
PV是集群中的資源揖膜。 PVC是對(duì)這些資源的請(qǐng)求誓沸,也是對(duì)資源的索賠檢查。 PV和PVC之間的相互作用遵循這個(gè)生命周期:
Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling
Provisioning
這里有兩種PV的提供方式: 靜態(tài)或者動(dòng)態(tài)
靜態(tài):集群管理員創(chuàng)建多個(gè)PV壹粟。它們包含真實(shí)存儲(chǔ)的詳細(xì)信息拜隧,可供用戶使用。它們存在于Kubernetes API中趁仙,可供使用虹蓄。
動(dòng)態(tài):當(dāng)管理員創(chuàng)建的靜態(tài)PV都不匹配用戶的PVC時(shí),集群可能會(huì)嘗試為PVC動(dòng)態(tài)配置volumn幸撕。此配置基于StorageClasses。要進(jìn)行動(dòng)態(tài)配置外臂,管理員必須創(chuàng)建和配置存儲(chǔ)類坐儿,并且PVC必須請(qǐng)求該存儲(chǔ)類。
就先寫(xiě)這么多宋光,to be continue...