第一章 Kubernetes入門及實踐
1.1 Kebernets介紹
Kubernetes(k8s)是Google2014年開源的容器集羣管理系統(谷歌內部:Borg),它主要用於容器容器化應用程序的部署、擴展和管理。
k8s提供了容器編排、資源調度、彈性伸縮、部署管理、服務發現等一系列功能。
k8s的目標是讓部署容器化的應用簡單並且高效,k8s提供了應用部署、規劃、更新、維護的一種機制!
1.2 Kubernetes主要功能
名詞 | 解釋 |
---|---|
數據卷 | Pod容器之間共享數據,可以使用數據卷 |
應用程序健康檢查 | 容器內服務可能進程堵塞無法處理請求,可以設置監控檢查策略保證應用健壯性 |
複製應用程序實列 | 控制器維護着Pod副本數量,保證一個Pod或一組同類的Pod數量始終可用 |
彈性伸縮 | 根據設定的指標(CPU利用率)自動縮放Pod副本數 |
服務發現 | 使用環境變量或DNS服務插件保證容器中程序發現Pod入口訪問地址 |
負載均衡 | 一組Pod副本分配一個私有的集羣IP地址,負載均衡轉發請求到後端容器.在集羣內部 其他Pod可通過這個ClusterIP訪問應用 |
滾動更新 | 更新服務不中斷,一次更新一個Pod,而不是刪除整個服務 |
服務編排 | 通過文件描述部署服務,使得應用程序部署變得高效 |
資源監控 | Node節點組件集成cAvisor資源收集工具,可通過Heapster彙總整個集羣節點資源數據,然後存儲到1nfluxDE時序數據庫,再有Grafana展示 |
提供認證和授權 | 支持角色訪問控制(RBAC)認證授權等策略 |
1.3 設計架構及核心組件
上圖可以看到如下組件,使用特別的圖標表示Service和Label:
EN | CN |
---|---|
Pod | 根容器 |
Container | 容器 |
Label | 標籤 |
Replication Controller | 複製控制器 |
Service | 服務 |
Node | 節點 |
Kubernets Master | Kubernetes主節點 |
1.3.1 Master 節點組件
master節點上主要運行四個組件:api-server、scheduler、controller-manager、etcd。
組件 | 作用 |
---|---|
api-server | 提供了資源操作的唯一入口,各組件協調者並提供認證、授權、訪問控制、API註冊和發現機制 |
scheduler | 負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上,Kubernets目前提供了調度算法,但同時也保證了接口,用戶可以根據自己的需求定義自己的調度算法 |
controller-manager | 如果說APIServer做的是“前臺”工作的話,那麼controller manager就是負責“後臺”的.每個資源一般都對一個控制器,而controller manager 就是負責管理這些控制器的。比如我們通過APIServer創建一個pod,當這個pod創建成功後,APIserver的任務就算是完成了.而後面保證Pod的狀態和我們預期的一樣的重任就由controller manager 去保證了. |
etcd | etcd是一個高可用的鍵值存儲系統,Kubernets使用它來存儲各個資源的狀態,從而實現Restful的API |
1.3.2 Node 節點組件
每個Node節點主要由三個模塊組成:kubelet、kube-proxy、Container runtime。
組件 | 作用 |
---|---|
Container runtime | 負責鏡像管理以及Pod和容器的真正運行(CRI);指的是容器運行環境,目前Kubernets支持docker和rkt兩種容器 |
kube-proxy | 負責Service提供cluster內部的服務發現和負載均衡;該模塊實現了Kubernetesz中的服務發現和反向代理功能.反向代理方面:kube-proxy支持TCP和UDP鏈接轉發,默認基於Round Robin算法將客戶端流量轉發到與service對應的一組後端pod。服務發現方面,kube-proxy使用etcd的watch機制,監控集羣中service和endpoint對象數據的動態變化,並且維護一個service到endpoint的映射關係,從而保證了後端pod的IP變化不會對訪問者造成影響.另外kube-proxy還支持session affinity |
kubelet | 負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理;是Master在每個Node節點上面的agent,是Node節點上面最重要的模塊,它負責維護和管理該Node上面的所有容器但是如果所有容器不是通過Kubernetes創建,它並不會管理,本質上,它負責使Pod得運行狀態與期望的狀態一致 |
除了核心組件,還有一些推薦的Add-ons(插件):
- kube-dns負責爲整個集羣提供DNS服務
- Ingress Controller爲服務提供外網入口
- Heapster提供資源監控
- Dashboard提供GUI
- Federation提供跨可用區的集羣
- Fluentd-elasticsearch提供集羣日誌採集、存儲與查詢
master與node關係:
1.3.3 分層架構
Kubernetes設計理念和功能其實就是一個類似Linux的分層架構,如下圖所示
- 核心層:Kubernetes最核心的功能,對外提供API構建高層的應用,對內提供插件式應用執行環境
- 應用層:部署(無狀態應用、有狀態應用、批處理任務、集羣應用等)和路由(服務發現、DNS解析等)
- 管理層:系統度量(如基礎設施、容器和網絡的度量),自動化(如自動擴展、動態Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
- 接口層:kubectl命令行工具、客戶端SDK以及集羣聯邦
- 生態系統:在接口層之上的龐大容器集羣管理調度的生態系統,可以劃分爲兩個範疇
- Kubernetes外部:日誌、監控、配置管理、CI、CD、Workflow、FaaS、OTS應用、ChatOps等
- Kubernetes內部:CRI、CNI、CVI、鏡像倉庫、Cloud Provider、集羣自身的配置和管理等
1.4 基本對象概念
基本對象:
名稱 | 概念 |
---|---|
pod | 容器Pod是最小的部署單元,一個Pod有一個或多個容器組成,Pod中容器共享存儲和網絡,在同一個Docker主機上運行 |
Service | Service一個應用服務抽象,定義了Pod邏輯集合和訪問這個Pod集合的策略。Service代理Pod集合對外表現是爲一個訪問入口,分配一個集羣IP地址,來自這個IP的請求將負載均衡轉發後端Pod中的容器。Service通過Lable Selector選擇一組Pod提供服務。 |
Volume | 數據卷,共享Pod中容器使用的數據。分爲臨時卷、本地卷和網絡卷,臨時卷和本地卷位於Node本地,常用於數據緩存 |
Namespace | 命名空間將對象邏輯上分配到不同Namespace,可以是不同的項目、用戶等區分管理,並設定控制策略,從而實現多租戶。命名空間也稱爲虛擬集羣。同一類型資源對象的Name必須唯一,邏輯分組,默認名稱空間是default |
Lable | 標籤用於區分對象(比如Pod、 Service),是key/values數據;每個對象可以有多個標籤,通過標籤關聯對象。標籤可以在創建一個對象的時候直接給與,也可以在後期隨時修改,每一個對象可以擁有多個標籤,但是,key值必須是唯一的。 |
基於基本對象更高層次抽象:
名稱 | 概念 |
---|---|
ReplicaSet | 下一代Replication Controller。確保任何給定時間指定的Pod副本數量,並提供聲明式更新等功能。RC與RS唯一區別就是lable selector支持不同, RS支持新的基於集合的標籤, RC僅支持基於等式的標籤。 |
Deployment | Deployment是一個更高層次的API對象,它管理ReplicaSets和Pod,並提供聲明式更新等功能。官方建議使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,這就意味着可能永遠不需要直接操作。 |
StatefulSet | StatefulSet適合持久性的應用程序,有唯一的網絡標識符(IP),持久存儲,有序的部署、擴展、刪除和滾動更新。 |
DaemonSet | DaemonSet確保所有(或一些)節點運行同一個Pod。當節點加入Kubernetes集羣中, Pod會被調度到該節點上運行,當節點從集羣中。移除時, DaemonSet的Pod會被刪除。刪除DaemonSet會清理它所有創建的Pod。 |
Job | 一次性任務,運行完成後Pod銷燬,不再重新啓動新容器。還可以任務定時運行。 |