測試技能提升篇——k8s的核心概念

本文重點介紹k8s中所涉及的核心概念,能夠幫助讀者快速地從整體方面了解k8s,便于初學(xué)者在實際工作中從事相關(guān)工作!

Docker 和K8s

Docker是應(yīng)用最廣泛的容器技術(shù),它通過打包鏡像、啟動容器來創(chuàng)建服務(wù)。

k8s的全稱kubernetes。它是一個完整的分布式系統(tǒng)支撐平臺,集群管理功能齊全。Kubernetes同時提供完善的管理工具,涵蓋了開發(fā)、部署、測試、運行監(jiān)控等各個環(huán)節(jié)。

隨著應(yīng)用的日益復(fù)雜,容器的數(shù)量也不斷增加,由此衍生出管理運維容器這一重要問題。隨著云計算的發(fā)展,容器的漂移也是云端最大的挑戰(zhàn)。k8s正是在這種業(yè)務(wù)的驅(qū)動下,提出了一套全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案,這是容器技術(shù)領(lǐng)域中一個重大突破和創(chuàng)新。

k8s中的重要概念

Master 節(jié)點

Master 節(jié)點負(fù)責(zé)對集群中所有容器的調(diào)度,各種資源對象的控制,以及響應(yīng)集群的所有請求。

Node 節(jié)點

Node 節(jié)點是 Kubernetes 的工作節(jié)點,負(fù)責(zé)運行業(yè)務(wù)容器。

集群(Cluster)

集群是一組被 Kubernetes 統(tǒng)一管理和調(diào)度的節(jié)點,被 Kubernetes 納管的節(jié)點可以是物理機(jī)或者虛擬機(jī)。集群其中一部分節(jié)點作為 Master 節(jié)點,負(fù)責(zé)集群狀態(tài)的管理和協(xié)調(diào),另一部分作為 Node 節(jié)點,負(fù)責(zé)執(zhí)行具體的任務(wù),實現(xiàn)用戶服務(wù)的啟停等功能。

標(biāo)簽(Label)

Label 是一組鍵值對,每一個資源對象都會擁有此字段。Kubernetes 中使用 Label 對資源進(jìn)行標(biāo)記,然后根據(jù) Label 對資源進(jìn)行分類和篩選。

命名空間(Namespace)

Kubernetes 中通過命名空間來實現(xiàn)資源的虛擬化隔離,將一組相關(guān)聯(lián)的資源放到同一個命名空間內(nèi),避免不同租戶的資源發(fā)生命名沖突,從邏輯上實現(xiàn)了多租戶的資源隔離。

容器組(Pod)

Pod 是 Kubernetes 中的最小調(diào)度單位,它由一個或多個容器組成,一個 Pod 內(nèi)的容器共享相同的網(wǎng)絡(luò)命名空間和存儲卷。Pod 是真正的業(yè)務(wù)進(jìn)程的載體,在 Pod 運行前,Kubernetes 會先啟動一個 Pause 容器開辟一個網(wǎng)絡(luò)命名空間,完成網(wǎng)絡(luò)和存儲相關(guān)資源的初始化,然后再運行業(yè)務(wù)容器。也就是說每個Pod中都運行著一個特殊的被稱為Pause的容器,其他容器則為業(yè)務(wù)容器,這些業(yè)務(wù)容器共享Pause容器的網(wǎng)絡(luò)和Volume掛載卷。后面我們會繼續(xù)對其進(jìn)行重點講解。

無狀態(tài)部署(Deployment)

Deployment 是一組 Pod 的抽象,Deployment用于部署無狀態(tài)的服務(wù),通過Deployment 控制器保障用戶指定數(shù)量的容器副本正常運行,并且實現(xiàn)了滾動更新等高級功能,當(dāng)我們需要更新業(yè)務(wù)版本時,Deployment 會按照我們指定策略自動的殺死舊版本的 Pod 并且啟動新版本的 Pod。

有狀態(tài)部署(StatefulSet)

StatefulSet本質(zhì)上是Deployment的一種變體用于部署有狀態(tài)的服務(wù),它所管理的Pod擁有固定的Pod名稱,啟停順序,在StatefulSet中,Pod名字稱為網(wǎng)絡(luò)標(biāo)識(hostname),還必須要用到共享存儲。

任務(wù)(Job)

Job 可以幫助我們創(chuàng)建一個 Pod 并且保證 Pod 的正常退出,如果 Pod 運行過程中出現(xiàn)了錯誤,Job控制器可以幫助我們創(chuàng)建新的 Pod,直到 Pod 執(zhí)行成功或者達(dá)到指定重試次數(shù)。一種簡單的使用場景下,你會創(chuàng)建一個 Job 對象以一種可靠的方式運行某 Pod 直到完成。當(dāng)?shù)谝粋€ Pod 失敗或者被刪除(比如因為節(jié)點硬件失效或者重啟)時,Job 對象會啟動一個新的 Pod。

