Kubernetes系列之介紹篇

原文:https://www.cnblogs.com/xhyan/p/6656062.html
?Kubernetes介紹

1.背景介紹

云計(jì)算飛速發(fā)展

- IaaS

- PaaS

- SaaS

Docker技術(shù)突飛猛進(jìn)

- 一次構(gòu)建,到處運(yùn)行

- 容器的快速輕量

- 完整的生態(tài)環(huán)境

2.什么是kubernetes

首先,他是一個(gè)全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案。Kubernetes(k8s)是Google開(kāi)源的容器集群管理系統(tǒng)(谷歌內(nèi)部:Borg)。在Docker技術(shù)的基礎(chǔ)上,為容器化的應(yīng)用提供部署運(yùn)行、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等一系列完整功能,提高了大規(guī)模容器集群管理的便捷性。

Kubernetes是一個(gè)完備的分布式系統(tǒng)支撐平臺(tái),具有完備的集群管理能力,多擴(kuò)多層次的安全防護(hù)和準(zhǔn)入機(jī)制、多租戶應(yīng)用支撐能力、透明的服務(wù)注冊(cè)和發(fā)現(xiàn)機(jī)制、內(nèi)建智能負(fù)載均衡器、強(qiáng)大的故障發(fā)現(xiàn)和自我修復(fù)能力、服務(wù)滾動(dòng)升級(jí)和在線擴(kuò)容能力、可擴(kuò)展的資源自動(dòng)調(diào)度機(jī)制以及多粒度的資源配額管理能力。同時(shí)Kubernetes提供完善的管理工具,涵蓋了包括開(kāi)發(fā)、部署測(cè)試、運(yùn)維監(jiān)控在內(nèi)的各個(gè)環(huán)節(jié)。

Kubernetes中,Service是分布式集群架構(gòu)的核心,一個(gè)Service對(duì)象擁有如下關(guān)鍵特征:

  • 擁有一個(gè)唯一指定的名字
  • 擁有一個(gè)虛擬IP(Cluster IP、Service IP、或VIP)和端口號(hào)
  • 能夠體統(tǒng)某種遠(yuǎn)程服務(wù)能力
  • 被映射到了提供這種服務(wù)能力的一組容器應(yīng)用上

Service的服務(wù)進(jìn)程目前都是基于Socket通信方式對(duì)外提供服務(wù),比如Redis、Memcache、MySQL、Web Server,或者是實(shí)現(xiàn)了某個(gè)具體業(yè)務(wù)的一個(gè)特定的TCP Server進(jìn)程,雖然一個(gè)Service通常由多個(gè)相關(guān)的服務(wù)進(jìn)程來(lái)提供服務(wù),每個(gè)服務(wù)進(jìn)程都有一個(gè)獨(dú)立的Endpoint(IP+Port)訪問(wèn)點(diǎn),但Kubernetes能夠讓我們通過(guò)服務(wù)連接到指定的Service上。有了Kubernetes內(nèi)奸的透明負(fù)載均衡和故障恢復(fù)機(jī)制,不管后端有多少服務(wù)進(jìn)程,也不管某個(gè)服務(wù)進(jìn)程是否會(huì)由于發(fā)生故障而重新部署到其他機(jī)器,都不會(huì)影響我們隊(duì)服務(wù)的正常調(diào)用,更重要的是這個(gè)Service本身一旦創(chuàng)建就不會(huì)發(fā)生變化,意味著在Kubernetes集群中,我們不用為了服務(wù)的IP地址的變化問(wèn)題而頭疼了。

容器提供了強(qiáng)大的隔離功能,所有有必要把為Service提供服務(wù)的這組進(jìn)程放入容器中進(jìn)行隔離。為此,Kubernetes設(shè)計(jì)了Pod對(duì)象,將每個(gè)服務(wù)進(jìn)程包裝到相對(duì)應(yīng)的Pod中,使其成為Pod中運(yùn)行的一個(gè)容器。為了建立Service與Pod間的關(guān)聯(lián)管理,Kubernetes給每個(gè)Pod貼上一個(gè)標(biāo)簽Label,比如運(yùn)行MySQL的Pod貼上name=mysql標(biāo)簽,給運(yùn)行PHP的Pod貼上name=php標(biāo)簽,然后給相應(yīng)的Service定義標(biāo)簽選擇器Label Selector,這樣就能巧妙的解決了Service于Pod的關(guān)聯(lián)問(wèn)題。

