Kubernetes系列(1)—— 基本概念以及入門

一、Kubernetes 是什么?

1.Kubernetes 定義:

Kubernetes 是一個(gè)全新的基于容器技術(shù)的分布式建構(gòu)領(lǐng)先方案,他是基于容器技術(shù),目的是實(shí)現(xiàn)資源管理的自動(dòng)化,以及跨多個(gè)數(shù)據(jù)中心的資源利用率的最大化~

2.Kubernetes 特點(diǎn):

? 遵循Kubernetes的設(shè)計(jì)思想,我們只需要關(guān)注我們的業(yè)務(wù)模塊,那些和業(yè)務(wù)不相干的底層代碼和功能模塊,都可以不用關(guān)注,比如我們可以不用費(fèi)心去部署負(fù)載均衡器,不用考慮自己搭建一個(gè)復(fù)雜的服務(wù)之力框架,不用再去操心服務(wù)的監(jiān)控和故障處理模塊~Kubernetes提供的一整套解決方案,可以讓開發(fā)者將精力集中于業(yè)務(wù)本身,Kubernetes本身也提供了強(qiáng)大的自動(dòng)化機(jī)制,大大減少了運(yùn)維成本。

? Kubernetes是一個(gè)開放的平臺(tái),不局限于任何一種語言,所以你可以把Java ,Go 又或者是C++映射成Kubernetes的Service,并通過標(biāo)準(zhǔn)的TCP協(xié)議進(jìn)行交互。而且,對(duì)于現(xiàn)有的系統(tǒng)我們也可以很容易改造并升級(jí)到Kubernetes平臺(tái)上。

? Kubernetes是一個(gè)完備的分布式系統(tǒng)支撐平臺(tái),Kubernetes 具有完備的集群管理能力,包括多層次的安全防護(hù)和準(zhǔn)入機(jī)制,多租戶應(yīng)用支撐能力,透明的服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)機(jī)制,內(nèi)建智能負(fù)載均衡器,強(qiáng)大的故障發(fā)現(xiàn)和自我修復(fù)能力,服務(wù)滾動(dòng)升級(jí)和在線擴(kuò)容能力等等。

3.為什么用Kubernetes :

我們知道,Docker的出現(xiàn),很好的解決了環(huán)境不一致的問題,但是對(duì)于日益普及的微服務(wù)架構(gòu),我們可能需要部署的服務(wù)器成百上千,我們無法做到手動(dòng)啟用和維護(hù)這些服務(wù)器,因此,容器編排就顯得尤為重要,簡單的說,容器編排的目的就是告訴服務(wù)器集群要使用哪些機(jī)器來運(yùn)行當(dāng)前的服務(wù)。

? 加強(qiáng)團(tuán)隊(duì)協(xié)作,采用Kubernetes解決方案之后,我們只需要一名架構(gòu)師專注于系統(tǒng)中“服務(wù)組件”的提煉,幾名開發(fā)工程師專注于業(yè)務(wù)開發(fā),一名系統(tǒng)兼運(yùn)維工程師負(fù)責(zé)Kubernetes的部署和運(yùn)維。

? Kubernetes 全面擁抱微服務(wù),微服務(wù)的核心就是將一個(gè)巨大的單體應(yīng)用分解為很多小的互相關(guān)聯(lián)的微服務(wù),一個(gè)微服務(wù)背后可能有多個(gè)實(shí)例副本支撐,副本的數(shù)量可能隨著系統(tǒng)的負(fù)荷變化而調(diào)整,我們有內(nèi)嵌的負(fù)載均衡器來實(shí)現(xiàn)這樣的功能。

? Kubernetes 可隨時(shí)遷移到公有云上,以及基于OpenStack的私有云上。

? Kubernetes系統(tǒng)架構(gòu)具備了超強(qiáng)的橫向擴(kuò)容能力,不用修改代碼,一個(gè)Kubernetes集群即可從只包含幾個(gè)Node的小集群平滑擴(kuò)展到擁有上百個(gè)Node的大規(guī)模集群。


二、Kubernetes 基本概念和術(shù)語

Kubernetes有三種主要訪問入口:API 、UI 、CLI。

Kubernetes 請(qǐng)求入口

Kubernetes中的大部分概念如Node、Pod、Replication Controller、Service等都可以看做一種“資源對(duì)象”,幾乎所有的資源對(duì)象都可以通過kubetcl工具執(zhí)行crud的操作并使用etcd做持久化存儲(chǔ)。我們首先來了解下兩個(gè)重要的管理角色:Master & Node

1.Master:

