Kubernete

Kubernete導(dǎo)圖

Kubernete導(dǎo)圖.png

Kubernete簡介

建于 Docker 之上的 Kubernetes 可以構(gòu)建一個容器的調(diào)度服務(wù)柬泽,其目的是讓用戶透過Kubernetes集群來進行云端容器集群的管理会烙,而無需用戶進行復(fù)雜的設(shè)置工作。系統(tǒng)會自動選取合適的工作節(jié)點來執(zhí)行具體的容器集群調(diào)度處理工作眉厨。

Kubernetes架構(gòu)

Kubernetes架構(gòu).png

etcd

Kubernetes默認使用etcd作為集群整體存儲。etcd是一個簡單的、分布式的熟嫩、一致的key-value存儲宅此,主要被用來共享配置和服務(wù)發(fā)現(xiàn)机错。etcd提供了一個CRUD操作的REST API,以及提供了作為注冊的接口父腕,以監(jiān)控指定的Node弱匪。集群的所有狀態(tài)都存儲在etcd實例中,并具有監(jiān)控的能力璧亮,因此當etcd中的信息發(fā)生變化時萧诫,就能夠快速的通知集群中相關(guān)的組件。

Master Node

API Server (資源操作入口)

提供了資源對象的唯一操作入口枝嘶,其它所有組件都必須通過它提供的 API 來操作資源數(shù)據(jù)帘饶。只有 API Server 會與存儲通信,其它模塊都必須通過 API Server 訪問集群狀態(tài)群扶。 API Server 作為 Kubernetes 系統(tǒng)的入口及刻,封裝了核心對象的增刪改查操作镀裤。API Server 以 RESTFul 接口方式提供給外部客戶和內(nèi)部組件調(diào)用,API Server 再對相關(guān)的資源數(shù)據(jù)(全量查詢 + 變化監(jiān)聽)進行操作缴饭,以達到實時完成相關(guān)的業(yè)務(wù)功能暑劝。

Controller Manager (內(nèi)部管理控制中心)

Controller Manager 用于實現(xiàn) Kubernetes 集群故障檢測和恢復(fù)的自動化工作。Controller Manager 主要負責執(zhí)行以下各種控制器:

Scheduler (集群分發(fā)調(diào)度器)

scheduler組件為容器自動選擇運行的主機茴扁。依據(jù)請求資源的可用性铃岔,服務(wù)請求的質(zhì)量等約束條件,scheduler監(jiān)控未綁定的pod峭火,并將其綁定至特定的node節(jié)點毁习。Kubernetes也支持用戶自己提供的調(diào)度器,Scheduler負責根據(jù)調(diào)度策略自動將Pod部署到合適Node中卖丸,調(diào)度策略分為預(yù)選策略和優(yōu)選策略纺且,Pod的整個調(diào)度過程分為兩步:

  • 預(yù)選Node:遍歷集群中所有的Node,按照具體的預(yù)選策略篩選出符合要求的Node列表稍浆。如沒有Node符合預(yù)選策略規(guī)則载碌,該Pod就會被掛起,直到集群中出現(xiàn)符合要求的Node衅枫。

  • 優(yōu)選Node:預(yù)選Node列表的基礎(chǔ)上嫁艇,按照優(yōu)選策略為待選的Node進行打分和排序,從中獲取最優(yōu)Node弦撩。

Worker node

Kubelet

Kubelet是Kubernetes中最主要的控制器步咪,它是Pod和Node API的主要實現(xiàn)者,Kubelet負責驅(qū)動容器執(zhí)行層益楼。在Kubernetes中猾漫,應(yīng)用容器彼此是隔離的,并且與運行其的主機也是隔離的感凤,這是對應(yīng)用進行獨立解耦管理的關(guān)鍵點悯周。

Kubelet 在 Node 上做的主要工作具體如下:

  • 設(shè)置容器的環(huán)境變量、給容器綁定 Volume陪竿、給容器綁定 Port禽翼、根據(jù)指定的 Pod 運行一個單一容器、給指定的 Pod 創(chuàng)建 Network 容器族跛。
  • 同步 Pod 的狀態(tài)捐康,從 cAdvisor 獲取 Container Info、 Pod Info庸蔼、 Root Info解总、 Machine info。
  • 在容器中運行命令姐仅、殺死容器花枫、刪除 Pod 的所有容器刻盐。
kube proxy

基于一種公共訪問策略(例如:負載均衡),服務(wù)提供了一種訪問一群pod(集群中容器提供的應(yīng)用服務(wù))的途徑劳翰。此方式通過創(chuàng)建一個虛擬的IP來實現(xiàn)敦锌,客戶端能夠訪問此IP,并能夠?qū)⒎?wù)透明的代理至Pod佳簸。每一個Node都會運行一個kube-proxy乙墙,kube proxy通過iptables規(guī)則引導(dǎo)訪問至服務(wù)IP,并將重定向至正確的后端應(yīng)用生均,通過這種方式kube-proxy提供了一個高可用的負載均衡解決方案听想。

核心概念

Namespace&ResourceQuota

Namespace物理集群上的虛擬集群,用戶級別的資源限制

Namespace是對一組資源和對象的抽象集合,比如可以用來將系統(tǒng)內(nèi)部的對象劃分為不同的項目組或用戶組马胧。常見的pods, services, replication controllers和deployments等都是屬于某一個namespace的汉买,而node, persistentVolumes等則不屬于任何namespace。

資源配額(Resource Quotas)是用來限制用戶資源用量的一種機制佩脊。資源配額應(yīng)用在Namespace上蛙粘,并且每個Namespace最多只能有一個ResourceQuota對象,開啟計算資源配額后,創(chuàng)建容器時必須配置計算資源請求或限制威彰。并且用戶超額后禁止創(chuàng)建新的資源出牧。

資源配額的類型包括:計算資源(cpu和memory),存儲資源(存儲資源的總量以及指定storage class的總量)歇盼,對象數(shù)(可創(chuàng)建的對象的個數(shù))舔痕。

Lable& Selector

Label以key/value鍵值對的形式附加到任何對象上,如Pod旺遮,Service,Node盈咳,RC(ReplicationController)/RS(ReplicaSet)等耿眉。Label可以在創(chuàng)建對象時就附加到對象上,也可以在對象創(chuàng)建后通過API進行額外添加或修改鱼响。

我們通常使用metadata.labels字段鸣剪,來為對象添加Label。Label可以為多個丈积。一般來說筐骇,我們會給一個Pod(或其他對象)定義多個Label,以便于配置江滨,部署等管理工作铛纬。

帶有Label的對象創(chuàng)建好之后,我們就可以通過Label Selector來引用這些對象唬滑。

Kubernetes目前支持兩種類型的Label Selector:

  • 基于等式的Selector(Equality-based)

  • 基于集合的Selector(Set-based)[RC不支持]

Pod

一個pod相當于一個共享context的配置組告唆,在同一個context下棺弊,應(yīng)用可能還會有獨立的cgroup隔離機制,一個Pod是一個容器環(huán)境下的“邏輯主機”擒悬,它可能包含一個或者多個緊密相連的應(yīng)用模她,這些應(yīng)用可能是在同一個物理主機或虛擬機上。同一個Pod中的應(yīng)用可以共享磁盤懂牧,磁盤是Pod級的侈净。

Pod 的context可以理解成多個linux命名空間的聯(lián)合

  1. PID 命名空間(同一個Pod中應(yīng)用可以看到其它進程)

  2. 網(wǎng)絡(luò) 命名空間(同一個Pod的中的應(yīng)用對相同的IP地址和端口有權(quán)限)

  3. IPC 命名空間(同一個Pod中的應(yīng)用可以通過VPC或者POSIX進行通信)

  4. UTS 命名空間(同一個Pod中的應(yīng)用共享一個主機名稱)

和相互獨立的容器一樣,Pod是一種相對短暫的存在僧凤,而不是持久存在的畜侦,正如我們在Pod的生命周期中提到的,Pod被安排到結(jié)點上拼弃,并且保持在這個節(jié)點上直到被終止(根據(jù)重啟的設(shè)定)或者被刪除夏伊,當一個節(jié)點死掉之后,上面的所有Pod均會被刪除吻氧。

資源限制

Kubernetes通過cgroups限制容器的CPU和內(nèi)存等計算資源溺忧,包括requests(請求,調(diào)度器保證調(diào)度到資源充足的Node上)和limits(上限)

環(huán)境變量

環(huán)境變量為容器提供了一些重要的資源盯孙,包括容器和Pod的基本信息以及集群中服務(wù)的信息等鲁森。如hostName,Pod的名字振惰、命名空間歌溉、IP以及容器的計算資源限制等可以以Downward API的方式獲取并存儲到環(huán)境變量中。

Docker中程序的配置文件可以通過配置環(huán)境變量或者將配置文件掛載到宿主機上實現(xiàn)一個容器在不同的場景下使用不同的配置文件骑晶。Kubernetes中也已通過配置環(huán)境變量為Pod中容器傳遞參數(shù)痛垛。

Volume

為容器提供持久化存儲

健康檢查

為了確保容器在部署后確實處在正常運行狀態(tài),Kubernetes提供了兩種探針(Probe桶蛔,支持exec匙头、tcp和httpGet方式)來探測容器的狀態(tài):

  • LivenessProbe:探測應(yīng)用是否處于健康狀態(tài),如果不健康則刪除重建改容器

  • ReadinessProbe:探測應(yīng)用是否啟動完成并且處于正常服務(wù)狀態(tài)仔雷,如果不正常則更新容器的狀態(tài)

ImagePullPolicy
  • Always:不管鏡像是否存在都會進行一次拉取蹂析。

  • Never:不管鏡像是否存在都不會進行拉取

  • IfNotPresent:只有鏡像不存在時,才會進行鏡像拉取碟婆。

Capabilities

默認情況下电抚,容器都是以非特權(quán)容器的方式運行。比如竖共,不能在容器中創(chuàng)建虛擬網(wǎng)卡蝙叛、配置虛擬網(wǎng)絡(luò)。Kubernetes提供了修改Capabilities的機制公给。

Node

Node是Pod真正運行的主機甥温,可以物理機锻煌,也可以是虛擬機。為了管理Pod姻蚓,每個Node節(jié)點上至少要運行container runtime(比如docker或者rkt)宋梧、kubelet和kube-proxy服務(wù)。

Service

k8s的Service定義了一個服務(wù)的訪問入口地址(k8s分配給Service一個固定IP狰挡,這是一個虛擬IP)捂龄,前端的應(yīng)用通過這個入口地址訪問其背后的一組由Pod副本組成的集群實例,來自外部的訪問請求被負載均衡到后端的各個容器應(yīng)用上加叁。Service與其后端Pod副本集群之間則是通過Label Selector來實現(xiàn)對接的倦沧。而RC的作用相當于是保證Service的服務(wù)能力和服務(wù)質(zhì)量始終處于預(yù)期的標準。Service 定義可以基于 POST 方式它匕,請求 apiserver 創(chuàng)建新的實例展融。一個 Service 在 Kubernetes 中是一個 REST 對象。

Replication Controller

Replication Controller 保證了在所有時間內(nèi)豫柬,都有特定數(shù)量的Pod副本正在運行告希。一個RC通過模版來創(chuàng)建pod,這個是RC對象內(nèi)置的功能,RC 創(chuàng)建的的Pod 是可以相互替代和語義上相同的烧给。

ReplicaSet

ReplicaSet是下一代復(fù)本控制器燕偶。ReplicaSet和 Replication Controller之間的唯一區(qū)別是現(xiàn)在的選擇器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa)础嫡,但ReplicaSet還支持新的指么,基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa))。

Deployment

Deployment為Pod和Replica Set(下一代Replication Controller)提供聲明式更新榴鼎。你只需要在Deployment中描述你想要的目標狀態(tài)是什么伯诬,Deployment controller就會幫你將Pod和Replica Set的實際狀態(tài)改變到你的目標狀態(tài)。你可以定義一個全新的Deployment巫财,也可以創(chuàng)建一個新的替換舊的Deployment盗似。

一個典型的用例如下:

  1. 使用Deployment來創(chuàng)建ReplicaSet。ReplicaSet在后臺創(chuàng)建pod翁涤。檢查啟動狀態(tài)桥言,看它是成功還是失敗萌踱。

  2. 然后葵礼,通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態(tài)。這會創(chuàng)建一個新的ReplicaSet并鸵,Deployment會按照控制的速率將pod從舊的ReplicaSet移動到新的ReplicaSet中鸳粉。

  3. 如果當前狀態(tài)不穩(wěn)定,回滾到之前的Deployment revision园担。每次回滾都會更新Deployment的revision届谈。

  4. 擴容Deployment以滿足更高的負載枯夜。

  5. 暫停Deployment來應(yīng)用PodTemplateSpec的多個修復(fù),然后恢復(fù)上線艰山。

  6. 根據(jù)Deployment 的狀態(tài)判斷上線是否hang住了湖雹。

  7. 清除舊的不必要的ReplicaSet。