在集群管理方面,Kubernetes將集群中的機(jī)器劃分為一個(gè)Master節(jié)點(diǎn)和一群工作節(jié)點(diǎn)Node,其中,在Master節(jié)點(diǎn)運(yùn)行著集群管理相關(guān)的一組進(jìn)程kube-apiserver、kube-controller-manager和kube-scheduler,這些進(jìn)程實(shí)現(xiàn)了整個(gè)集群的資源管理、Pod調(diào)度、彈性伸縮、安全控制、系統(tǒng)監(jiān)控和糾錯(cuò)等管理能力,并且都是全自動(dòng)完成的。Node作為集群中的工作節(jié)點(diǎn),運(yùn)行真正的應(yīng)用程序,在Node上Kubernetes管理的最小運(yùn)行單元是Pod。Node上運(yùn)行著Kubernetes的kubelet、kube-proxy服務(wù)進(jìn)程,這些服務(wù)進(jìn)程負(fù)責(zé)Pod的創(chuàng)建、啟動(dòng)、監(jiān)控、重啟、銷毀以及實(shí)現(xiàn)軟件模式的負(fù)載均衡器。

在Kubernetes集群中,它解決了傳統(tǒng)IT系統(tǒng)中服務(wù)擴(kuò)容和升級(jí)的兩大難題。你只需為需要擴(kuò)容的Service關(guān)聯(lián)的Pod創(chuàng)建一個(gè)Replication Controller簡(jiǎn)稱(RC),則該Service的擴(kuò)容及后續(xù)的升級(jí)等問(wèn)題將迎刃而解。在一個(gè)RC定義文件中包括以下3個(gè)關(guān)鍵信息。

  • 目標(biāo)Pod的定義
  • 目標(biāo)Pod需要運(yùn)行的副本數(shù)量(Replicas)
  • 要監(jiān)控的目標(biāo)Pod標(biāo)簽(Label)

在創(chuàng)建好RC后,Kubernetes會(huì)通過(guò)RC中定義的的Label篩選出對(duì)應(yīng)Pod實(shí)例并實(shí)時(shí)監(jiān)控其狀態(tài)和數(shù)量,如果實(shí)例數(shù)量少于定義的副本數(shù)量,則會(huì)根據(jù)RC中定義的Pod模板來(lái)創(chuàng)建一個(gè)新的Pod,然后將新Pod調(diào)度到合適的Node上啟動(dòng)運(yùn)行,知道Pod實(shí)例的數(shù)量達(dá)到預(yù)定目標(biāo),這個(gè)過(guò)程完全是自動(dòng)化。

Kubernetes優(yōu)勢(shì):

- 容器編排

- 輕量級(jí)

- 開(kāi)源

- 彈性伸縮

- 負(fù)載均衡

?Kubernetes的核心概念

1.Master

k8s集群的管理節(jié)點(diǎn),負(fù)責(zé)管理集群,提供集群的資源數(shù)據(jù)訪問(wèn)入口。擁有Etcd存儲(chǔ)服務(wù)(可選),運(yùn)行Api Server進(jìn)程,Controller Manager服務(wù)進(jìn)程及Scheduler服務(wù)進(jìn)程,關(guān)聯(lián)工作節(jié)點(diǎn)Node。Kubernetes API server提供HTTP Rest接口的關(guān)鍵服務(wù)進(jìn)程,是Kubernetes里所有資源的增、刪、改、查等操作的唯一入口。也是集群控制的入口進(jìn)程;Kubernetes Controller Manager是Kubernetes所有資源對(duì)象的自動(dòng)化控制中心;Kubernetes Schedule是負(fù)責(zé)資源調(diào)度(Pod調(diào)度)的進(jìn)程

2.Node

Node是Kubernetes集群架構(gòu)中運(yùn)行Pod的服務(wù)節(jié)點(diǎn)(亦叫agent或minion)。Node是Kubernetes集群操作的單元,用來(lái)承載被分配Pod的運(yùn)行,是Pod運(yùn)行的宿主機(jī)。關(guān)聯(lián)Master管理節(jié)點(diǎn),擁有名稱和IP、系統(tǒng)資源信息。運(yùn)行docker eninge服務(wù),守護(hù)進(jìn)程kunelet及負(fù)載均衡器kube-proxy.

  • 每個(gè)Node節(jié)點(diǎn)都運(yùn)行著以下一組關(guān)鍵進(jìn)程
  • kubelet:負(fù)責(zé)對(duì)Pod對(duì)于的容器的創(chuàng)建、啟停等任務(wù)
  • kube-proxy:實(shí)現(xiàn)Kubernetes Service的通信與負(fù)載均衡機(jī)制的重要組件
  • Docker Engine(Docker):Docker引擎,負(fù)責(zé)本機(jī)容器的創(chuàng)建和管理工作

