數(shù)字化轉(zhuǎn)型之 Kubernetes

英文鏈接:https://en.wikipedia.org/wiki/Kubernetes

Kubernetes(通常寫成“k8s”)是最開始由google設(shè)計(jì)開發(fā)最后貢獻(xiàn)給Cloud Native Computing

Foundation的開源容器集群管理項(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最開始的名字叫Serven of Nine,引用了電影“星際迷航”中通常被認(rèn)為“更加友好”的“博格人”這個(gè)角色。由于google律師的反對(duì),它的名字被重命名為Kubernetes。從Kubernetes的logo上面那車輪上的七個(gè)幅條就能在一定程度上推斷出Kubernets最開始的名字是什么。

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)品。

設(shè)計(jì)

Kubernetes定義了一套堆積木,這些堆積木統(tǒng)一提供部署、維護(hù)和擴(kuò)展應(yīng)用的機(jī)制。構(gòu)成Kubernetes的這些組件讓Kubernetes變得一個(gè)松耦合可延伸的,因此它能滿足各種不同的工作負(fù)載。Kubernetes的延展性在很大程度上是由Kubernetes的API提供的,這些API被運(yùn)行在Kubernetes的內(nèi)部組件、延伸組件和容器使用。

Pods(豆莢)

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è)本地磁盤目錄或者一個(gè)網(wǎng)絡(luò)磁盤,然后把它暴露給pod中的容器。用戶可以通過(guò)Kubernetes API手動(dòng)管理pod,或者把管理工作交給一個(gè)管理器。

標(biāo)簽和選擇器

Kubernetes可以讓客戶端(用戶或者內(nèi)部組件)把被稱之為標(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)簽選擇器決定。

服務(wù)

一個(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)。

架構(gòu)



Kubernetes采用了主從架構(gòu)。Kubernetes的組件可以被分為那些管理單個(gè)節(jié)點(diǎn)和那些控制平面(control plane)的部分。

Kubernetes控制平面(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開發(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)依賴于每幾秒所發(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)聽和收集資源使用情況和性能指標(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.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容