Kubernetes(k8s)基礎概念介紹

語言: CN / TW / HK

一、簡介

Kubernetes是容器叢集管理系統工具,是一個開源的平臺,可以實現容器叢集的自動化部署、自動擴縮容、維護等功能。Kubernetes的名字來自希臘語,意思是“舵手” 或 “領航員”,K8s是將8個字母“ubernete”替換為“8”的縮寫。

二、起源

大規模容器叢集管理工具,從Borg到Kubernetes

在Docker 作為高階容器引擎快速發展的同時,Google也開始將自身在容器技術及叢集方面的積累貢獻出來。在Google內部,容器技術已經應用了很多年,Borg系統執行管理著成千上萬的容器應用,在它的支援下,無論是谷歌搜尋、Gmail還是谷歌地圖,可以輕而易舉地從龐大的資料中心中獲取技術資源來支撐服務執行。Kubernetes專案來源於Borg,可以說是集結了Borg設計思想的精華,並且吸收了Borg系統中的經驗和教訓。

Kubernetes作為容器叢集管理工具,於2015年7月22日迭代到 v 1.0並正式對外公佈,這意味著這個開源容器編排系統可以正式在生產環境使用。與此同時,谷歌聯合Linux基金會及其他合作伙伴共同成立了CNCF基金會( Cloud Native Computing Foundation),並將Kuberentes 作為首個編入CNCF管理體系的開源專案,助力容器技術生態的發展進步。

k8s github地址: http://github.com/kubernetes/kubernetes

三、K8s架構

Kubernetes叢集包含有節點代理kubelet和Master元件(APIs, scheduler, etc),一切都基於分散式的儲存系統。下面這張圖是Kubernetes的架構圖。

1)Kubernetes的核心概念

  • Pod

    運行於Node節點上,若干相關容器的組合。Pod內包含的容器執行在同一宿主機上,使用相同的網路名稱空間、IP地址和埠,能夠通過localhost進行通。Pod是Kurbernetes進行建立、排程和管理的最小單位,它提供了比容器更高層次的抽象,使得部署和管理更加靈活。一個Pod可以包含一個容器或者多個相關容器。

  • Replication Controller

    Replication Controller用來管理Pod的副本,保證叢集中存在指定數量的Pod副本。叢集中副本的數量大於指定數量,則會停止指定數量之外的多餘容器數量,反之,則會啟動少於指定數量個數的容器,保證數量不變。Replication Controller是實現彈性伸縮、動態擴容和滾動升級的核心。 Kubernetes 基礎元件:

  • Service

    Service定義了Pod的邏輯集合和訪問該集合的策略,是真實服務的抽象。Service提供了一個統一的服務訪問入口以及服務代理和發現機制,使用者不需要了解後臺Pod是如何執行。

  • Label

    Kubernetes中的任意API物件都是通過Label進行標識,Label的實質是一系列的K/V鍵值對。Label是Replication Controller和Service執行的基礎,二者通過Label來進行關聯Node上執行的Pod。

2)Kubernetes Master節點元件

master節點叢集控制節點,來負責整個叢集的管理和控制,基本上k8s的所有控制命令都是發給它。我們後面執行的命令基本都是在master節點上執行的。通常它會佔據一個獨立的x86伺服器(或一個虛擬機器)。

  1. kube-apiserver:主節點上負責提供 Kubernetes API 服務的元件;它是 Kubernetes 控制面的前端
  2. etcd:etcd 是兼具一致性和高可用性的鍵值資料庫,可以作為儲存 Kubernetes 所有叢集資料的後臺資料庫。 kube-scheduler:主節點上的元件,該元件監視那些新建立的未指定執行節點的 Pod,並選擇節點讓 Pod 在上面執行。
  3. kube-controller-manager:叢集內部的管理控制中心,負責叢集內的Node、Pod副本、服務端點(Endpoint)、名稱空間(Namespace)、服務賬號(ServiceAccount)、資源定額(ResourceQuota)的管理,當某個Node意外宕機時,Controller Manager會及時發現並執行自動化修復流程,確保叢集始終處於預期的工作狀態。

