偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Kubernetes核心概念與組件

開發(fā) 前端
Kubernetes是一個開源的容器編排引擎,用來對容器化應用進行自動化部署、 擴縮和管理。然而并非所有項目都需要微服務化,也并非所有項目需要Kubernetes,例如管理后臺、定時任務服務、非分布式數(shù)據(jù)庫等就沒有必要容器化部署,Kubernetes更適合部署分布式微服務應用。

[[382149]]

 Kubernetes是一個開源的容器編排引擎,用來對容器化應用進行自動化部署、 擴縮和管理。然而并非所有項目都需要微服務化,也并非所有項目需要Kubernetes,例如管理后臺、定時任務服務、非分布式數(shù)據(jù)庫等就沒有必要容器化部署,Kubernetes更適合部署分布式微服務應用。

這兩天筆者看完了《Kubernetes源碼剖析》這本書,由于Kubernetes是用go語言編寫,很多Java程序員可能沒學過go語言,為了分享這本書,筆者摘錄了書中的一些關鍵知識點整理成這篇文章,也希望通過這篇文章幫助大家理解Kubernetes。

(之前公司內(nèi)部技術分享畫的學習路線思維導圖)

Kubernetes架構

圖片 (圖片來源:《Kubernetes源碼剖析》.Kubernetes架構圖)

Kubernetes系統(tǒng)采用C/S架構設計,系統(tǒng)架構分為Master、Node兩部分,Master為Server端(主控節(jié)點),Node為Client端(工作節(jié)點)。

Master主控節(jié)點作為集群的大腦負責管理所有工作節(jié)點(Node)、負責調(diào)度Pod運行在哪些工作節(jié)點上、負責控制集群運行過程中的所有狀態(tài),其中節(jié)點表示云虛擬服務器。

Node工作節(jié)點負責管理容器、監(jiān)控和上報運行在本節(jié)點上的所有Pod的運行狀態(tài)。

運行在Master主控節(jié)點上的組件有kube-apiserver、kube-controller-manager、kube-scheduler組件。

kube-apiserver負責將Kubernetes“資源組/資源版本/資源”以RESTful風格的形式對外暴露并提供服務。集群中的所有組件都通過kube-apiserver組件操作資源對象。kube-apiserver組件也是集群中唯一與Etcd集群進行交互的核心組件。

kube-controller-manager管理Kubernetes集群中的節(jié)點(Node)、Pod副本、服務、端點(Endpoint)、命名空間(Namespace)、服務賬戶(ServiceAccount)等。負責確保Kubernetes系統(tǒng)的實際狀態(tài)收斂到所需狀態(tài),其默認提供了一些控制器(Controller),例如DeploymentControllers控制器、StatefulSet控制器、Namespace控制器及PersistentVolume控制器等,每個控制器通過kube-apiserver組件提供的接口實時監(jiān)控整個集群每個資源對象的當前狀態(tài),當發(fā)生故障而導致系統(tǒng)狀態(tài)出現(xiàn)變化時,嘗試將系統(tǒng)狀態(tài)修復到期望狀態(tài)。

kube-scheduler調(diào)度器組件負責在Kubernetes集群中為一個Pod資源對象找到合適的節(jié)點并在該節(jié)點上運行。調(diào)度器每次只調(diào)度一個Pod資源對象,為每一個Pod資源對象尋找合適節(jié)點的過程是一個調(diào)度周期。調(diào)度器組件監(jiān)控整個集群的Pod資源對象和Node資源對象,在監(jiān)控到新的Pod資源對象時通過調(diào)度算法為其選擇最優(yōu)節(jié)點。

運行在Node工作節(jié)點上的組件有kubelet、kube-proxy、container組件。

kubelet負責接收、處理、上報kube-apiserver組件下發(fā)的任務。kubelet進程啟動時會向kube-apiserver注冊節(jié)點(Node)自身信息。它主要負責所在節(jié)點(Node)上的Pod資源對象的創(chuàng)建、修改、監(jiān)控、刪除、驅(qū)逐及Pod生命周期管理等。kubelet組件實現(xiàn)了3種開放接口,分別是CRI(容器運行時接口)、CNI(容器網(wǎng)絡接口)和CSI(容器存儲接口)。

kube-proxy作為節(jié)點上的網(wǎng)絡代理,運行在每個Kubernetes節(jié)點上。它監(jiān)控kube-apiserver的服務和端點資源變化,并通過iptables/ipvs等配置負載均衡器,為一組Pod提供統(tǒng)一的TCP/UDP流量轉發(fā)和負載均衡功能,但只會向Kubernetes服務及其后端Pod發(fā)出請求。

資源概念

在kubernetes中,資源是最核心的概念,整個生態(tài)系統(tǒng)都圍繞資源運作。Kubernetes本質(zhì)上是一個資源控制系統(tǒng),負責注冊、管理、調(diào)度資源并維護資源的狀態(tài)。

