英文鏈接:https://en.wikipedia.org/wiki/Kubernetes
Kubernetes(通常寫(xiě)成“k8s”)是最開(kāi)始由google設(shè)計(jì)開(kāi)發(fā)最后貢獻(xiàn)給Cloud Native Computing
Foundation的開(kāi)源容器集群管理項(xiàng)目芦岂。它的設(shè)計(jì)目標(biāo)是在主機(jī)集群之間提供一個(gè)能夠自動(dòng)化部署至扰、可拓展、應(yīng)用容器可運(yùn)營(yíng)的平臺(tái)。Kubernetes通常結(jié)合docker容器工具工作工禾,并且整合多個(gè)運(yùn)行著docker容器的主機(jī)集群。
Kubernetes( 來(lái)自希臘語(yǔ)κυβερν?τη?:更扁,意思為 “操舵員” 或者 “飛行員”)由Joe Beda, Brendan Burns 和Craig McLuckie建立翰铡,并在2014年被google公司首次對(duì)外公布。它的發(fā)展和設(shè)計(jì)受到google的Borg系統(tǒng)的嚴(yán)重影響妨退。Kubernetes項(xiàng)目的許多主要貢獻(xiàn)者來(lái)自Borg項(xiàng)目妇萄。在Google內(nèi)部Kubernetes最開(kāi)始的名字叫Serven of Nine,引用了電影“星際迷航”中通常被認(rèn)為“更加友好”的“博格人”這個(gè)角色咬荷。由于google律師的反對(duì)冠句,它的名字被重命名為Kubernetes。從Kubernetes的logo上面那車(chē)輪上的七個(gè)幅條就能在一定程度上推斷出Kubernets最開(kāi)始的名字是什么幸乒。
2015年七月21日Kubernetes發(fā)布了v1.0版本懦底。隨著Kubernetes v1.0版本的發(fā)布,Google和Linux基金會(huì)合作成立Cloud
Native Computing Foundation(CNCF)并提議使Kubernetes成為種子技術(shù)罕扎。
Kubernetes還被RedHat使用于OpenShift產(chǎn)品聚唐。
Kubernetes定義了一套堆積木,這些堆積木統(tǒng)一提供部署腔召、維護(hù)和擴(kuò)展應(yīng)用的機(jī)制杆查。構(gòu)成Kubernetes的這些組件讓Kubernetes變得一個(gè)松耦合可延伸的,因此它能滿足各種不同的工作負(fù)載臀蛛。Kubernetes的延展性在很大程度上是由Kubernetes的API提供的亲桦,這些API被運(yùn)行在Kubernetes的內(nèi)部組件、延伸組件和容器使用掺栅。
Kubernetes中的基本調(diào)度單位叫“pod”烙肺。它增加了更高層的抽象來(lái)容納各種組件。一個(gè)pod由一個(gè)或者多個(gè)容器組成氧卧,這些容器能夠部署在同一臺(tái)物理主機(jī)上面桃笙,并能夠共享資源。Kubernetes中集群內(nèi)部的每一個(gè)pod被指定了唯一的IP地址沙绝,用戶程序可以通過(guò)相應(yīng)的端口號(hào)無(wú)沖突地連接各個(gè)pod搏明。pod能夠定義一個(gè)卷(volume),比如一個(gè)本地磁盤(pán)目錄或者一個(gè)網(wǎng)絡(luò)磁盤(pán)闪檬,然后把它暴露給pod中的容器星著。用戶可以通過(guò)Kubernetes API手動(dòng)管理pod,或者把管理工作交給一個(gè)管理器粗悯。
Kubernetes可以讓客戶端(用戶或者內(nèi)部組件)把被稱(chēng)之為標(biāo)簽的鍵值對(duì)依附在系統(tǒng)的任何API對(duì)象上虚循,比如pods和“nodes”。相應(yīng)地,”標(biāo)簽選擇器”是針對(duì)標(biāo)簽的查詢横缔,這些標(biāo)簽用于解決匹配對(duì)象問(wèn)題铺遂。
標(biāo)簽和選擇器是Kubernetes中的主要分組機(jī)制,用來(lái)決定哪個(gè)操作應(yīng)用于哪個(gè)組件茎刚。
比如襟锐,如果一個(gè)應(yīng)用的pod有一個(gè)系統(tǒng)標(biāo)簽為:tier (“front-end“, “back-end“,) 和 release_track (“canary“, “production“), 然后所有 “back-end” 和”canary“節(jié)點(diǎn) 上的操作都可以使用如下所示的標(biāo)簽選擇器:
tier=back-end AND release_track=canary
一個(gè)控制器是一個(gè)調(diào)節(jié)回路膛锭,通過(guò)管理一系列pod來(lái)驅(qū)動(dòng)實(shí)際的集群狀態(tài)變成所需的集群狀態(tài)粮坞。一種控制器叫”復(fù)制控制器“,通過(guò)運(yùn)行指定數(shù)目的跨集群的pod副本來(lái)進(jìn)行復(fù)制和擴(kuò)展操作初狰。如果底層的節(jié)點(diǎn)失敗了莫杈,它還能處理和創(chuàng)建用于替換的pod。其他的控制器是核心Kubernetes系統(tǒng)的一部分奢入,包括一個(gè)運(yùn)行在所有機(jī)器(或者所有機(jī)器的一些子集)但恰好一個(gè)pod上的”DaemonSet“控制器姓迅,以及一個(gè)運(yùn)行pod直到結(jié)束的”Job“控制器(比如,作為批作業(yè)的一部分)俊马。控制器所管理的那一系列pod由定義在控制器里的部分標(biāo)簽選擇器決定肩杈。
一個(gè)Kubernetes服務(wù)是一系列工作在一起的pod柴我,比如多層應(yīng)用中其中的一層。這一系列pod構(gòu)成了由標(biāo)簽選擇器所定義的一個(gè)服務(wù)扩然。Kubernetes提供了服務(wù)發(fā)現(xiàn)和請(qǐng)求路由的功能艘儒。請(qǐng)求路由是通過(guò)分配固定IP地址和DNS名字給服務(wù)。默認(rèn)的夫偶,一個(gè)服務(wù)會(huì)在一個(gè)集群內(nèi)暴露(比如界睁,后臺(tái)的pod會(huì)被分到一個(gè)服務(wù)中,來(lái)自前端的pods負(fù)載平衡他們之間的請(qǐng)求)兵拢,但是翻斟,它也可以在一個(gè)集群外暴露(比如,為客戶端訪問(wèn)前端的pod)说铃。
Kubernetes采用了主從架構(gòu)访惜。Kubernetes的組件可以被分為那些管理單個(gè)節(jié)點(diǎn)和那些控制平面(control plane)的部分。
Kubernetes的master主要是在不同系統(tǒng)之間負(fù)責(zé)管理工作負(fù)載和指導(dǎo)通信的控制單元腻扇。Kubernetes的控制平面由不同的組件組成债热,它們自己的進(jìn)程可以運(yùn)行在一個(gè)單獨(dú)的master節(jié)點(diǎn)上,或者運(yùn)行在由多個(gè)master所支持的高可用集群中幼苛。Kubernetes控制平面的不同組件如下所示:
etcd
etcd 是一個(gè)由CoreOS開(kāi)發(fā)的輕量級(jí)的窒篱、分布式的key-value數(shù)據(jù)存儲(chǔ)器。它能夠可靠地存儲(chǔ)集群的配置數(shù)據(jù)和展現(xiàn)整個(gè)集群在某一時(shí)間點(diǎn)的狀態(tài)。其他的組件監(jiān)視著這個(gè)存儲(chǔ)器的變化情況以便更新所需的狀態(tài)墙杯。
API server
API Server是一個(gè)關(guān)鍵組件配并,它在HTTP協(xié)議上使用JSON為Kubernetes對(duì)內(nèi)外提供kubernetes
API服務(wù)。API server處理和驗(yàn)證REST請(qǐng)求和更新etcd中API對(duì)象的狀態(tài)霍转,因此荐绝,這使得客戶端能夠在各個(gè)worker節(jié)點(diǎn)上配置工作負(fù)載和容器。
Scheduler
Scheduler是一個(gè)可插拔的組件避消,它能夠根據(jù)資源的可用性決定一個(gè)還沒(méi)被調(diào)度的pod應(yīng)該運(yùn)行在哪個(gè)節(jié)點(diǎn)上面低滩。Scheduler追蹤每個(gè)節(jié)點(diǎn)的資源使用情況,確保將調(diào)度的資源不超出剩下可用的資源岩喷。為了達(dá)到這個(gè)目的恕沫,scheduler必須知道可用資源的情況和在各個(gè)服務(wù)器上已經(jīng)分配的資源情況。
Controller manager
controller manager是核心Kubernetes控制器(比如DaemonSet控制器纱意、復(fù)制控制器)所運(yùn)行的進(jìn)程婶溯。這些控制器跟API服務(wù)器通信來(lái)創(chuàng)建、更新和刪除它們所管理的資源(pod偷霉、service端點(diǎn)等等)
Kubernetes node
節(jié)點(diǎn)(Node)(也叫worker或者minion)是部署著容器的單個(gè)機(jī)器(或者虛擬機(jī))迄委。集群中的每一個(gè)節(jié)點(diǎn)必須運(yùn)行著容器運(yùn)行時(shí)(runtime)(比如Docker)以及下面所提到的組件,用來(lái)和master通信以便讓這些容器進(jìn)行網(wǎng)絡(luò)配置
Kubelet
Kubelet負(fù)責(zé)每個(gè)節(jié)點(diǎn)的運(yùn)行狀態(tài)类少,也就是說(shuō)確保節(jié)點(diǎn)中的所有容器正常運(yùn)行叙身。它會(huì)按照控制平面(plane)的指示啟動(dòng)、停止和維護(hù)容器(組織成pods)硫狞。
Kubelet監(jiān)視一個(gè)pod的狀態(tài)信轿,如果沒(méi)有看到想要的狀態(tài),那么這個(gè)pod會(huì)被重新部署到同一個(gè)節(jié)點(diǎn)上残吩。節(jié)點(diǎn)的狀態(tài)依賴(lài)于每幾秒所發(fā)送給master的心跳信息财忽。當(dāng)master偵測(cè)到一個(gè)節(jié)點(diǎn)失敗了,復(fù)制控制(Replication Controller)就會(huì)知道這個(gè)狀態(tài)改變了泣侮,然后會(huì)在另一個(gè)正常的節(jié)點(diǎn)上啟動(dòng)相應(yīng)的pod即彪。
Kube-proxy
kube-proxy是網(wǎng)絡(luò)代理和負(fù)載均衡的實(shí)現(xiàn)。它和其他的網(wǎng)絡(luò)操作提供了服務(wù)抽象旁瘫。它負(fù)責(zé)根據(jù)ip地址和端口號(hào)來(lái)路由外部請(qǐng)求到相應(yīng)的容器祖凫。
cAdvisor
cAdvisor是監(jiān)聽(tīng)和收集資源使用情況和性能指標(biāo)(比如每個(gè)節(jié)點(diǎn)中容器的CPU、內(nèi)存和網(wǎng)絡(luò)使用情況)的代理者酬凳。
“First GitHub commit for Kubernetes”.github.com. 2014-06-07.
Jump up^ “GitHub Releases page”.github.com. 2016-10-16.
Jump up^ “What is Kubernetes”.Kubernetes. Retrieved 28 August 2015.
Jump up^ “Google Made Its Secret Blueprint
? ? Public to Boost Its Cloud”. Retrieved 2016-06-27.
Jump up^ “Google Open Sources Its Secret Weapon in Cloud
? ? Computing”.Wired.? ? Retrieved 24 September 2015.
Jump up^ Abhishek Verma; Luis Pedrosa; Madhukar R.
? ? Korupolu; David Oppenheimer; Eric Tune; John Wilkes (April 21–24, 2015). “Large-scale cluster management at
? ? Google with Borg”.Proceedings
? ? of the European Conference on Computer Systems (EuroSys).
Jump up^ “Borg, Omega, and Kubernetes - ACM Queue”.queue.acm.org. Retrieved 2016-06-27.
Jump up^ “Early Stage Startup Heptio Aims to
? ? Make Kubernetes Friendly”. Retrieved 2016-12-06.
Jump up^ “As Kubernetes Hits 1.0, Google
? ? Donates Technology To Newly Formed Cloud Native Computing Foundation”.TechCrunch. Retrieved 24 September 2015.
Jump up^ “Cloud
? ? Native Computing Foundation”.
^ Jump up to:*a* *b* *c* *d* *e* *f* *g* *h* *i* “An Introduction to Kubernetes”.DigitalOcean. Retrieved 24 September? ? 2015.
^ Jump up to:*a* *b* Langemak, Jon (2015-02-11). “Kubernetes 101 – Networking”.Das Blinken Lichten. Retrieved? ? 2015-11-02.
Jump up^ Strachan, James (2015-05-21). “Kubernetes for Developers”.Medium (publishing platform). Retrieved? ? 2015-11-02.
Jump up^ Surana, Ramit (2015-09-16). “Containerizing Docker on Kubernetes”.LinkedIn. Retrieved 2015-11-02.
^ Jump up to:*a* *b* “Intro: Docker and Kubernetes training
? ? - Day 2”. Red Hat. 2015-10-20. Retrieved 2015-11-02.
^ Jump up to:*a* *b* “Overview of a Replication Controller”.Documentation.CoreOS. Retrieved 2015-11-02.
Jump up^ Sanders, Jake (2015-10-02). “Kubernetes: Exciting Experimental
? ? Features”.Livewyer.? ? Retrieved 2015-11-02.
Jump up^ Langemak, Jon (2015-02-15). “Kubernetes 101 – External Access Into
? ? The Cluster”.Das
? ? Blinken Lichten. Retrieved 2015-11-02.
Jump up^ Mahajan, Rakesh (August 30, 2016). “Getting started with Kubernetes”. TO THE NEW. Retrieved September 2, 2016.
^ Jump up to:*a* *b* *c* “Kubernetes Infrastructure”.OpenShift Community Documentation.? ? OpenShift. Retrieved 24 September 2015.
^ Jump up to:*a* *b* Marhubi, Kamal (2015-09-26). “Kubernetes from the ground up: API
? ? server”.? ? kamalmarhubi.com. Retrieved 2015-11-02.
Jump up^ Marhubi, Kamal (2015-08-27). [“What ..] is a Kubelet?”. kamalmarhubi.com. Retrieved 2015-11-02.