負責執行各種控制器,目前已經提供了很多控制器來保證Kubernetes的正常執行。 - 複製控制器(Replication Controller,RC)

管理維護Replication Controller,關聯Replication Controller和Pod,保證Replication Controller定義的副本數量與實際執行Pod數量一致。 - 副本集控制器(Replica Set Controller,RS) RS是新一代RC,提供同樣的高可用能力,區別主要在於RS後來居上,能支援更多種類的匹配模式。副本集物件一般不單獨使用,而是作為Deployment的理想狀態引數使用。 - 部署控制器(Deployment Controller) 部署是一個比RS應用模式更廣的API物件,可以是建立一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。滾動升級一個服務,實際是建立一個新的RS,然後逐漸將新RS中副本數增加到理想狀態,將舊RS中的副本數減小到0的複合操作;這樣一個複合操作用一個RS是不太好描述的,所以用一個更通用的Deployment來描述。以K8s的發展方向,未來對所有長期伺服型的的業務的管理,都會通過Deployment來管理

  • Namespace Controller(NC)

    管理維護Namespace,定期清理無效的Namespace,包括Namesapce下的API物件,比如Pod、Service等。

  • Service Controller(SC)

    管理維護Service,提供負載以及服務代理。

  • EndPoints Controller

    管理維護Endpoints,關聯Service和Pod,建立Endpoints為Service的後端,當Pod發生變化時,實時更新Endpoints。

  • Service Account Controller

    管理維護Service Account,為每個Namespace建立預設的Service Account,同時為Service Account建立Service Account Secret。

  • Persistent Volume Controller

    管理維護Persistent Volume和Persistent Volume Claim,為新的Persistent Volume Claim分配Persistent Volume進行繫結,為釋放的Persistent Volume執行清理回收。

  • 後臺支撐服務集控制器(Daemon Set Controller)

    管理維護Daemon Set,負責建立Daemon Pod,保證指定的Node上正常的執行Daemon Pod。

  • 任務控制器(Job Controller)

    管理維護Job,為Jod建立一次性任務Pod,保證完成Job指定完成的任務數目

  • Pod Autoscaler Controller

    實現Pod的自動伸縮,定時獲取監控資料,進行策略匹配,當滿足條件時執行Pod的伸縮動作。

  • cloud-controller-manager:是kubernetes與雲廠商提供的服務能力對接的關鍵元件。這是 Kubernetes 1.6 版本中引入的特性。

3)Kubernetes Node節點元件

node節點:叢集中其他機器被稱為node節點,Node可以是一臺物理機,也可以是一臺虛擬機器。當某個node宕機,其上的工作負載會被master自動轉移到其他節點上。 - kubelet:負責pod對應的容器建立、啟停等任務。 - kube-porxy:實現service通訊的重要元件。 - 容器引擎:容器引擎負責執行容器。Kubernetes支援多種容器引擎:Docker、containerd、cri-o、rktlet 以及任何實現了 Kubernetes容器引擎介面 的容器引擎。

【溫馨提示】node節點可以在執行期間動態增加到k8s叢集中,在預設情況下kubelet會將master註冊自己,並定時想master彙報自身情報。

4)addons(外掛)

  • kube-dns:負責為整個叢集提供DNS服務
  • Ingress Controller:為服務提供外網入口,負載均衡
  • Heapster:提供資源監控
  • Dashboard:提供GUI
  • Federation:提供跨可用區的叢集
  • Fluentd-elasticsearch:提供叢集日誌採集、儲存與查詢

四、RBAC訪問授權

K8s在1.3版本中釋出了alpha版的基於角色的訪問控制(Role-based Access Control,RBAC)的授權模式。相對於基於屬性的訪問控制(Attribute-based Access Control,ABAC),RBAC主要是引入了角色(Role)和角色繫結(RoleBinding)的抽象概念。在ABAC中,K8s叢集中的訪問策略只能跟使用者直接關聯;而在RBAC中,訪問策略可以跟某個角色關聯,具體的使用者在跟一個或多個角色相關聯。顯然,RBAC像其他新功能一樣,每次引入新功能,都會引入新的API物件,從而引入新的概念抽象,而這一新的概念抽象一定會使叢集服務管理和使用更容易擴充套件和重用。