1. 程式人生 > >Kubernetes(k8s)學習筆記1

Kubernetes(k8s)學習筆記1

Kubernetes(k8s,8代表了中間八個字母)是Google基於Borg開源的容器編排排程引擎,作為CNCF(Cloud Native Computing Foundation)最重要的元件之一,它的目標不僅僅是一個編排系統,而是提供一個規範,可以讓你來描述叢集的架構,定義服務的最終狀態,kubernetes可以幫你將系統自動得達到和維持在這個狀態。

在Kubenetes中,所有的容器均在Pod中執行,一個Pod可以承載一個或者多個相關的容器,同一個Pod中的容器會部署在同一個物理機器上並且能夠共享資源。一個Pod也可以包含O個或者多個磁碟卷組(volumes),這些卷組將會以目錄的形式提供給一個容器,或者被所有Pod中的容器共享,對於使用者建立的每個Pod,系統會自動選擇那個健康並且有足夠容量的機器,然後建立類似容器的容器,當容器建立失敗的時候,容器會被node agent自動的重啟,這個node agent叫kubelet,但是,如果是Pod失敗或者機器故障,它不會自動的轉移並且啟動,除非使用者定義了 replication controller。

使用者可以自己建立並管理Pod,Kubernetes將這些操作簡化為兩個操作:基於相同的Pod配置檔案部署多個Pod複製品;建立可替代的Pod當一個Pod掛了或者機器掛了的時候。而Kubernetes API中負責來重新啟動,遷移等行為的部分叫做“replication controller”,它根據一個模板生成了一個Pod,然後系統就根據使用者的需求建立了許多冗餘,這些冗餘的Pod組成了一個整個應用,或者服務,或者服務中的一層。一旦一個Pod被建立,系統就會不停的監控Pod的健康情況以及Pod所在主機的健康情況,如果這個Pod因為軟體原因掛掉了或者所在的機器掛掉了,replication controller 會自動在一個健康的機器上建立一個一摸一樣的Pod,來維持原來的Pod冗餘狀態不變,一個應用的多個Pod可以共享一個機器。

我們經常需要選中一組Pod,例如,我們要限制一組Pod的某些操作,或者查詢某組Pod的狀態,作為Kubernetes的基本機制,使用者可以給Kubernetes Api中的任何物件貼上一組 key:value的標籤,然後,我們就可以通過標籤來選擇一組相關的Kubernetes Api 物件,然後去執行一些特定的操作,每個資源額外擁有一組(很多) keys 和 values,然後外部的工具可以使用這些keys和vlues值進行物件的檢索,這些Map叫做annotations(註釋)。

Kubernetes設計架構

Kubernetes叢集包含有節點代理kubelet和Master元件(APIs, scheduler, etc),一切都基於分散式的儲存系統。
這裡寫圖片描述
Kubernetes節點

Kubernetes架構中的服務分為執行在工作節點上的服務和組成叢集級別控制板的服務。

Kubernetes節點有執行應用容器必備的服務,而這些都是受Master的控制。

每個節點上當然都要執行Docker。Docker來負責所有具體的映像下載和容器執行。

Kubernetes主要由以下幾個核心元件組成:

etcd儲存了整個叢集的狀態;
apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;
controller manager負責維護叢集的狀態,比如故障檢測、自動擴充套件、滾動更新等;
scheduler負責資源的排程,按照預定的排程策略將Pod排程到相應的機器上;
kubelet負責維護容器的生命週期,同時也負責Volume(CVI)和網路(CNI)的管理;
Container runtime負責映象管理以及Pod和容器的真正執行(CRI);
kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;

這裡寫圖片描述

這裡寫圖片描述

kubelet

kubelet負責管理pods和它們上面的容器,images映象、volumes、etc。

kube-proxy

每一個節點也執行一個簡單的網路代理和負載均衡(詳見services FAQ )(PS:官方 英文)。 正如Kubernetes API裡面定義的這些服務(詳見the services doc)(PS:官方 英文)也可以在各種終端中以輪詢的方式做一些簡單的TCP和UDP傳輸。

服務端點目前是通過DNS或者環境變數( Docker-links-compatible 和 Kubernetes{FOO}_SERVICE_HOST 及 {FOO}_SERVICE_PORT 變數都支援)。這些變數由服務代理所管理的埠來解析。

Kubernetes控制面板

Kubernetes控制面板可以分為多個部分。目前它們都執行在一個master 節點,然而為了達到高可用性,這需要改變。不同部分一起協作提供一個統一的關於叢集的檢視。

etcd

所有master的持續狀態都存在etcd的一個例項中。這可以很好地儲存配置資料。因為有watch(觀察者)的支援,各部件協調中的改變可以很快被察覺。

Kubernetes API Server

API服務提供Kubernetes API (PS:官方 英文)的服務。這個服務試圖通過把所有或者大部分的業務邏輯放到不兩隻的部件中從而使其具有CRUD特性。它主要處理REST操作,在etcd中驗證更新這些物件(並最終儲存)。

Scheduler

排程器把未排程的pod通過binding api繫結到節點上。排程器是可插拔的,並且我們期待支援多叢集的排程,未來甚至希望可以支援使用者自定義的排程器。

Kubernetes控制管理伺服器

所有其它的叢集級別的功能目前都是由控制管理器所負責。例如,端點物件是被端點控制器來建立和更新。這些最終可以被分隔成不同的部件來讓它們獨自的可插拔。