k8s詳解教程----零基礎(chǔ)快速入門(mén)
前言:
Kubernetes(k8s)作為云原生的核心平臺(tái),吸引了越來(lái)越多的運(yùn)維、開(kāi)發(fā)、測(cè)試以及其他技術(shù)員去了解學(xué)習(xí)。隨著行業(yè)越來(lái)越內(nèi)卷,k8s已經(jīng)被廣泛使用,作為一名運(yùn)維人員,k8s將成為一個(gè)必須掌握的技術(shù)點(diǎn),同時(shí),我們也可以依靠它跳槽漲薪。
一、什么是K8s
它前生是谷歌的Borg系統(tǒng),后經(jīng)過(guò)Go語(yǔ)言重寫(xiě),在2014 年開(kāi)源了 Kubernetes 項(xiàng)目,并捐獻(xiàn)給CNCF 基金會(huì)開(kāi)源,即Kubernetes,之所以簡(jiǎn)稱k8s,因?yàn)?Kubernetes 中間有 8個(gè)字母。
K8s是一個(gè)可移植的、用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用的開(kāi)源容器編排技術(shù)。
K8s使部署和管理微服務(wù)架構(gòu)應(yīng)用程序變得很簡(jiǎn)單。它通過(guò)在集群之上形成一個(gè)抽象層來(lái)實(shí)現(xiàn)這一點(diǎn),允許開(kāi)發(fā)團(tuán)隊(duì)平滑地部署應(yīng)用程序,而 K8s主要處理以下任務(wù):
- 控制和管理應(yīng)用程序?qū)Y源的使用
- 自動(dòng)負(fù)載均衡應(yīng)用程序的多個(gè)實(shí)例之間請(qǐng)求
- 監(jiān)控資源使用和資源限制,為了可以自動(dòng)阻止應(yīng)用消耗過(guò)多的資源并且可以再次恢復(fù)它們
- 如果主機(jī)資源耗盡或主機(jī)死機(jī),將應(yīng)用程序?qū)嵗龔囊慌_(tái)主機(jī)遷移到另一臺(tái)主機(jī)是一個(gè)可行的選項(xiàng)
- 當(dāng)有新的主機(jī)加入集群時(shí),新增加的額外資源可以被自動(dòng)使用
二、K8s為何被廣泛應(yīng)用
為什么現(xiàn)在有很多企業(yè)依賴K8s來(lái)滿足他們的容器編排需求? 因?yàn)閗8s在Docker技術(shù)的基礎(chǔ)上,為容器化的應(yīng)用提供部署運(yùn)行、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等一系列完整功能,提高了大規(guī)模容器集群管理的便捷性。同時(shí)Kubernetes是一個(gè)完備的分布式系統(tǒng)支撐平臺(tái),具有完備的集群管理能力,多擴(kuò)多層次的安全防護(hù)和準(zhǔn)入機(jī)制、多租戶應(yīng)用支撐能力、透明的服務(wù)注冊(cè)和發(fā)現(xiàn)機(jī)制、內(nèi)建智能負(fù)載均衡器、強(qiáng)大的故障發(fā)現(xiàn)和自我修復(fù)能力、服務(wù)滾動(dòng)升級(jí)和在線擴(kuò)容能力、可擴(kuò)展的資源自動(dòng)調(diào)度機(jī)制以及多粒度的資源配額管理能力。同時(shí)Kubernetes提供完善的管理工具,涵蓋了包括開(kāi)發(fā)、部署測(cè)試、運(yùn)維監(jiān)控在內(nèi)的各個(gè)環(huán)節(jié)。概括為:
- 可移植性和靈活性: K8s有很強(qiáng)的兼容性,因?yàn)樗梢栽诟鞣N基礎(chǔ)設(shè)施和環(huán)境設(shè)置下運(yùn)行。大多數(shù)其他編排器沒(méi)有這種靈活性。
- 開(kāi)源: CNCF負(fù)責(zé)管理K8s,這是一個(gè)完全開(kāi)源、由社區(qū)驅(qū)動(dòng)的項(xiàng)目。它有許多重要的企業(yè)贊助商,但沒(méi)有一家公司能“控制”這個(gè)平臺(tái)或者控制它的發(fā)展方向。
- 多云兼容性: K8s不但可以將工作負(fù)載托管在單個(gè)云上,而且可以將工作負(fù)載分布在多個(gè)云上。 K8s也能輕松地將其環(huán)境從一個(gè)云擴(kuò)展到另一個(gè)云。雖然其它編排器也能支持多云架構(gòu),但K8s在多云兼容性性方面可以完全超越它們。
- 市場(chǎng)領(lǐng)導(dǎo)者: 大部分公司都在使用K8s,根據(jù)紅帽公司的一項(xiàng)調(diào)查,K8s被客戶廣泛使用 (88%),尤其在生產(chǎn)環(huán)境中(74%)。
三、K8s架構(gòu)
K8s是一個(gè)架構(gòu)良好的分布式系統(tǒng)的例子,它將集群中的所有機(jī)器都視為單個(gè)資源池的一部分。K8s與其他成熟的分布式系統(tǒng)一樣,主要是由控制節(jié)點(diǎn)(master)、工作節(jié)點(diǎn)(node)構(gòu)成,每個(gè)節(jié)點(diǎn)上都會(huì)安裝不同的組件。
3.1、控制節(jié)點(diǎn)Master
K8S中的Master是集群控制節(jié)點(diǎn),負(fù)責(zé)整個(gè)集群的管理和控制
- ApiServer : 資源操作的唯一入口,接收用戶輸入的命令,提供認(rèn)證、授權(quán)、API注冊(cè)和發(fā)現(xiàn)等機(jī)制,其他模塊通過(guò)API Server查詢或修改數(shù)據(jù),只有API Server才直接和etcd進(jìn)行交互;
- Scheduler : 負(fù)責(zé)集群資源調(diào)度,通過(guò)API Server的Watch接口監(jiān)聽(tīng)新建Pod副本信息,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的node節(jié)點(diǎn)上;
- ControllerManager : K8S里所有資源對(duì)象的自動(dòng)化控制中心,通過(guò) api-server 提供的 restful 接口實(shí)時(shí)監(jiān)控集群內(nèi)每個(gè)資源對(duì)象的狀態(tài),發(fā)生故障時(shí),導(dǎo)致資源對(duì)象的工作狀態(tài)發(fā)生變化,就進(jìn)行干預(yù),嘗試將資源對(duì)象從當(dāng)前狀態(tài)恢復(fù)為預(yù)期的工作狀態(tài),常見(jiàn)的 controller 有 Namespace Controller、Node Controller、Service Controller、ServiceAccount Controller、Token Controller、ResourceQuote Controller、Replication Controller等;
- Etcd : 是Kubernetes的存儲(chǔ)狀態(tài)的數(shù)據(jù)庫(kù)(所有master的持續(xù)狀態(tài)都存在etcd的一個(gè)實(shí)例中)
3.2、工作節(jié)點(diǎn)Node
Node是K8S集群中的工作負(fù)載節(jié)點(diǎn),每個(gè)Node都會(huì)被Master分配一些工作負(fù)載,當(dāng)某個(gè)Node宕機(jī)時(shí),其上的工作負(fù)載會(huì)被Master自動(dòng)轉(zhuǎn)移到其他節(jié)點(diǎn)上
- Kubelet : 負(fù)責(zé)維護(hù)容器的生命周期,即通過(guò)控制docker,控制Pod 的創(chuàng)建、啟動(dòng)、監(jiān)控、重啟、銷毀等工作,處理Master節(jié)點(diǎn)下發(fā)到本節(jié)點(diǎn)的任務(wù);
- KubeProxy : 負(fù)責(zé)制定數(shù)據(jù)包的轉(zhuǎn)發(fā)策略,并以守護(hù)進(jìn)程的模式對(duì)各個(gè)節(jié)點(diǎn)的pod信息實(shí)時(shí)監(jiān)控并更新轉(zhuǎn)發(fā)規(guī)則,service收到請(qǐng)求后會(huì)根據(jù)kube-proxy制定好的策略來(lái)進(jìn)行請(qǐng)求的轉(zhuǎn)發(fā),從而實(shí)現(xiàn)負(fù)載均衡,總的來(lái)說(shuō),負(fù)責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡;
- Docker : 負(fù)責(zé)節(jié)點(diǎn)上容器的各種操作;
3.3、其他組件
學(xué)習(xí)kubernetes的核心,就是學(xué)習(xí)如何對(duì)集群上的Pod、Pod控制器、Service、存儲(chǔ)等各種資源進(jìn)行操作
- Pod: kubernetes的最小控制單元,容器都是運(yùn)行在pod中的,一個(gè)pod中可以有1個(gè)或者多個(gè)容器
- Controller: 控制器,通過(guò)它來(lái)實(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)簽
- NameSpace: 命名空間,用來(lái)隔離pod的運(yùn)行環(huán)境
kubernetes在集群?jiǎn)?dòng)之后,會(huì)默認(rèn)創(chuàng)建幾個(gè)namespace:default、kube-node-lease、kube-public、kube-system。默認(rèn)情況下,kubernetes集群中的所有的Pod都是可以相互訪問(wèn)的,但是在實(shí)際中,可能不想讓兩個(gè)Pod之間進(jìn)行互相的訪問(wèn),那此時(shí)就可以將兩個(gè)Pod劃分到不同的namespace下。kubernetes通過(guò)將集群內(nèi)部的資源分配到不同的Namespace中,可以形成邏輯上的"組",以方便不同的組的資源進(jìn)行隔離使用和管理。
四、部署實(shí)例
4.1、nginx服務(wù)部署
為了方便理解,我們部署一個(gè)nginx服務(wù)來(lái)說(shuō)明kubernetes系統(tǒng)各個(gè)組件調(diào)用關(guān)系:
首先要了解,一旦kubernetes環(huán)境啟動(dòng)之后,master和node都會(huì)將自身的信息存儲(chǔ)到etcd數(shù)據(jù)庫(kù)中。
一個(gè)nginx服務(wù)的安裝請(qǐng)求會(huì)首先被發(fā)送到master節(jié)點(diǎn)的apiServer組件,apiServer組件會(huì)調(diào)用scheduler組件來(lái)決定到底應(yīng)該把這個(gè)服務(wù)安裝到哪個(gè)node節(jié)點(diǎn)上。在此時(shí),它會(huì)從etcd中讀取各個(gè)node節(jié)點(diǎn)的信息,然后按照一定的算法進(jìn)行選擇,并將結(jié)果告知apiServer,apiServer調(diào)用controller-manager去調(diào)度Node節(jié)點(diǎn)安裝nginx服務(wù),kubelet接收到指令后,會(huì)通知docker,然后由docker來(lái)啟動(dòng)一個(gè)nginx的pod。pod是kubernetes的最小操作單元,容器必須跑在pod中。至此,一個(gè)nginx服務(wù)就運(yùn)行了,如果需要訪問(wèn)nginx,就需要通過(guò)kube-proxy來(lái)對(duì)pod產(chǎn)生訪問(wèn)的代理,這樣,外界用戶就可以訪問(wèn)集群中的nginx服務(wù)了。
4.2、Pod創(chuàng)建流程
1、客戶端提交創(chuàng)建請(qǐng)求,可以通過(guò)API Server的Restful API,也可以使用kubectl命令行工具。支持的數(shù)據(jù)類型包括JSON和YAML。
2、API Server處理用戶請(qǐng)求,存儲(chǔ)Pod數(shù)據(jù)到etcd。
3、調(diào)度器通過(guò)API Server查看未綁定的Pod。嘗試為Pod分配主機(jī)。
4、過(guò)濾主機(jī) (調(diào)度預(yù)選):調(diào)度器用一組規(guī)則過(guò)濾掉不符合要求的主機(jī)。比如Pod指定了所需要的資源量,那么可用資源比Pod需要的資源量少的主機(jī)會(huì)被過(guò)濾掉。
5、主機(jī)打分(調(diào)度優(yōu)選):對(duì)第一步篩選出的符合要求的主機(jī)進(jìn)行打分,在主機(jī)打分階段,調(diào)度器會(huì)考慮一些整體優(yōu)化策略,比如把容一個(gè)Replication Controller的副本分布到不同的主機(jī)上,使用最低負(fù)載的主機(jī)等。
6、選擇主機(jī):選擇打分最高的主機(jī),進(jìn)行binding操作,結(jié)果存儲(chǔ)到etcd中。
7、kubelet根據(jù)調(diào)度結(jié)果執(zhí)行Pod創(chuàng)建操作: 綁定成功后,scheduler會(huì)調(diào)用APIServer的API在etcd中創(chuàng)建一個(gè)boundpod對(duì)象,描述在一個(gè)工作節(jié)點(diǎn)上綁定運(yùn)行的所有pod信息。運(yùn)行在每個(gè)工作節(jié)點(diǎn)上的kubelet也會(huì)定期與etcd同步boundpod信息,一旦發(fā)現(xiàn)應(yīng)該在該工作節(jié)點(diǎn)上運(yùn)行的boundpod對(duì)象沒(méi)有更新,則調(diào)用Docker API創(chuàng)建并啟動(dòng)pod內(nèi)的容器。
在整個(gè)生命周期中,Pod會(huì)出現(xiàn)5種狀態(tài)(相位),分別如下:
- 掛起(Pending): apiserver已經(jīng)創(chuàng)建了pod資源對(duì)象,但它尚未被調(diào)度完成或者仍處于下載鏡像的過(guò)程中
- 運(yùn)行中(Running): pod已經(jīng)被調(diào)度至某節(jié)點(diǎn),并且所有容器都已經(jīng)被kubelet創(chuàng)建完成
- 成功(Succeeded): pod中的所有容器都已經(jīng)成功終止并且不會(huì)被重啟
- 失敗(Failed): 所有容器都已經(jīng)終止,但至少有一個(gè)容器終止失敗,即容器返回了非0值的退出狀態(tài)
- 未知(Unknown): apiserver無(wú)法正常獲取到pod對(duì)象的狀態(tài)信息,通常由網(wǎng)絡(luò)通信失敗所導(dǎo)致
五、K8s常用命令
kubectl 命令的語(yǔ)法如下:
kubectl [command] [TYPE] [NAME] [flags]
kubectl命令中,指定執(zhí)行什么操作(command,如create,delete,describe ,get ,apply 等)指定什么類型資源對(duì)象(type)指定此類型的資源對(duì)象名稱(name)指定可選參數(shù)(flags)
查看pod,nodee,service,endpoints,secret等信息
kubectl get 組件名 #例如kubectl get pod
查看資源狀態(tài),比如有一組deployment內(nèi)的pod沒(méi)起來(lái),一般用于pod調(diào)度過(guò)程出現(xiàn)的問(wèn)題排查
kubectl describe pod pod名 #先用kubectl get pod查看
查看node節(jié)點(diǎn)或者是pod資源(cpu,內(nèi)存資源)使用情況
kubectl top 組件名 #例如kubectl top node kubectl top pod
進(jìn)入pod內(nèi)部
kubectl exec -ti pod名 /bin/bash #先用kubectl get pod查看
刪除pod
kubectl delete pod -n
查看集群健康狀態(tài)
kubectl get cs
基于 pod.yaml 定義的名稱刪除指定資源
kubectl delete -f pod.yaml
查看容器的日志
kubectl logs -f <pod-name> # 實(shí)時(shí)查看日志
創(chuàng)建資源文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-777236.html
kubectl apply -f ./my-manifest.yaml
六、總結(jié)
K8S概念很是復(fù)雜,這里先簡(jiǎn)單的介紹下k8s基礎(chǔ)概念,后續(xù)接著更新k8s部署,已及更深層次的介紹k8s。以上涉及的概念以及知識(shí)點(diǎn)搞清楚后,如果在面試中被問(wèn)到,相信也可以幫到大家。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-777236.html
到了這里,關(guān)于k8s教程----零基礎(chǔ)快速入門(mén)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!