kubernetes基礎概念知多少

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

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

總結來看,k8s特色以下:api

  • 自動裝箱:基於容器,結合調度策略將多種應用部署到同一節點上,提升資源利用率;
  • 自我修復:支持故障轉移/重啓,具備健康檢查機制;
  • 水平擴展:經過命令手動執行擴容,可基於CPU等資源負載率來動態實現伸縮容;
  • 服務發現/負載均衡:經過KubeDNS(或CoreDNS)爲系統內置了服務發現功能,爲每一個service配置DNS名稱,service經過iptables或ipvs內建了負載均衡機制;
  • 自動部署:自動發佈和回滾,支持灰度、增量發佈等;
  • 配置管理:ConfigMap實現了配置數據與Docker鏡像解耦,爲開發部署提供了良好的靈活性;
  • 批處理:除了管理服務型應用以外,Kubernetes還支持批處理做業及CI(持續集成)。

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

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

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包含組件以下:spa

  • 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資源:3d

  • 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等。

推薦閱讀

相關文章
相關標籤/搜索