Node節(jié)點(diǎn)可以在運(yùn)行期間動(dòng)態(tài)增加到Kubernetes集群中,默認(rèn)情況下,kubelet會(huì)想master注冊(cè)自己,這也是Kubernetes推薦的Node管理方式,kubelet進(jìn)程會(huì)定時(shí)向Master匯報(bào)自身情報(bào),如操作系統(tǒng)、Docker版本、CPU和內(nèi)存,以及有哪些Pod在運(yùn)行等等,這樣Master可以獲知每個(gè)Node節(jié)點(diǎn)的資源使用情況,冰實(shí)現(xiàn)高效均衡的資源調(diào)度策略。、

3.Pod

運(yùn)行于Node節(jié)點(diǎn)上,若干相關(guān)容器的組合。Pod內(nèi)包含的容器運(yùn)行在同一宿主機(jī)上,使用相同的網(wǎng)絡(luò)命名空間、IP地址和端口,能夠通過(guò)localhost進(jìn)行通。Pod是Kurbernetes進(jìn)行創(chuàng)建、調(diào)度和管理的最小單位,它提供了比容器更高層次的抽象,使得部署和管理更加靈活。一個(gè)Pod可以包含一個(gè)容器或者多個(gè)相關(guān)容器。

Pod其實(shí)有兩種類型:普通Pod和靜態(tài)Pod,后者比較特殊,它并不存在Kubernetes的etcd存儲(chǔ)中,而是存放在某個(gè)具體的Node上的一個(gè)具體文件中,并且只在此Node上啟動(dòng)。普通Pod一旦被創(chuàng)建,就會(huì)被放入etcd存儲(chǔ)中,隨后會(huì)被Kubernetes Master調(diào)度到摸個(gè)具體的Node上進(jìn)行綁定,隨后該P(yáng)od被對(duì)應(yīng)的Node上的kubelet進(jìn)程實(shí)例化成一組相關(guān)的Docker容器冰啟動(dòng)起來(lái),在。在默認(rèn)情況下,當(dāng)Pod里的某個(gè)容器停止時(shí),Kubernetes會(huì)自動(dòng)檢測(cè)到這個(gè)問(wèn)起并且重啟這個(gè)Pod(重啟Pod里的所有容器),如果Pod所在的Node宕機(jī),則會(huì)將這個(gè)Node上的所有Pod重新調(diào)度到其他節(jié)點(diǎn)上。

4.Replication Controller

Replication Controller用來(lái)管理Pod的副本,保證集群中存在指定數(shù)量的Pod副本。集群中副本的數(shù)量大于指定數(shù)量,則會(huì)停止指定數(shù)量之外的多余容器數(shù)量,反之,則會(huì)啟動(dòng)少于指定數(shù)量個(gè)數(shù)的容器,保證數(shù)量不變。Replication Controller是實(shí)現(xiàn)彈性伸縮、動(dòng)態(tài)擴(kuò)容和滾動(dòng)升級(jí)的核心。

5.Service

Service定義了Pod的邏輯集合和訪問(wèn)該集合的策略,是真實(shí)服務(wù)的抽象。Service提供了一個(gè)統(tǒng)一的服務(wù)訪問(wèn)入口以及服務(wù)代理和發(fā)現(xiàn)機(jī)制,關(guān)聯(lián)多個(gè)相同Label的Pod,用戶不需要了解后臺(tái)Pod是如何運(yùn)行。

外部系統(tǒng)訪問(wèn)Service的問(wèn)題

首先需要弄明白Kubernetes的三種IP這個(gè)問(wèn)題

Node IP:Node節(jié)點(diǎn)的IP地址

Pod IP: Pod的IP地址

Cluster IP:Service的IP地址

首先,Node IP是Kubernetes集群中節(jié)點(diǎn)的物理網(wǎng)卡IP地址,所有屬于這個(gè)網(wǎng)絡(luò)的服務(wù)器之間都能通過(guò)這個(gè)網(wǎng)絡(luò)直接通信。這也表明Kubernetes集群之外的節(jié)點(diǎn)訪問(wèn)Kubernetes集群之內(nèi)的某個(gè)節(jié)點(diǎn)或者TCP/IP服務(wù)的時(shí)候,必須通過(guò)Node IP進(jìn)行通信

