kubernetes基礎概念知多少

 戳藍字「TopCoder」關注我們哦!

kubernetes(簡稱k8s)是一種用於在一組主機上運行和協同容器化應用程序的管理平臺,皆在提供高可用、高擴展性和可預測性的方式來管理容器應用的生命週期。通過k8s,用戶可以定義程序運行方式、部署升級策略、動態伸縮容,使得用戶以一種更靈活可靠的方式來管理應用程序。

關於k8s,是一種對應用服務的打包、部署、監控等一整套生命週期的自動化管理平臺,目前各大公司已在生產環境部署使用,同時k8s社區比較活躍,在未來一段時間內會越來越流行,可以說是以後服務部署的事實標準,對於Java開發者來說,你可以不直接使用它,但是不能不瞭解它。

總結來看,k8s特點如下:

  • 自動裝箱:基於容器,結合調度策略將多種應用部署到同一節點上,提高資源利用率;

  • 自我修復:支持故障轉移/重啓,具有健康檢查機制;

  • 水平擴展:通過命令手動執行擴容,可基於CPU等資源負載率來動態實現伸縮容;

  • 服務發現/負載均衡:通過KubeDNS(或CoreDNS)爲系統內置了服務發現功能,爲每個service配置DNS名稱,service通過iptables或ipvs內建了負載均衡機制;

  • 自動部署:自動發佈和回滾,支持灰度、增量發佈等;

  • 配置管理:ConfigMap實現了配置數據與Docker鏡像解耦,爲開發部署提供了良好的靈活性;

  • 批處理:除了管理服務型應用之外,Kubernetes還支持批處理作業及CI(持續集成)。

從k8s的角度看,它把各個待管理的資源進行了抽象,比如針對服務器(物理機或者虛擬機)抽象出Node;對於容器不直接管理而是抽象出Pod來管理容器;對於集羣內的服務調用,抽象出service來表示同類型的多個Pod,同時提供負載均衡策略等。

對於初學者來說,k8s的一些抽象資源和基本概念可能會造成一頭霧水,本文就k8s的基礎概念和組件進行簡單分析,讓初學者更快了解k8s概念,話不多說,let‘s go~

k8s基礎概念

k8s使用共享網絡將多個物理機(或者虛擬機)彙集到一個集羣中,該集羣是配置k8s所有組件、功能和工作負載的物理平臺。集羣中一臺服務器會作爲master負責管理整個集羣(爲了master高可用一般會將master部署成多節點)。

Master是集羣的網關和中樞,負責諸如爲用戶和客戶端暴露API、跟蹤其他服務器的健康狀態、以最優方式調度工作負載,以及編排其他組件之間的通信等任務,它是用戶/客戶端與集羣之間的核心聯絡點,並負責Kubernetes系統的大多數集中式管控邏輯。單個Master節點即可完成其所有的功能,但出於冗餘及負載均衡等目的,生產環境中通常需要協同部署多個此類主機。Node是Kubernetes集羣的工作節點,負責接收來自Master的工作指令並根據指令相應地創建或銷燬Pod對象,以及調整網絡規則以合理地路由和轉發流量等。理論上講,Node可以是任何形式的計算設備,不過Master會統一將其抽象爲Node對象進行管理。