服務(wù)(Service)

Service 是一組 Pod 訪問配置的抽象。每個pod有自己的ip地址,當(dāng)有多個pod提供相同的服務(wù)的時候,就需要有負(fù)載均衡的能力,這里就引入了service。

Pod

Pod的理解

Pod:k8s管理的最小單位,包括一個或多個容器,是提供實際業(yè)務(wù)服務(wù)的組件。一個Pod封裝一個應(yīng)用容器(也可以有多個容器),存儲資源、一個獨立的網(wǎng)絡(luò)IP以及管理控制容器運行方式的策略選項。Pod代表部署的一個單位:Kubernetes中單個應(yīng)用的實例,它可能由單個容器或多個容器共享組成的資源。

Pod中運行一個容器?!皁ne-container-per-Pod”模式是Kubernetes最常見的用法; 在這種情況下,你可以將Pod視為單個封裝的容器,但是Kubernetes是直接管理Pod而不是容器。Pods中運行多個需要一起工作的容器。Pod可以封裝緊密耦合的應(yīng)用,它們需要由多個容器組成,它們之間能夠共享資源,這些容器可以形成一個單一的內(nèi)部service單位 - 一個容器共享文件,另一個“sidecar”容器來更新這些文件,如下圖所示。Pod將這些容器的存儲資源作為一個實體來管理。

Pods提供兩種共享資源:網(wǎng)絡(luò)和存儲。

網(wǎng)絡(luò)

每個Pod被分配一個獨立的IP地址,Pod中的每個容器共享網(wǎng)絡(luò)命名空間,包括IP地址和網(wǎng)絡(luò)端口。Pod內(nèi)的容器可以使用localhost相互通信。當(dāng)Pod中的容器與Pod外部通信時,他們必須協(xié)調(diào)如何使用共享網(wǎng)絡(luò)資源(如端口)。

存儲

Pod可以指定一組共享存儲volumes。Pod中的所有容器都可以訪問共享volumes,允許這些容器共享數(shù)據(jù)。volumes?還用于Pod中的數(shù)據(jù)持久化,以防其中一個容器需要重新啟動而丟失數(shù)據(jù)

Pod也是我們在實際工作中接觸最多的東東,特別是pod的資源清單(對應(yīng)的yaml文件),我們在后面會詳細(xì)介紹

ReplicaSet(rs):是Pod的管理控制組件,監(jiān)控Pod的健康狀況,保障Pod按照用戶的期望去運行。rs是ReplicationController組件的升級版,增加了標(biāo)簽選擇器的范圍選擇功能。

Deployment:可管理rs、Pod,實現(xiàn)Pod應(yīng)用的滾動升級和回滾、擴(kuò)容和縮容。

Service:是一種可以訪問 Pod邏輯分組的策略,Service通常是通過 Label Selector訪問 Pod組。集群中Pod的數(shù)量和訪問地址可能是變化的,這些Pod中的業(yè)務(wù)應(yīng)用需要對外提供服務(wù),可通過Service對外提供統(tǒng)一服務(wù)地址,Service通過標(biāo)簽選擇器,匹配一組提供服務(wù)的Pod,從而對客戶端隔離了后端Pod的變化。

Pod生命周期

1、pending:pod已經(jīng)被系統(tǒng)認(rèn)可了,但是內(nèi)部的container還沒有創(chuàng)建出來。這里包含調(diào)度到node上的時間以及下載鏡像的時間,會持續(xù)一小段時間。

2、Running:pod已經(jīng)與node綁定了(調(diào)度成功),而且pod中所有的container已經(jīng)創(chuàng)建出來,至少有一個容器在運行中,或者容器的進(jìn)程正在啟動或者重啟狀態(tài)。--這里需要注意pod雖然已經(jīng)Running了,但是內(nèi)部的container不一定完全可用。因此需要進(jìn)一步檢測container的狀態(tài)。

3、Succeeded:這個狀態(tài)很少出現(xiàn),表明pod中的所有container已經(jīng)成功的terminated了,而且不會再被拉起了。

4、Failed:pod中的所有容器都被terminated,至少一個container是非正常終止的。(退出的時候返回了一個非0的值或者是被系統(tǒng)直接終止)

5、unknown:由于某些原因pod的狀態(tài)獲取不到,有可能是由于通信問題。

一般情況下pod最常見的就是前兩種狀態(tài)。而且當(dāng)Running的時候,需要進(jìn)一步關(guān)注container的狀態(tài)。下面就來看下container的狀態(tài)有哪些

Pod資源清單定義

apiVersion: v1? ???#必選,版本號,例如v1

kind: Pod??????   #必選,資源類型,例如Pod

metadata:??????   #必選,元數(shù)據(jù)

?name: string???? #必選,Pod名稱

?namespace: string? #Pod所屬的命名空間,默認(rèn)為"default"