其次,Pod IP是每個(gè)Pod的IP地址,他是Docker Engine根據(jù)docker0網(wǎng)橋的IP地址段進(jìn)行分配的,通常是一個(gè)虛擬的二層網(wǎng)絡(luò)。

最后Cluster IP是一個(gè)虛擬的IP,但更像是一個(gè)偽造的IP網(wǎng)絡(luò),原因有以下幾點(diǎn)

  • Cluster IP僅僅作用于Kubernetes Service這個(gè)對(duì)象,并由Kubernetes管理和分配P地址
  • Cluster IP無(wú)法被ping,他沒(méi)有一個(gè)“實(shí)體網(wǎng)絡(luò)對(duì)象”來(lái)響應(yīng)
  • Cluster IP只能結(jié)合Service Port組成一個(gè)具體的通信端口,單獨(dú)的Cluster IP不具備通信的基礎(chǔ),并且他們屬于Kubernetes集群這樣一個(gè)封閉的空間。

Kubernetes集群之內(nèi),Node IP網(wǎng)、Pod IP網(wǎng)于Cluster IP網(wǎng)之間的通信,采用的是Kubernetes自己設(shè)計(jì)的一種編程方式的特殊路由規(guī)則。

6.Label

Kubernetes中的任意API對(duì)象都是通過(guò)Label進(jìn)行標(biāo)識(shí),Label的實(shí)質(zhì)是一系列的Key/Value鍵值對(duì),其中key于value由用戶自己指定。Label可以附加在各種資源對(duì)象上,如Node、Pod、Service、RC等,一個(gè)資源對(duì)象可以定義任意數(shù)量的Label,同一個(gè)Label也可以被添加到任意數(shù)量的資源對(duì)象上去。Label是Replication Controller和Service運(yùn)行的基礎(chǔ),二者通過(guò)Label來(lái)進(jìn)行關(guān)聯(lián)Node上運(yùn)行的Pod。

我們可以通過(guò)給指定的資源對(duì)象捆綁一個(gè)或者多個(gè)不同的Label來(lái)實(shí)現(xiàn)多維度的資源分組管理功能,以便于靈活、方便的進(jìn)行資源分配、調(diào)度、配置等管理工作。

一些常用的Label如下:

  • 版本標(biāo)簽:"release":"stable","release":"canary"......
  • 環(huán)境標(biāo)簽:"environment":"dev","environment":"qa","environment":"production"
  • 架構(gòu)標(biāo)簽:"tier":"frontend","tier":"backend","tier":"middleware"
  • 分區(qū)標(biāo)簽:"partition":"customerA","partition":"customerB"
  • 質(zhì)量管控標(biāo)簽:"track":"daily","track":"weekly"

Label相當(dāng)于我們熟悉的標(biāo)簽,給某個(gè)資源對(duì)象定義一個(gè)Label就相當(dāng)于給它大了一個(gè)標(biāo)簽,隨后可以通過(guò)Label Selector(標(biāo)簽選擇器)查詢和篩選擁有某些Label的資源對(duì)象,Kubernetes通過(guò)這種方式實(shí)現(xiàn)了類似SQL的簡(jiǎn)單又通用的對(duì)象查詢機(jī)制。

Label Selector在Kubernetes中重要使用場(chǎng)景如下:

    • kube-Controller進(jìn)程通過(guò)資源對(duì)象RC上定義Label Selector來(lái)篩選要監(jiān)控的Pod副本的數(shù)量,從而實(shí)現(xiàn)副本數(shù)量始終符合預(yù)期設(shè)定的全自動(dòng)控制流程
    • kube-proxy進(jìn)程通過(guò)Service的Label Selector來(lái)選擇對(duì)應(yīng)的Pod,自動(dòng)建立起每個(gè)Service島對(duì)應(yīng)Pod的請(qǐng)求轉(zhuǎn)發(fā)路由表,從而實(shí)現(xiàn)Service的智能負(fù)載均衡
    • 通過(guò)對(duì)某些Node定義特定的Label,并且在Pod定義文件中使用Nodeselector這種標(biāo)簽調(diào)度策略,kuber-scheduler進(jìn)程可以實(shí)現(xiàn)Pod”定向調(diào)度“的特性

?Kubernetes架構(gòu)和組件

image

