測試技能提升篇—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可以管理運維容器(docker) 下圖是k8s的整體架構(gòu):

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

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

集群(Cluster)
集群是一組被 Kubernetes 統(tǒng)一管理和調(diào)度的節(jié)點,被 Kubernetes 納管的節(jié)點可以是物理機或者虛擬機。集群其中一部分節(jié)點作為 Master 節(jié)點,負責(zé)集群狀態(tài)的管理和協(xié)調(diào),另一部分作為 Node 節(jié)點,負責(zé)執(zhí)行具體的任務(wù),實現(xiàn)用戶服務(wù)的啟停等功能。
標(biāo)簽(Label)
Label 是一組鍵值對,每一個資源對象都會擁有此字段。Kubernetes 中使用 Label 對資源進行標(biāo)記,然后根據(jù) Label 對資源進行分類和篩選。
命名空間(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ù)進程的載體,在 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ù)對其進行重點講解。
無狀態(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í)行成功或者達到指定重試次數(shù)。一種簡單的使用場景下,你會創(chuàng)建一個 Job 對象以一種可靠的方式運行某 Pod 直到完成。 當(dāng)?shù)谝粋€ Pod 失敗或者被刪除(比如因為節(jié)點硬件失效或者重啟)時,Job 對象會啟動一個新的 Pod。
服務(wù)(Service)
Service 是一組 Pod 訪問配置的抽象。每個pod有自己的ip地址,當(dāng)有多個pod提供相同的服務(wù)的時候,就需要有負載均衡的能力,這里就引入了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文件),我們在后面會詳細介紹。
- ReplicaSet(rs):是Pod的管理控制組件,監(jiān)控Pod的健康狀況,保障Pod按照用戶的期望去運行。rs是ReplicationController組件的升級版,增加了標(biāo)簽選擇器的范圍選擇功能。
- Deployment:可管理rs、Pod,實現(xiàn)Pod應(yīng)用的滾動升級和回滾、擴容和縮容。
- 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生命周期
- pending:pod已經(jīng)被系統(tǒng)認可了,但是內(nèi)部的container還沒有創(chuàng)建出來。這里包含調(diào)度到node上的時間以及下載鏡像的時間,會持續(xù)一小段時間。
- Running:pod已經(jīng)與node綁定了(調(diào)度成功),而且pod中所有的container已經(jīng)創(chuàng)建出來,至少有一個容器在運行中,或者容器的進程正在啟動或者重啟狀態(tài)。--這里需要注意pod雖然已經(jīng)Running了,但是內(nèi)部的container不一定完全可用。因此需要進一步檢測container的狀態(tài)。
- Succeeded:這個狀態(tài)很少出現(xiàn),表明pod中的所有container已經(jīng)成功的terminated了,而且不會再被拉起了。
- Failed:pod中的所有容器都被terminated,至少一個container是非正常終止的。(退出的時候返回了一個非0的值或者是被系統(tǒng)直接終止)
- unknown:由于某些原因pod的狀態(tài)獲取不到,有可能是由于通信問題。
一般情況下pod最常見的就是前兩種狀態(tài)。而且當(dāng)Running的時候,需要進一步關(guān)注container的狀態(tài)。下面就來看下container的狀態(tài)有哪些
Pod資源清單定義
- apiVersion: v1 #必選,版本號,例如v1
- kind: Pod #必選,資源類型,例如 Pod
- metadata: #必選,元數(shù)據(jù)
- name: string #必選,Pod名稱
- namespace: string #Pod所屬的命名空間,默認為"default"
- labels: #自定義標(biāo)簽列表
- spec: #必選,Pod中容器的詳細定義
- 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 #容器所在主機需要監(jiān)聽的端口號,默認與Container相同
- protocol: string #端口協(xié)議,支持TCP和UDP,默認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ù)重啟策略進行重啟
- 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)的超時時間,單位秒,默認1秒
- periodSeconds: 0 #對容器監(jiān)控檢查的定期探測時間設(shè)置,單位秒,默認10秒一次
- successThreshold: 0
- failureThreshold: 0
- securityContext:
- privileged: false
- restartPolicy: [Always | Never | OnFailure] #Pod的重啟策略
- nodeName: <string> #設(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 #是否使用主機網(wǎng)絡(luò)模式,默認為false,如果設(shè)置為true,表示使用宿主機網(wǎng)絡(luò)
- volumes: #在該pod上定義共享存儲卷列表
- - name: string #共享存儲卷名稱 (volumes類型有很多種)
- emptyDir: {} #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值
- hostPath: string #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄
- path: string #Pod所在宿主機的目錄,將被用于同期中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


