Kubernetes將資源分組和版本化:

  • Group:資源組
  • Version:資源版本
  • Resource:資源
  • Kind:資源種類(分類)

資源對象與資源操作方法:

  • 資源對象(Resource Object):一個資源對象包含的字段有資源組、資源版本、資源種類;
  • 資源操作方法(Verbs):每一個資源都擁有資源操作方法,實現(xiàn)對Etcd的CURD操作,kubernetes支持的8種資源操作方法是create、delete、deletecollection、get、list、patch、update、watch。

Kubernetes支持兩類資源組,分別是擁有組名的資源組和沒有組名的資源組:

擁有組名的資源組:其表現(xiàn)形式為//,例如apps/v1/deployments;

沒有組名的資源組:核心資源組,其表現(xiàn)形式為/,例如/v1/pods。

Kubernetes提供的Restful API使用GVR(資源分組/資源版本/資源)生成path,如下表格示例:

PATH 資源 資源操作方法
/api/v1/configmaps ConfigMap create,delete,deletecollection,get,list,patch,update,watch
/api/v1/pods Pod create,delete,deletecollection,get,list,patch,update,watch
/api/v1/services Service create,delete,deletecollection,get,list,patch,update,watch

擁有組名的資源組的path以/apis為前綴,沒有組名的資源組的path以/api為前綴。以/api/v1/configmaps為例,v1為資源版本號、configmaps為資源名稱。

資源還可以擁有子資源,例如pods有l(wèi)ogs子資源。用kubectl查詢?nèi)沼泟t命令為kubectl logs [pod],對應API的path為:/api/v1/pods/logs。

kubernetes支持8種資源操作方法,但并非每種資源都需要支持8種資源操作方法。如pods/logs子資源就只擁有get操作方法,因為日志只需要執(zhí)行查看操作。

Kubernetes系統(tǒng)支持命名空間(Namespace),每個命名空間相當于一個“虛擬集群”,不同命名空間之間可以進行隔離。命名空間常用于劃分不同的環(huán)境,例如生產(chǎn)環(huán)境、測試環(huán)境、開發(fā)環(huán)境等使用不同的命名空間進行劃分,也可用于劃分無關聯(lián)的項目,如用于劃分項目A、項目B。

資源對象描述文件定義

Kubernetes資源可分為內(nèi)置資源和自定義資源,它們都通過資源對象描述文件進行定義。一個資源對象需要用5個字段來描述,分別是Group/Version、Kind、MetaData、Spec、Status。

以Service資源描述文件為例,配置如下:

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata: 
  4.   name: test-service 
  5.   namespace: default 
  6. spec: 
  7.   .... 
  • apiVersion:即Group/Version,Service在核心資源組,所以沒有資源組名,v1為資源版本;
  • Kind:資源種類;
  • MetaData:定義元數(shù)據(jù)信息,如資源名稱、命名空間;
  • Spec:描述Service的期望狀態(tài);
  • Status:描述資源對象的實際狀態(tài),隱藏的,不需要配置,由Kubernetes系統(tǒng)提供和更新。

Pod調(diào)度

Pod資源對象支持優(yōu)先級與搶占機制。當kube-scheduler調(diào)度器運行時,根據(jù)Pod資源對象的優(yōu)先級進行調(diào)度,高優(yōu)先級的Pod資源對象排在調(diào)度隊列的前面,優(yōu)先獲得合適的節(jié)點(Node),再為低優(yōu)先級的Pod資源對象選擇合適的節(jié)點。

當高優(yōu)先級的Pod資源對象沒有找到合適的節(jié)點時,調(diào)度器會嘗試搶占低優(yōu)先級的Pod資源對象的節(jié)點,搶占過程是將低優(yōu)先級的Pod資源對象從所在的節(jié)點上驅(qū)逐走,使高優(yōu)先級的Pod資源對象運行在該節(jié)點上,被驅(qū)逐走的低優(yōu)先級的Pod資源對象會重新進入調(diào)度隊列并等待再次選擇合適的節(jié)點。

在默認的情況下,若不啟用優(yōu)先級功能,則現(xiàn)有Pod資源對象的優(yōu)先級都為0。為Pod資源配置優(yōu)先級的步驟如下:

1、通過PriorityClass資源對象描述文件創(chuàng)建PriorityClass資源對象,配置文件如下:

  1. apiVersion: scheduling.k8s.io/v1 
  2. kind: PriorityClass 
  3. metadata: 
  4.  name: MainResourceHighPriority 
  5. value: 10000 
  6. globalDefault: false 
  7. description: "highest priority" 
  • value:表示優(yōu)先級,值越高優(yōu)先級越高;
  • globalDefault:是否為全局默認,當Pod沒有指定使用的優(yōu)先級時默認使用此優(yōu)先級。
  • 2、修改Pod資源對象描述文件,為Pod指定優(yōu)先級

通過Deployment配置Pod資源時,只需要在Deployment描述文件的Spec下的Spec添加一項名為priorityClassName的配置,如下:

  1. apiVersion: apps/v1 
  2. kind: Deployment 
  3. metadata: 
  4.   name: test-server 
  5.   namespace: default 
  6. spec: 
  7.   replicas: 1 
  8.     # 配置pod 
  9.     spec: 
  10.       containers: 
  11.         - name: test-server-pod 
  12.           image: test-server:latest 
  13.           imagePullPolicy: IfNotPresent 
  14.           ports: 
  15.             - name: http-port 
  16.               containerPort: 8080 
  17.           envFrom: 
  18.             - configMapRef: 
  19.                 name: common-config 
  20.       serviceAccountName: admin-sa 
  21.       priorityClassName: MainResourceHighPriority 

親和性調(diào)度

與調(diào)度相關的還有親和性調(diào)度。kube-scheduler調(diào)度器自動為Pod資源對象選擇全局最優(yōu)或局部最優(yōu)節(jié)點(即節(jié)點的硬件資源足夠多、節(jié)點負載足夠小等)。在生產(chǎn)環(huán)境中,一般希望能夠更多地干預Pod資源對象的調(diào)度,例如,將不需要依賴GPU硬件資源的Pod資源對象分配給沒有GPU硬件資源的節(jié)點,將需要依賴GPU硬件資源的Pod資源對象分配給具有GPU硬件資源的節(jié)點。開發(fā)者只需要在這些節(jié)點上打上相應的標簽,然后調(diào)度器就可以通過標簽進行Pod資源對象的調(diào)度,這種調(diào)度策略被稱為親和性和反親和性調(diào)度。

  • 親和性(Affinity):用于多業(yè)務就近部署,例如允許將兩個業(yè)務(如廣告點擊服務與IP查詢服務)的Pod資源對象盡可能地調(diào)度到同一個節(jié)點上,減少網(wǎng)絡開銷;
  • 反親和性(Anti-Affinity):允許將一個業(yè)務的Pod資源對象的多副本實例調(diào)度到不同的節(jié)點上,以實現(xiàn)高可用性,例如訂單服務的POD期望有三個副本,將三個副本部署在不同的節(jié)點上。

Pod資源對象目前支持兩種親和性和一種反親和性:

  • NodeAffinity:節(jié)點親和性,將某個Pod資源對象調(diào)度到特定的節(jié)點上,如需要GPU的POD調(diào)度到有GPU的節(jié)點上;
  • PodAffinity:Pod資源對象親和性,將某個Pod資源對象調(diào)度到與另一個Pod資源對象相鄰的位置,例如調(diào)度到同一主機,調(diào)度到同一硬件集群,調(diào)度到同一機房,以縮短網(wǎng)絡傳輸延時;
  • PodAntiAffinity:Pod資源對象反親和性,將一個Pod資源對象的多副本實例調(diào)度到不同的節(jié)點上,調(diào)度到不同的硬件集群上等,這樣可以降低風險并提升Pod資源對象的可用性。

內(nèi)置調(diào)度算法

kube-scheduler調(diào)度器默認提供了兩類調(diào)度算法,分別是預選調(diào)度算法和優(yōu)選調(diào)度算法。

  • 預選調(diào)度算法:檢查節(jié)點是否符合運行“待調(diào)度Pod資源對象”的條件,如果符合條件,則將其加入可用節(jié)點列表;
  • 優(yōu)選調(diào)度算法:為每一個可用節(jié)點計算出一個最終分數(shù),kube-scheduler調(diào)度器會將分數(shù)最高的節(jié)點作為最優(yōu)運行“待調(diào)度Pod資源對象”的節(jié)點。

本文轉載自微信公眾號「Java藝術」,可以通過以下二維碼關注。轉載本文請聯(lián)系Java藝術公眾號。

 

責任編輯:武曉燕 來源: Java藝術
相關推薦

2022-01-27 13:47:10

Kubernete命令Linux

2020-08-06 08:16:26

Kubernetes架構開源

2020-08-06 08:26:22

Kubernetes架構開發(fā)

2019-05-28 12:03:59

vuejavascript前端

2025-04-01 00:54:00

2015-08-27 13:23:42

CoreOSKubernetesKubelet

2025-05-23 10:38:43

2021-09-10 15:16:19

Kubernetes核心組件運維

2015-08-18 08:55:03

redux核心

2023-09-07 10:38:08

Kubernetes控制器

2021-04-14 09:33:58

Kubernetes通信網(wǎng)絡模型

2025-03-07 10:23:46

2016-01-04 11:18:00

KubernetesKubernetes概容器技術

2018-02-02 16:32:10

KubernetesDocker命令

2025-02-17 03:05:00

2016-11-29 09:38:06

Flume架構核心組件

2016-11-25 13:26:50

Flume架構源碼

2009-06-10 13:19:21

J2EE核心APIJ2EE核心組件

2009-07-17 12:54:13

2023-08-24 10:33:19

serviceexportsinfo類
點贊
收藏

51CTO技術棧公眾號