? ? Kubernetes 里面的Master指的是集群控制節(jié)點(diǎn),每個(gè)Kubernetes的集群里面需要有一個(gè)Master節(jié)點(diǎn)來負(fù)責(zé)整個(gè)集群的管理和控制,基本所有的Kubernetes所有控制指令都發(fā)給他,他來負(fù)責(zé)具體的執(zhí)行過程。Master節(jié)點(diǎn)通常會(huì)占領(lǐng)一個(gè)獨(dú)立的服務(wù)器,甚至我們需要3臺(tái)左右來做高可用,畢竟他是整個(gè)集群的首腦,一旦宕機(jī),整個(gè)集群就會(huì)處于癱瘓狀態(tài)。

Master節(jié)點(diǎn)有如下幾個(gè)關(guān)鍵模塊:

? Kubernetes API Server (K8S自有模塊): 提供了Http Rest接口的關(guān)鍵服務(wù)進(jìn)程,是Kubernetes集群里面所有資源的crud(接收客戶端請(qǐng)求)的唯一操作入口,并驗(yàn)證客戶請(qǐng)求是都符合規(guī)范,也是集群控制的入口進(jìn)程。

? Kubernetes Controller Manager(K8S自有模塊)Kubernetes 所有資源對(duì)象自動(dòng)化控制中心。申明式的(用戶不關(guān)心是怎么創(chuàng)建出來的)資源創(chuàng)建,并確保創(chuàng)建出來的資源完全滿足要求,并且處于健康的運(yùn)行狀態(tài)(Controller Loop管理)。一旦用戶有請(qǐng)求過來,Controller模塊會(huì)watch到需要的變更,

? Kubernetes Scheduler(K8S自有模塊)負(fù)責(zé)資源調(diào)度(Pod調(diào)度)的進(jìn)程,當(dāng)我們通過API 、UI 、CLI向Master申請(qǐng)創(chuàng)建一個(gè)容器,這個(gè)容器到底要運(yùn)行在哪個(gè)Node上,那么Schedule就是主要用來評(píng)估哪個(gè)Node節(jié)點(diǎn)是最佳的,然后將我們要起的Pod在哪個(gè)Node上運(yùn)行

? Kubernetes etcd: Kubernetes 持久化存儲(chǔ),etcd本不屬于Master,是由CoreOS公司開發(fā)的一款持久化存儲(chǔ)

2.Node:

除了Master節(jié)點(diǎn),Kubernetes 集群中的其他節(jié)點(diǎn)被稱為Node節(jié)點(diǎn),他可以是物理機(jī)也可以是虛擬機(jī),Node節(jié)點(diǎn)是整個(gè)集群中的工作負(fù)載,每個(gè)Node都會(huì)被Master分配一些工作負(fù)載(Docker Container),當(dāng)某個(gè)Node宕機(jī)時(shí),他的工作負(fù)載會(huì)被轉(zhuǎn)移到其他的節(jié)點(diǎn)上去。

每個(gè)Node節(jié)點(diǎn)上都會(huì)運(yùn)行下一組關(guān)鍵進(jìn)程:

? kubelet:負(fù)責(zé)Pod對(duì)應(yīng)的容器的創(chuàng)建、啟停等任務(wù),同時(shí)與Master節(jié)點(diǎn)密切合作,實(shí)現(xiàn)集群管理的基本功能

? kube-proxy:實(shí)現(xiàn)Kubernetes Service的通信與負(fù)載均衡機(jī)制的重要組件

? Docker Engine:Docker引擎,負(fù)責(zé)本機(jī)的容器的創(chuàng)建和管理

Node節(jié)點(diǎn)可以在運(yùn)行期間動(dòng)態(tài)增加到Kubernetes集群中去,前提是這個(gè)節(jié)點(diǎn)上已經(jīng)正確安裝、配置和啟動(dòng)了上述的所有關(guān)鍵進(jìn)程,默認(rèn)情況下kubelet會(huì)向Master注冊(cè)自己。一旦Node被納入集群管理范圍,kubelet會(huì)定時(shí)向Master節(jié)點(diǎn)匯報(bào)自身的情況,如操作系統(tǒng)、Docker版本、機(jī)器的CPU和memory使用情況。當(dāng)某個(gè)Node超過指定的時(shí)間不上報(bào)信息的時(shí)候,會(huì)被Master判定為失聯(lián),Node狀態(tài)會(huì)被標(biāo)記為不可用,隨后會(huì)將該Node的工作負(fù)載轉(zhuǎn)移到其他Node。

3.Pod:

Pod是一組容器的組合,每個(gè)Pod都包含一個(gè)Pause容器以及若干個(gè)業(yè)務(wù)相關(guān)的容器

1.Kubernetes Pod

為什么Kubernetes會(huì)設(shè)計(jì)出Pod這樣一個(gè)概念,并且有這樣的組成結(jié)構(gòu)呢?

? 原因1:在一組容器作為一個(gè)單元的情況下,我們很難根據(jù)一臺(tái)機(jī)器的狀態(tài)來判斷整體的狀態(tài),因此我們引入與業(yè)務(wù)無關(guān)并且不容易死亡的Pause容器作為Pod的根容器,他來代表整個(gè)容器組的狀態(tài)

? 原因2:Pod里多個(gè)業(yè)務(wù)容器共享Pause容器的IP,共享Pause容器的Volume,這樣既簡化了密切關(guān)聯(lián)的業(yè)務(wù)容器之間的通信問題,也解決了他們之間的文件共享問題

我們用一張圖來表示Node Pod和Container之間的關(guān)系:

2.Kubernetes Node Pod和Container

普通的Pod一旦被創(chuàng)建,會(huì)被放到etcd中存儲(chǔ),隨后會(huì)被Master調(diào)度到某個(gè)具體的Node上并進(jìn)行綁定,隨后該P(yáng)od被對(duì)應(yīng)Node上的kubelet進(jìn)程實(shí)例化程一組相關(guān)的Docker容器并啟動(dòng)起來。

4.Label:

Lable是Kubernetes系統(tǒng)中另外一個(gè)核心概念,一個(gè)Label是一個(gè)key=value的鍵值對(duì),key和value由用戶自己定義,Label可以附加到各種資源對(duì)象上,例如Node,Pod,Service,RC等等,一個(gè)資源對(duì)象可以定義任意數(shù)量的Label,同一個(gè)Label也能被添加到任意數(shù)量的資源對(duì)像上去。例如:

? 版本標(biāo)簽:"release" : "stable"

? 環(huán)境標(biāo)簽:"Environment" : "DEV"

? 分區(qū)標(biāo)簽 :"partition" : "customerA"


3. Kubernetes Label

我們可以用Label Selector查詢和篩選擁有某些Label的資源對(duì)象。我們查詢方式有兩種:

? name = redis-slave : 匹配所有具有標(biāo)簽name = redis-slave 的資源對(duì)象

? name in (redis-master , redis-slave):匹配素有具有標(biāo)簽name = redis-master和name = redis-slave的資源對(duì)象

我們的label標(biāo)簽主要有以下幾種使用場景:

? kube-controller : 通過資源對(duì)象RC上定義的Label Selector來篩選要監(jiān)控的Pod副本的數(shù)量,從而實(shí)現(xiàn)Pod副本數(shù)量實(shí)在符合預(yù)期設(shè)定的全自動(dòng)控制流程。

? kube-proxy :? 通過Service的Label Selector來選擇對(duì)應(yīng)的Pod,自動(dòng)建立起每個(gè)Service到對(duì)應(yīng)Pod的請(qǐng)求轉(zhuǎn)發(fā)路由表,從而實(shí)現(xiàn)Service的智能負(fù)載均衡機(jī)制。

總之,使用Label可以給對(duì)象創(chuàng)建多組標(biāo)簽,Label和Label Selector共同構(gòu)成了Kubernetes 系統(tǒng)中最核心的應(yīng)用模型,使得被管理對(duì)象能夠被精細(xì)的分組管理,同時(shí)實(shí)現(xiàn)整個(gè)集群的高可用性。

5.Replication Controller:

RC是Kubernetes 核心概念之一,他定義了一個(gè)期望的場景,即聲明某種Pod的副本數(shù)量在任意時(shí)刻符合某個(gè)預(yù)期值,了解云平臺(tái)的小伙伴都知道,類似于AutoScaling所定義的虛機(jī)數(shù)目,可以設(shè)置在任意時(shí)刻必須要有N臺(tái)機(jī)器處于運(yùn)行狀態(tài)。RC定義包括:

? Pod期待的副本數(shù)(replicas)

? 用于篩選目標(biāo)Pod的Label Selector

? 當(dāng)副本數(shù)小于預(yù)期數(shù)時(shí),用于創(chuàng)建新的Pod的Pod模板(template)