幾種資源抽象

  • Pod:k8s管理的最小調度單元,k8s不直接來管理容器,使用一個抽象的資源對象來封裝一個或者多個容器,這個抽象即爲Pod。同一Pod中的容器共享網絡名稱空間和存儲資源,這些容器可經由本地迴環接口lo直接通信,同時對於Mount、User及PID等資源也進行了隔離;

  • 標籤資源和標籤選擇器:標籤(Label)是將資源進行分類的標識符,k8s的Pod資源選擇大都是基於標籤來的,一個對象可以擁有多個標籤,一個標籤也可以附加於多個對象(通常是同一類對象)之上。標籤選擇器(Selector)全稱爲“Label Selector”,它是一種根據Label來過濾符合條件的資源對象的機制;

  • Controller:Pod控制器,儘管Pod是k8s的最小調度單元,但用戶通常並不會直接部署及管理Pod對象,而是要藉助於另一類抽象——控制器(Controller)對其進行管理,k8s的控制器包括ReplicationController、ReplicaSet、Deployment、StatefulSet、Job等,每種controller都有對應的功能(比如Deployment是最常見的無狀態應用的控制器,它支持應用的擴縮容、滾動更新等操作,爲容器化應用賦予了極具彈性的功能);

  • Service:Service是建立在一組Pod對象之上的資源抽象,它通過標籤選擇器選定一組Pod對象,併爲這組Pod對象定義一個統一的固定訪問入口(通常是一個IP地址);

  • 存儲卷:一般是獨立於容器文件系統之外的存儲空間,常用於擴展容器的存儲空間併爲它提供持久存儲能力,大體上可分爲臨時卷、本地卷和網絡卷;

  • Name和Namespace:名稱是網絡資源的唯一標識符,通常在一個命名空間內,名稱標識是唯一的,名稱空間通常用於實現租戶或項目的資源隔離,從而形成邏輯分組;

  • Ingress:k8s中將Pod進行了網絡隔離,如果需要開放一些Pod供外部使用,則需要一個配置一個流量進入k8s集羣內的通道,除了Service外,Ingress也是實現策略之一。

k8s組件

一個典型的k8s集羣由master節點、多個工作節點和ETCD組成,其中ETCD作爲集羣狀態存儲。master節點負責整個集羣的管理工作,爲集羣提供管理API,並負責編排和監控各工作節點,各工作節點已Pod形式管理運行容器。master主要由apiserver、controller-manager和scheduler三個組件組成,同時負責與ETCD教育存儲集羣狀態數據,而每個工作節點主要包含kubelet、kube-proxy及容器引擎(最常見的是Docker)等組件。各個組件整體如下圖:

master節點

master包含組件如下:

  • API server:對外提供restful api,k8s集羣的網關;

  • Controller:Pod控制器,k8s通過控制器來管理Pod資源,控制器包括ReplicationController、ReplicaSet、Deployment、StatefulSet、Job等,每種controller都有對應的功能(比如Deployment是最常見的無狀態應用的控制器,它支持應用的擴縮容、滾動更新等操作,爲容器化應用賦予了極具彈性的功能);

  • Scheduler:K8s調度器,K8s管理成千上萬容器資源,api server接收到請求之後就由Scheduler按照對應調度策略進行在不同Node間的請求調度操作;

  • ETCD:k8s集羣狀態都是存儲在etcd中(通過API Server共享給集羣的各組件及客戶端),通過etcd的watch機制來進行k8s各組件的協同操作,一般etcd通過集羣部署方式保證高可用。

node節點

node節點接受master的管理,負責管理各個Pod資源:

  • kubelet:kubelet是node的守護進程,node接受master的管控,Kubelet會向api server註冊當前node,定期向master會報node資源佔用情況;

  • 容器運行環境:node會提供一個容器運行環境,負責下載並運行容器,k8s目前支持的容器運行環境包括Docker、RKT、cri-o和Fraki等;

  • kube-proxy:每個node都需要一個kube-proxy進程,比如對service按需生成iptables或ipvs規則,控制流量訪問。

核心組件

k8s除了etcd、master、node這幾個組件之外,還有一些核心組件,如下:

  • DNS服務:目前k8s使用的是coreDNS,之前使用的是KubeDNS;

  • Kubernetes Dashboard:k8s的管理web UI;

  • Heapster:容器和節點的性能監控與分析系統,它收集並解析多種指標數據,如資源利用率、生命週期事件等。新版本的Kubernetes中,其功能會逐漸由Prometheus結合其他組件所取代。

  • Ingress Controller:Service是一種工作於傳統層的負載均衡器,而Ingress是在應用層實現的HTTP(s)負載均衡機制。不過,Ingress資源自身並不能進行“流量穿透”,它僅是一組路由規則的集合,這些規則需要通過Ingress控制器(Ingress Controller)發揮作用。目前,此類的可用項目有Nginx、Traefik、Envoy及HAProxy等。

 推薦閱讀 


歡迎小夥伴關注【TopCoder】閱讀更多精彩好文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章