kubernetes基礎概念知多少
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等。
推薦閱讀
- 開發者不可不知的 Docker 命令
- Linux Namespace淺析
- Linux Cgroup淺析
- Netty 總結篇