當(dāng)我們定義好一個(gè)RC并提交到Kubernetes 集群后,Master節(jié)點(diǎn)上的Controller Manager組件就得到通知,定期巡檢系統(tǒng)中當(dāng)前存活的目標(biāo)Pod,并且確保目標(biāo)Pod實(shí)例的數(shù)量剛好等于此RC的期望值,如果有過多的Pod在運(yùn)行,系統(tǒng)就會(huì)停掉一些Pod,否則系統(tǒng)會(huì)在創(chuàng)建一些Pod。

假如我們?cè)赗C里定義redis-slave這個(gè)Pod需要2個(gè)副本,那么系統(tǒng)會(huì)在其中兩個(gè)Node上保持兩個(gè)Pod。如下圖:

4. Kubernetes Replication Controller? --- 2 Pod case

此外,在運(yùn)行時(shí),我們可以通過修改RC的副本數(shù)量,來實(shí)現(xiàn)Pod的動(dòng)態(tài)縮放:

? ? ? ? ? ? ? ? kubectl scale rc redis-slave --replicas=3

我們需要注意的是,刪除RC不會(huì)刪除已經(jīng)創(chuàng)建好的Pod,如果需要?jiǎng)h除所有符合條件的Pod,可以設(shè)置replicas的值為0,然后更新RC即可。

在Kubernetes 1.2中我們升級(jí)成另一個(gè)概念:Replica Set。功能方面,Repica Set支持Set-based selector.

最后我們來看下RC(Replica Set)的特性:

? 我們通過定義一個(gè)RC來實(shí)現(xiàn)Pod的創(chuàng)建過程以及副本數(shù)量的控制

? RC中包括完整的Pod定義模板

? RC通過Label Selector機(jī)制實(shí)現(xiàn)對(duì)Pod副本的自動(dòng)控制

? 通過改變RC里的Pod數(shù)量,可以實(shí)現(xiàn)Pod的擴(kuò)容

? 通過改變RC中的Pod模板的鏡像版本,可以實(shí)現(xiàn)Pod的滾動(dòng)升級(jí)功能

6.Deployment:

Deployment是Kubernetes 1.2引入的新概念,引入的目的是為了更好的解決Pod的編排問題。Deployment在內(nèi)部使用的是Replica Set來實(shí)現(xiàn)目的,因此他可以看做是R

3.C的一次升級(jí)。

Deployment相對(duì)于RC最大的一個(gè)升級(jí)是可以隨時(shí)知道當(dāng)前Pod的部署進(jìn)度,實(shí)際上由于一個(gè)Pod的創(chuàng)建、調(diào)度、綁定節(jié)點(diǎn)以及在目標(biāo)Node上啟動(dòng)對(duì)應(yīng)容器這一完整過程需要一定時(shí)間,所以我們期待系統(tǒng)啟動(dòng)N個(gè)Pod副本的目標(biāo)狀態(tài),其實(shí)是一個(gè)連續(xù)的過程。

Deployment使用場景有如下幾個(gè):

? 創(chuàng)建一個(gè)Deployment對(duì)象來生成對(duì)應(yīng)的Replica Set 并完成Pod副本的創(chuàng)建過程

? 檢查Deployment的狀態(tài)來看部署動(dòng)作是否完成

? 更新Deployment以創(chuàng)建新的Pod

? 如果當(dāng)前的Deployment不穩(wěn)定,則回滾到早先的Deployment版本

? 查看Deployment狀態(tài),一次作為發(fā)布是否成功的目標(biāo)

7.Service:

Kubernetes中的每個(gè)服務(wù)其實(shí)就是微服務(wù),之前的Pod RC等等,都是為Service服務(wù)的:


5. Kubernetes Service

? Service定義了一個(gè)服務(wù)的訪問入口地址

? 前端應(yīng)用(Pod)通過這個(gè)入口地址訪問其背后的一組由Pod副本組成的集群實(shí)例。

? Service與其后端Pod副本集群之間是通過Label Selector來實(shí)現(xiàn)無縫對(duì)接的

? RC保證Service的服務(wù)能力和服務(wù)質(zhì)量始終處于預(yù)期標(biāo)準(zhǔn)

運(yùn)行在每個(gè)Node上的Kube-proxy進(jìn)程其實(shí)就是一個(gè)只能的負(fù)載均衡器,他負(fù)責(zé)把對(duì)Service的請(qǐng)求轉(zhuǎn)發(fā)到后端的某個(gè)Pod上,并在內(nèi)部實(shí)現(xiàn)服務(wù)的負(fù)載均衡與會(huì)話保持機(jī)制。Service不是共用一個(gè)負(fù)載均衡器的IP地址,而是每個(gè)Service分配了一個(gè)全局的IP地址,這個(gè)虛擬IP稱為Cluster IP。