- 服務(wù)分組,小集群,多集群

- 服務(wù)分組,大集群,單集群

****?****Kubernetes 組件:

Kubernetes Master控制組件,調(diào)度管理整個(gè)系統(tǒng)(集群),包含如下組件:

1.Kubernetes API Server

作為Kubernetes系統(tǒng)的入口,其封裝了核心對(duì)象的增刪改查操作,以RESTful API接口方式提供給外部客戶和內(nèi)部組件調(diào)用。維護(hù)的REST對(duì)象持久化到Etcd中存儲(chǔ)。

2.Kubernetes Scheduler

為新建立的Pod進(jìn)行節(jié)點(diǎn)(node)選擇(即分配機(jī)器),負(fù)責(zé)集群的資源調(diào)度。組件抽離,可以方便替換成其他調(diào)度器。

3.Kubernetes Controller

負(fù)責(zé)執(zhí)行各種控制器,目前已經(jīng)提供了很多控制器來(lái)保證Kubernetes的正常運(yùn)行。

4. Replication Controller

管理維護(hù)Replication Controller,關(guān)聯(lián)Replication Controller和Pod,保證Replication Controller定義的副本數(shù)量與實(shí)際運(yùn)行Pod數(shù)量一致。

5. Node Controller

管理維護(hù)Node,定期檢查Node的健康狀態(tài),標(biāo)識(shí)出(失效|未失效)的Node節(jié)點(diǎn)。

6. Namespace Controller

管理維護(hù)Namespace,定期清理無(wú)效的Namespace,包括Namesapce下的API對(duì)象,比如Pod、Service等。

7. Service Controller

管理維護(hù)Service,提供負(fù)載以及服務(wù)代理。

8.EndPoints Controller

管理維護(hù)Endpoints,關(guān)聯(lián)Service和Pod,創(chuàng)建Endpoints為Service的后端,當(dāng)Pod發(fā)生變化時(shí),實(shí)時(shí)更新Endpoints。

9. Service Account Controller

管理維護(hù)Service Account,為每個(gè)Namespace創(chuàng)建默認(rèn)的Service Account,同時(shí)為Service Account創(chuàng)建Service Account Secret。

10. Persistent Volume Controller

管理維護(hù)Persistent Volume和Persistent Volume Claim,為新的Persistent Volume Claim分配Persistent Volume進(jìn)行綁定,為釋放的Persistent Volume執(zhí)行清理回收。

11. Daemon Set Controller

管理維護(hù)Daemon Set,負(fù)責(zé)創(chuàng)建Daemon Pod,保證指定的Node上正常的運(yùn)行Daemon Pod。

12. Deployment Controller

管理維護(hù)Deployment,關(guān)聯(lián)Deployment和Replication Controller,保證運(yùn)行指定數(shù)量的Pod。當(dāng)Deployment更新時(shí),控制實(shí)現(xiàn)Replication Controller和 Pod的更新。

13.Job Controller

管理維護(hù)Job,為Jod創(chuàng)建一次性任務(wù)Pod,保證完成Job指定完成的任務(wù)數(shù)目

14. Pod Autoscaler Controller

實(shí)現(xiàn)Pod的自動(dòng)伸縮,定時(shí)獲取監(jiān)控?cái)?shù)據(jù),進(jìn)行策略匹配,當(dāng)滿足條件時(shí)執(zhí)行Pod的伸縮動(dòng)作。

?Kubernetes Node運(yùn)行節(jié)點(diǎn),運(yùn)行管理業(yè)務(wù)容器,包含如下組件:

1.Kubelet

負(fù)責(zé)管控容器,Kubelet會(huì)從Kubernetes API Server接收Pod的創(chuàng)建請(qǐng)求,啟動(dòng)和停止容器,監(jiān)控容器運(yùn)行狀態(tài)并匯報(bào)給Kubernetes API Server。

2.Kubernetes Proxy

負(fù)責(zé)為Pod創(chuàng)建代理服務(wù),Kubernetes Proxy會(huì)從Kubernetes API Server獲取所有的Service信息,并根據(jù)Service的信息創(chuàng)建代理服務(wù),實(shí)現(xiàn)Service到Pod的請(qǐng)求路由和轉(zhuǎn)發(fā),從而實(shí)現(xiàn)Kubernetes層級(jí)的虛擬轉(zhuǎn)發(fā)網(wǎng)絡(luò)。

3.Docker

Node上需要運(yùn)行容器服務(wù)

?著作權(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)容