?labels:??????   ? #自定義標(biāo)簽列表??  ?????????

spec:?#必選,Pod中容器的詳細(xì)定義

?containers:? #必選,Pod中容器列表

? -name: string?? #必選,容器名稱

???image: string? #必選,容器的鏡像名稱

???imagePullPolicy: [ Always|Never|IfNotPresent ]? #獲取鏡像的策略

???command: [string]?? #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令

???args: [string]????? #容器的啟動命令參數(shù)列表

???workingDir: string? #容器的工作目錄

???volumeMounts:?????? #掛載到容器內(nèi)部的存儲卷配置

??? -name: string????? #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名

?????mountPath: string #存儲卷在容器內(nèi)mount的絕對路徑,應(yīng)少于512字符

?????readOnly: boolean #是否為只讀模式

???ports: #需要暴露的端口庫號列表

??? -name: string??????? #端口的名稱

?????containerPort: int? #容器需要監(jiān)聽的端口號

?????hostPort: int?????? #容器所在主機(jī)需要監(jiān)聽的端口號,默認(rèn)與Container相同

?????protocol: string??? #端口協(xié)議,支持TCP和UDP,默認(rèn)TCP

???env:?? #容器運行前需設(shè)置的環(huán)境變量列表

??? -name: string? #環(huán)境變量名稱

?????value: string #環(huán)境變量的值

???resources: #資源限制和請求的設(shè)置

?????limits:? #資源限制的設(shè)置

???????cpu: string???? #Cpu的限制,單位為core數(shù),將用于docker

run --cpu-shares參數(shù)

???????memory: string? #內(nèi)存限制,單位可以為Mib/Gib,將用于docker

run --memory參數(shù)

?????requests: #資源請求的設(shè)置

???????cpu: string??? #Cpu請求,容器啟動的初始可用數(shù)量

???????memory: string #內(nèi)存請求,容器啟動的初始可用數(shù)量

???lifecycle: #生命周期鉤子

?????????????????? postStart:#容器啟動后立即執(zhí)行此鉤子,如果執(zhí)行失敗,會根據(jù)重啟策略進(jìn)行重啟

?????????????????? preStop:#容器終止前執(zhí)行此鉤子,無論結(jié)果如何,容器都會終止

???livenessProbe:? #對Pod內(nèi)各容器健康檢查的設(shè)置,當(dāng)探測無響應(yīng)幾次后將自動重啟該容器

?????exec:??????   #對Pod容器內(nèi)檢查方式設(shè)置為exec方式

???????command: [string]? #exec方式需要制定的命令或腳本

?????httpGet:?????? #對Pod內(nèi)個容器健康檢查方法設(shè)置為HttpGet,需要制定Path、port

???????path: string

???????port: number

???????host: string

???????scheme: string

???????HttpHeaders:

???????- name: string

?????????value: string

?????tcpSocket:???? #對Pod內(nèi)個容器健康檢查方式設(shè)置為tcpSocket方式

????????port: number

??????initialDelaySeconds: 0?????? #容器啟動完成后首次探測的時間,單位為秒

??????timeoutSeconds: 0???   ??? #對容器健康檢查探測等待響應(yīng)的超時時間,單位秒,默認(rèn)1秒

??????periodSeconds: 0????   ??? #對容器監(jiān)控檢查的定期探測時間設(shè)置,單位秒,默認(rèn)10秒一次

??????successThreshold: 0

??????failureThreshold: 0

??????securityContext:

????????privileged: false

?restartPolicy: [Always | Never | OnFailure]? #Pod的重啟策略

?nodeName: #設(shè)置NodeName表示將該Pod調(diào)度到指定到名稱的node節(jié)點上

?nodeSelector: obeject #設(shè)置NodeSelector表示將該Pod調(diào)度到包含這個label的node上

?imagePullSecrets: #Pull鏡像時使用的secret名稱,以key:secretkey格式指定

? -name: string

?hostNetwork: false?? #是否使用主機(jī)網(wǎng)絡(luò)模式,默認(rèn)為false,如果設(shè)置為true,表示使用宿主機(jī)網(wǎng)絡(luò)

?volumes:?? #在該pod上定義共享存儲卷列表

? -name: string??? #共享存儲卷名稱(volumes類型有很多種)

???emptyDir: {}?????? #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值

???hostPath: string?? #類型為hostPath的存儲卷,表示掛載Pod所在宿主機(jī)的目錄

?????path: string?????   ??????? #Pod所在宿主機(jī)的目錄,將被用于同期中mount的目錄

???secret:??????    #類型為secret的存儲卷,掛載集群與定義的secret對象到容器內(nèi)部

?????scretname: string?

?????items:????

?????- key: string

???????path: string

???configMap:???????? #類型為configMap的存儲卷,掛載預(yù)定義的configMap對象到容器內(nèi)部

?????name: string

?????items:

?????- key: string

???????path: string

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

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

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