外部系統(tǒng)訪問Service的問題:

在Kubernetes中我們有三種IP:

? Node IP: Node節(jié)點(diǎn)的IP地址,是集群中每個(gè)節(jié)點(diǎn)的物理網(wǎng)卡的IP地址,是一個(gè)真實(shí)存在的物理網(wǎng)絡(luò)

? Pod IP: Pod的IP地址,是Docker Enginne根據(jù)docker()網(wǎng)橋的IP地址段進(jìn)行分配的,通常是一個(gè)虛擬的二層網(wǎng)絡(luò)

? Cluster IP :Service的IP地址,是一種虛擬IP,僅僅作用于Kubernetes Service這個(gè)對(duì)象,并且由Kubernetes管理和分配IP地址,他是無法被ping到的,因?yàn)樗且粋€(gè)虛擬的對(duì)象

小結(jié):Service的Cluster IP屬于Kubernetes集群內(nèi)部的地址,無法在集群外部直接使用這個(gè)地址,如果需要提供給外部用戶使用,可以采用NodePort解決

8.Volume

Volume是Pod中能夠被多個(gè)容器訪問的共享目錄

如何使用:在Pod上聲明一個(gè)Volume,然后在容器里引用該Volume并Mount到容器的某個(gè)目錄上

我們來看下Kubernetes提供的Volume類型:

? emptyDir:在Pod分配到Node時(shí)創(chuàng)建的臨時(shí)空間,初始內(nèi)容為空,并且無需指定宿主機(jī)上對(duì)應(yīng)的目錄文件,因?yàn)檫@個(gè)是Kubernetes自動(dòng)分配的一個(gè)目錄,當(dāng)Pod從Node上移除時(shí),emptyDir中的數(shù)據(jù)也會(huì)被永久刪除。

? hostPath:在Pod上掛在宿主機(jī)上的文件或目錄,可以用于以下幾個(gè)方面:

? ? 1.容器應(yīng)用程序生成的日志文件需要永久保存時(shí),可以使用宿主機(jī)的高度文件系統(tǒng)進(jìn)行存儲(chǔ)

? ? 2.需要訪問宿主機(jī)上的Docker引擎內(nèi)部數(shù)據(jù)結(jié)構(gòu)的容器應(yīng)用時(shí),可以通過定義hostPath為宿主機(jī)/var/lib/docker目錄,使得容器內(nèi)部應(yīng)用可以直接訪問Docker的文件系統(tǒng)。

? Persistent Volume:前面兩種是定義在Pod上的計(jì)算資源,而網(wǎng)絡(luò)存儲(chǔ)是相對(duì)獨(dú)立于計(jì)算資源的一種實(shí)體資源,例如AWSElasticBlockStore,AzureFile等~

9.NameSpace

在Kubernetes中,NameSpace在很多情況下用于資源隔離,NameSpace通過將集群內(nèi)部的資源對(duì)象分配到不同的NameSpace中,形成邏輯上的不同分組,便于不同分組在共享使用整個(gè)集群的資源的同時(shí)還能被分別管理。

Kubernetes集群子啟動(dòng)后,會(huì)創(chuàng)建一個(gè)default的NameSpace。一旦創(chuàng)建了NameSpace我們?cè)诙x資源的時(shí)候就可以指定這個(gè)資源屬于哪個(gè)NameSpace。

當(dāng)我們?cè)诮o每個(gè)用戶創(chuàng)建NameSpace來實(shí)現(xiàn)多個(gè)用戶資源隔離時(shí),還可以結(jié)合Kubernetes的資源配額管理,限定不同用戶能占用的資源,比如CPU、內(nèi)存等等~

10.Anotation

Annotation與Label類似,也是使用Key/Value的形式定義,但是Label有嚴(yán)格的命名規(guī)則,當(dāng)天定義的是Kubernetes對(duì)象元素(Metadata),并且勇于Label Selector;Annotation則是用戶定義的附加信息,以便于外部工具進(jìn)行查找,比如,Annotation可以定義如下信息:

build信息,release信息,Docker鏡像信息等。


小結(jié)

上述這些組件是Kubernetes系統(tǒng)的核心組件,他們共同構(gòu)成了Kubernetes系統(tǒng)的框架和計(jì)算模型。通過對(duì)他們進(jìn)行靈活組合,用戶可以快速、方便的對(duì)容器和集群進(jìn)行配置、創(chuàng)建和管理。

下面我們會(huì)對(duì)各個(gè)模塊最詳細(xì)的闡述。


最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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