Kubernetes筆記 (1) - 系統概述

語言: CN / TW / HK

Kubernetes概述

Kubernetes由google開源,它的開發和設計都深受Google內部久負盛名的系統Borg的影響,而且,它的許多頂級貢獻者之前也是Borg系統的開發者。Borg是Google內部使用的大規模叢集管理系統。

Kubernetes吸取了Borg在過去十數年間積累的經驗和教訓,剛剛面世就立即廣受關注和青睞,目前已經成為容器編排領域事實上的標準。很多人將Kubernetes視為Borg系統的一個開源實現版本。

Kubernetes使用共享網路將多個物理機或虛擬機器彙集到一個叢集中,在各伺服器之間進行通訊,該叢集是配置Kubernetes的所有元件、功能和工作負載的物理平臺。叢集包含Master和Node。 Master Master是叢集的閘道器和中樞,負責諸如為使用者和客戶端暴露API、跟蹤其他伺服器的健康狀態、以最優方式排程工作負載,以及編排其他元件之間的通訊等任務,它是使用者或客戶端與叢集之間的核心聯絡點,並負責Kubernetes系統的大多數集中式管控邏輯。

Node Node是Kubernetes叢集的工作節點,負責接收來自Master的工作指令並根據指令相應地建立或銷燬Pod物件,以及調整網路規則以合理地路由和轉發流量等。

Kubernetes叢集元件

一個典型的Kubernetes叢集由一個或一組Master和多個Node、一個叢集狀態儲存系統(etcd)和add-ons組成。 Kubernetes的系統架構:

Master節點主要由apiserver、controller-manager和scheduler三個元件,以及一個用於叢集狀態儲存的etcd儲存服務組成,而每個Node節點則主要包含kubelet、kube-proxy及容器引擎等元件。

Master元件

API Server

API Server負責輸出RESTful風格的KubernetesAPI,它是發往叢集的所有REST操作命令的接入點,並負責接收、校驗並響應所有的REST請求,結果狀態被持久儲存於etcd中。

Controller Manager

Kubernetes中,叢集級別的大多數功能都是由幾個被稱為控制器的程序執行實現的,這幾個程序被集成於kube-controller-manager守護程序中。由控制器完成的功能主要包括生命週期功能和API業務邏輯.

  • 生命週期功能:包括Namespace建立和生命週期、Event垃圾回收、Pod終止相關的垃圾回收、級聯垃圾回收及Node垃圾回收等。
  • API業務邏輯:例如,由ReplicaSet執行的Pod擴充套件等
Scheduler

在API Server確認Pod物件的建立請求之後,Scheduler就會根據叢集內各節點的可用資源狀態,以及要執行的容器的資源需求做出排程決策。

Cluster State Store

etcd被用作Kubernetes叢集狀態的儲存,etcd是獨立的服務元件,並不隸屬於Kubernetes叢集自身。生產環境中應該以etcd叢集的方式執行以確保其服務可用性。

Node元件

kubelet

kubelet是Node的核心代理程式,它是運行於工作節點之上的守護程序,從API Server接收關於Pod物件的配置資訊並確保它們處於期望的狀態(desired state)。kubelet會在API Server上註冊當前工作節點,定期向Master彙報節點資源使用情況,並通過cAdvisor監控容器和節點的資源佔用狀況。

容器執行時環境

每個Node都需要容器執行時(ContainerRuntime)環境,才能下載映象、啟動容器。kubelet以外掛的方式載入配置的容器環境,目前支援Docker、RKT、cri-o和Fraki等容器環境。

kube-proxy

每個Node都需要執行一個kube-proxy守護程序,它能夠按需為Service資源物件生成iptables或ipvs規則,從而捕獲訪問當前Service的ClusterIP的流量並將其轉發至正確的後端Pod物件。

Addons

Kubernetes叢集還依賴於一系列add-ons以提供完整的功能,它們通常是由第三方提供的特定應用程式,且託管運行於Kubernetes叢集之上,比如

  • KubeDNS:在Kubernetes叢集中排程執行提供DNS服務的Pod,同一叢集中的其他Pod可使用此DNS服務解析主機名。
  • Kubernetes Dashboard:可以通過Dashboard來管理叢集中的應用甚至是叢集自身。
  • Heapster:容器和節點的效能監控與分析系統,其功能會逐漸由Prometheus結合其他元件所取代。
  • Ingress Controller:與負載均衡相關。

Kubernetes網路模型基礎

雲端計算的核心是虛擬化技術,網路虛擬化技術又是其最重要的組成部分,用於在物理網路上虛擬多個相互隔離的虛擬網路,實現網路資源切片,提高網路資源利用率,實現彈性化網路。

為了提供更靈活的解決方式,Kubernetes的網路模型需要藉助於外部外掛實現,它要求任何實現機制都必須滿足以下需求:

  • 所有Pod間均可不經NAT(網路地址轉換)機制而直接通訊
  • 所有節點均可不經NAT機制而直接與所有容器通訊
  • 容器自己使用的IP也是其他容器或節點直接看到的地址,所有Pod物件都位於同一平面網路中,而且可以使用Pod自身的地址直接通訊。

Kubernetes叢集包含三種網路:

  • 各主機(Master、Node和etcd等)自身所屬的網路,用於各主機之間的通訊,其地址配置於主機的網路介面,且在Kubernetes叢集構建之前就已配置好,它並不能由Kubernetes管理。
  • 專用於Pod資源物件的網路,它是一個虛擬網路,用於為各Pod物件設定IP地址等網路引數,其地址配置於Pod中容器的網路介面之上。Pod網路需要藉助kubenet外掛或CNI外掛實現,外掛可獨立部署於Kubernetes叢集之外,也可託管於Kubernetes之上,在建立Pod物件時由其自動完成各網路引數(Pod IP)的動態配置。
  • 專用於Service資源物件的網路,也是虛擬網路,用於為Kubernetes叢集之中的Service配置IP地址,但此地址並不配置於任何主機或容器的網路介面之上,而是通過Node之上的kube-proxy配置為iptables或ipvs規則,從而將發往此地址的所有流量排程至其後端的各Pod物件之上。Service網路在Kubernetes叢集建立時予以指定,而各Service的地址(Cluster IP)則在使用者建立Service時予以動態配置。

綜上,Kubernetes為Pod和Service資源物件分別使用了各自的專用網路,Pod網路由Kubernetes的網路外掛配置實現,而Service的網路則由Kubernetes叢集予以指定。

學習資料

《Kubernetes實戰進階》 馬永亮著

分享到: