成都網(wǎng)站建設(shè)服務(wù)全搜網(wǎng)
常用組件大白話說
如果想要官方的,詳細(xì)的信息,請(qǐng)看官方文檔。
https://kubernetes.io/zh-cn/docs/concepts/overview/components/
現(xiàn)在介紹一些核心的概念:
- etcd:存儲(chǔ)所有節(jié)點(diǎn)的信息,節(jié)點(diǎn)上部署的容器信息等都存在數(shù)據(jù)庫(kù),這是一個(gè)key-value的數(shù)據(jù)庫(kù),和redis差不多。
- api-server:k8s作為一個(gè)高級(jí)的容器管理平臺(tái),對(duì)每一個(gè)發(fā)來的請(qǐng)求都要進(jìn)行校驗(yàn),該請(qǐng)求是否被集群允許。刪除集群中的一個(gè)容器組,是否被允許。k8s默認(rèn)運(yùn)行后,6個(gè)組件每一個(gè)組件的請(qǐng)求,都要經(jīng)過api-server進(jìn)行校驗(yàn)。
- controller manager:具體部署容器到目標(biāo)節(jié)點(diǎn),使用的控制器。容器負(fù)載均衡部署,Deployment控制器就是其中之一。
- scheduler:運(yùn)維寫nginx.yaml(描述信息),預(yù)期部署3個(gè)nginx容器到k8s-node2節(jié)點(diǎn)上。將Pod調(diào)度到相應(yīng)的Node機(jī)器上。
- kubelet:管理目標(biāo)節(jié)點(diǎn)中Pod的進(jìn)程。
- kubectl:在master節(jié)點(diǎn)上敲打的命令。
- kube-proxy:在node節(jié)點(diǎn)中我們可以看到有kubectl和kube-proxy。kubectl用于和master的api-server通信決定容器創(chuàng)建時(shí)的信息獲取,信息更新。而kube-proxy則是pod要對(duì)外提供網(wǎng)絡(luò)訪問,底層基于iptables的規(guī)則轉(zhuǎn)發(fā)數(shù)據(jù)包,修改數(shù)據(jù)包。
我們來用一個(gè)例子來理解生動(dòng)的理解這些東西。
Kubernetes cluster成為硅谷集團(tuán),類似于騰訊集團(tuán),阿里集團(tuán)。
而Master集群就是硅谷集團(tuán)的總部(Controller Plane),負(fù)責(zé)決策的。節(jié)點(diǎn)集群就是硅谷集團(tuán)用來專門做事情的工廠(Node)。
每一個(gè)Node節(jié)點(diǎn)所擅長(zhǎng)的不一樣,比如有的Node內(nèi)存大,有的Node存儲(chǔ)空間大,有的Node在當(dāng)前的情況下網(wǎng)絡(luò)環(huán)境比較好等等。
加入說有一天,我準(zhǔn)備完成一個(gè)飛機(jī)項(xiàng)目,那么我的硅谷總部需要做一些決策,計(jì)劃的實(shí)施等,而飛機(jī)項(xiàng)目的具體實(shí)現(xiàn)就交給Node節(jié)點(diǎn)來做。我們首先需要一個(gè)決策者。決策者(c-m)負(fù)責(zé)這個(gè)項(xiàng)目的具體操作步驟,例如撰寫相關(guān)的實(shí)施方案和資料。當(dāng)然,我們撰寫了相關(guān)的實(shí)施方案和資料之后,需要交給一個(gè)人去管理這些資料,把這些資料存放在一個(gè)地方整理起來,因此我們需要一個(gè)資料庫(kù),etcd(這個(gè)就是鍵值對(duì)的數(shù)據(jù)庫(kù)而已)。而我的決策者可不能直接把資料給資料庫(kù),我們需要一個(gè)中間人,你看到過哪個(gè)領(lǐng)導(dǎo)沒有秘書的嗎,這也算是一種任務(wù)分工,一種解耦合。我們c-m需要把資料先給秘書部(API Server)。這個(gè)時(shí)候我的Controller Plane硅谷總部準(zhǔn)備過去看一下工廠的項(xiàng)目執(zhí)行進(jìn)度,或者做一些指導(dǎo),所以我們需要一個(gè)調(diào)度者(scheduler),當(dāng)然調(diào)度者做這一間事情也是通過秘書去做的。當(dāng)我要查看東廠的時(shí)候,一個(gè)廠(Node)里面一定是有一個(gè)門衛(wèi)(kube-proxy)的,一些非法人士是無法進(jìn)入我的工廠的,并且如果你假如要去西廠,但是你走錯(cuò)廠了,去了東廠,那么東廠的門衛(wèi)大爺就會(huì)對(duì)你進(jìn)行一些指導(dǎo),引導(dǎo)你去相應(yīng)的位置,引導(dǎo)你的網(wǎng)絡(luò)訪問。當(dāng)我去一個(gè)工廠視察的時(shí)候,我不可能逐一的詢問工廠里面的每一個(gè)員工,所以我們一定要有一個(gè)廠長(zhǎng)(kubulet),廠長(zhǎng)可以有決策權(quán)把這個(gè)廠停了,或者進(jìn)行只會(huì),Master里面也會(huì)有一個(gè)廠長(zhǎng)。廠長(zhǎng)對(duì)本工廠的健康情況等進(jìn)行一個(gè)匯總和匯報(bào)。我們知道,一個(gè)公司,例如阿里云,它不可能是孤身一人的,它一定是會(huì)有合作伙伴,或者是一些其他幫手的,也就是Master里面的c-c-m,我們可以理解成外聯(lián)部,外聯(lián)部提供一些其他的支持以及合作。外聯(lián)部就Cloud provider API了,為什么叫做云,云其實(shí)就是不是你自己的東西,你用的別人的東西,其實(shí)就是云。
了解了kubernetes的基本組件之后,我們來講述一下k8s組件的工作流程。
kubernetes組件的工作流程
我們先自定義一個(gè)需求背景:
創(chuàng)建一個(gè)無狀態(tài)的nginx引用,部署一個(gè)pod即可
流程如下:
-
在master節(jié)點(diǎn)寫yaml描述你對(duì)容器的運(yùn)行要求,創(chuàng)建pod的要求。install-pod.yaml
-
使用kubectl命令去創(chuàng)建,應(yīng)用這個(gè)資源描述文件,因此k8s組件交互發(fā)出請(qǐng)求,我要?jiǎng)?chuàng)建一個(gè)pod去運(yùn)行nginx了,那么請(qǐng)求應(yīng)該發(fā)給誰呢?
kubectl create -f install-nginx.yaml
這個(gè)請(qǐng)求發(fā)給api-server。
-
api-server此時(shí)會(huì)驗(yàn)證kubectl命令發(fā)來的請(qǐng)求是否被允許。利用本地https證書,這個(gè)證書是直接寫入Kubectl配置文件里面的,該請(qǐng)求被允許之后才會(huì)執(zhí)行。
-
api-server將nginx-pod創(chuàng)建的信息記錄到etcd數(shù)據(jù)庫(kù)中(數(shù)據(jù)庫(kù)記錄了一些信息,例如nginx鏡像版本,容器名,是否要端口暴露)。
-
api-server會(huì)通知下一個(gè)組件,調(diào)度器組件,scheduler準(zhǔn)備pod調(diào)度。
-
scheduler調(diào)度,會(huì)去etcd里面查詢,部署的pod信息到底是如何,然后判定出一個(gè)合適的node節(jié)點(diǎn)去部署pod(選擇了好了具體的機(jī)器,但是還沒有執(zhí)行)
-
scheduler調(diào)度器,會(huì)告訴api-server自己決定pod要部署到哪臺(tái)node節(jié)點(diǎn)上。
-
api-server會(huì)把這個(gè)信息再次寫入到etcd中,數(shù)據(jù)更新了(nginx本身的容器信息+綁定關(guān)系,部署到哪個(gè)機(jī)器上面)
-
此時(shí)api-server會(huì)通知遠(yuǎn)程的具體機(jī)器,比如k8s-node2上的工作進(jìn)程kubelet,去讀取etcd里面的信息,根據(jù)這些信息創(chuàng)建nginx鏡像,以及創(chuàng)建Pod(nginx容器)。
首先我們的運(yùn)行環(huán)境必須是容器運(yùn)行時(shí)的環(huán)境,例如Docker,因?yàn)槿萜骶哂懈綦x性。
我們的Master和Node之間的交互必須要通過api-server來進(jìn)行轉(zhuǎn)發(fā),包括Master內(nèi)部。kube-proxy是實(shí)現(xiàn)網(wǎng)絡(luò)轉(zhuǎn)發(fā)的,是實(shí)現(xiàn)負(fù)載均衡的一個(gè)重要器具。kubelet有權(quán)利讓Node里面如何做事情。
現(xiàn)在我們來進(jìn)行一些過程的描述。
假如我的的一個(gè)Node里面的應(yīng)用2直接崩了,那么我的kubelet廠長(zhǎng)會(huì)定時(shí)對(duì)Node里面的應(yīng)用進(jìn)行探測(cè),kubelet會(huì)隨時(shí)對(duì)工廠里面的流水線進(jìn)行探測(cè)。當(dāng)kubelet發(fā)現(xiàn)應(yīng)用二崩了,那么它就有權(quán)利直接把應(yīng)用2停了。如果我們的kubelet發(fā)現(xiàn)我們的當(dāng)前的Node已經(jīng)無法完成這個(gè)任務(wù)了的話,那么kubelet就會(huì)把這個(gè)情況直接發(fā)給api-server,api-server會(huì)轉(zhuǎn)發(fā)給決策者controller-manager,然后決策者就可以進(jìn)行決策了,決策者可以指定,那么這個(gè)任務(wù)我不搞了,或者給其他的廠去搞。然后把這個(gè)決策給api-server,api-server會(huì)把這個(gè)決策轉(zhuǎn)發(fā)到ETCD數(shù)據(jù)庫(kù)進(jìn)行保存。如果是交給其他的廠來搞的話,那么如何知道那些廠可以完成這個(gè)任務(wù)呢?這個(gè)時(shí)候api-server就會(huì)把這個(gè)任務(wù)發(fā)送給scheduler,scheduler得知這個(gè)任務(wù)之后,我們的scheduler決策者就會(huì)去輪詢的查找符合條件的節(jié)點(diǎn),然后選擇一個(gè)最佳的節(jié)點(diǎn),scheduler把它選擇的節(jié)點(diǎn)給api-server,然后api-server就把這一條記錄存放到ETCD數(shù)據(jù)庫(kù)里面了。
這次決策完成之后,kubelet和api-server會(huì)經(jīng)常“通電話”進(jìn)行聯(lián)系,如果要換廠的話,那么他們是可以知道這個(gè)信息的。知道了這個(gè)信息之后對(duì)應(yīng)的kubelet就會(huì)啟動(dòng)相應(yīng)的應(yīng)用。并且kubelet每過一段時(shí)間就要向api-server進(jìn)行匯報(bào)。就跟廠長(zhǎng)跟老板匯報(bào)工作一樣。
如果這個(gè)項(xiàng)目跑起來了,需要?jiǎng)e人訪問怎么辦?
kube-proxy是門衛(wèi)大爺,而且門衛(wèi)大爺都很喜歡相互打電話聯(lián)系,所以知道其他的情況。例如我的應(yīng)用1想要訪問應(yīng)用3的話,那么kube-proxy會(huì)告訴你所有的應(yīng)用三的地址。
門衛(wèi)大爺互相同步
所以kube-proxy是用來決定我的應(yīng)用去哪里訪問的,是負(fù)載均衡實(shí)現(xiàn)的源頭。