Volumes

Volumes:在Kubernetes中曙搬,當Pod重建的時候摔吏,數(shù)據(jù)是會丟失的,Kubernetes也是通過數(shù)據(jù)卷掛載來提供Pod數(shù)據(jù)的持久化的纵装。Kubernetes數(shù)據(jù)卷是對Docker數(shù)據(jù)卷的擴展征讲,是Pod級別的,可以用來實現(xiàn)Pod中容器的文件共享橡娄。

Kubernete 支持的volume類型:

  • 本地數(shù)據(jù)卷: emptyDir诗箍, hostPath

  • 網(wǎng)絡(luò)數(shù)據(jù)卷: NFS、iSCISI挽唉、GlusterFS滤祖、RBD(Ceph Block Device)、Flocker橱夭、AWS Elastic Block Store氨距、GCE Persistent Disk

  • Persistent Volume和Persistent Volume Claim**

  • 信息數(shù)據(jù)卷: Secret, Downward API棘劣, Git Repo

StatefulSet

RC俏让、Deployment、DaemonSet都是面向無狀態(tài)的服務(wù)茬暇,它們所管理的Pod的IP首昔、名字,啟停順序等都是隨機的糙俗,而StatefulSet是什么勒奇?顧名思義,有狀態(tài)的集合巧骚,管理所有有狀態(tài)的服務(wù)赊颠,比如MySQL、MongoDB集群等劈彪。 StatefulSet本質(zhì)上是Deployment的一種變體竣蹦,在v1.9版本中已成為GA版本,它為了解決有狀態(tài)服務(wù)的問題沧奴,它所管理的Pod擁有固定的Pod名稱痘括,啟停順序,在StatefulSet中,Pod名字稱為網(wǎng)絡(luò)標識(hostname)纲菌,還必須要用到共享存儲挠日。 在Deployment中,與之對應(yīng)的服務(wù)是service翰舌,而在StatefulSet中與之對應(yīng)的headless service嚣潜,headless service,即無頭服務(wù)椅贱,與service的區(qū)別就是它沒有Cluster IP郑原,解析它的名稱時將返回該Headless Service對應(yīng)的全部Pod的Endpoint列表。 ? 除此之外夜涕,StatefulSet在Headless Service的基礎(chǔ)上又為StatefulSet控制的每個Pod副本創(chuàng)建了一個DNS域名犯犁,這個域名的格式為:

  • $(podname).(headless server name)

  • FQDN: $(podname).(headless server name).namespace.svc.cluster.loca

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市女器,隨后出現(xiàn)的幾起案子酸役,更是在濱河造成了極大的恐慌,老刑警劉巖驾胆,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣澡,死亡現(xiàn)場離奇詭異,居然都是意外死亡丧诺,警方通過查閱死者的電腦和手機入桂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驳阎,“玉大人抗愁,你說我怎么就攤上這事『峭恚” “怎么了蜘腌?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饵隙。 經(jīng)常有香客問我撮珠,道長,這世上最難降的妖魔是什么金矛? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任芯急,我火速辦了婚禮,結(jié)果婚禮上驶俊,老公的妹妹穿的比我還像新娘娶耍。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慈迈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奈应。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天购披,我揣著相機與錄音杖挣,去河邊找鬼。 笑死刚陡,一個胖子當著我的面吹牛惩妇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筐乳,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歌殃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝙云?” 一聲冷哼從身側(cè)響起氓皱,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勃刨,沒想到半個月后波材,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡身隐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年廷区,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贾铝。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡隙轻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垢揩,到底是詐尸還是另有隱情大脉,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布水孩,位于F島的核電站镰矿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俘种。R本人自食惡果不足惜秤标,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宙刘。 院中可真熱鬧苍姜,春花似錦、人聲如沸悬包。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至垫释,卻和暖如春丝格,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棵譬。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工显蝌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人订咸。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓曼尊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脏嚷。 傳聞我的和親對象是個殘疾皇子骆撇,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354