kubernetes 結構介紹
什么是 kubernetes?
kubernetes (經常被縮寫成 k8s)是 google 開源的一套自動化容器管理平臺,前身是 Borg,用于容器的部署、自動化調度和集群管理。目前 kubernetes 有以下的特性:
- 容器的自動化部署
- 自動化擴展或者縮容
- 自動化應用/服務升級
- 容器成組,對外提供服務,支持負載均衡
- 服務的健康檢查,自動重啟
因為容器本身就是可移植的,所以 kubernetes 容器集群也能跑在私有云、公有云或者混合云上面。
kubernetes 讓應用的集群管理變得簡單,只要通過一行命令,就能快速搭建包含了前后端的完整系統集群。
kubectl create -f config-file.yml
安裝 kubernetes
kubernetes 的概念
Pods
kubernetes 中,最基本的管理單位是 pod 而不是 container。pod 由一個或者多個容器組成,一般運行著相同的應用。一個 pod 中的所有容器都必須運行在同一臺機器上,共享網絡空間(network namespace)和存儲 (volume)。
pod 可以近似類比傳統模式下的主機:一些相關的應用組合起來,實現一個邏輯上的功能。
記住:pod 不是持久的,也就是說在使用過程中會被刪除和創建,只要保證 service (下文會介紹到)保持穩定就行。而持久化的功能可以通過共享的 volume 來實現,這樣即使 pod 被不斷刪除創建也能保證數據的完整。
Replication Controllers
RC 保證在任意時刻都有指定數量的 pod 副本在運行。比如如果我們創建了一個 rc,指定某個 pod 運行 3 份:
- 剛開始的時候,rc 發現集群中沒有這個 pod,它會創建 3 個 pod
- 當某個 pod 不響應或者被刪除了,它會檢測到這個變化,然后新建一個正常的 pod(替換錯誤狀態的 pod),保證系統有 3 個 pod 在運行
- 當錯誤的 pod 回復正常,或者用戶又手動添加了幾個 pod,rc 也會檢測到,它會通過刪除 pod 來保證只有 3 份副本在運行
創建 replication controller 的時候,需要幾個參數:
- pod 的模板:用來創建應用的 pod 模板,在需要的時候根據這個模板創建 pod
- replicas 副本數:要達到的目標狀態,pod 需要運行幾份
- label:需要監控的 pod 的標簽,通過比較 replicas 變量的值和標簽實際發現的 pod 數量確定是否在目標狀態
Services
service,也就是服務,是實際環境中對外提供服務的業務抽象。一個服務后端可能有多個容器提供支持,但是對外通過服務這一層只有一個接口,通過轉發用戶的請求到后端的應用上來實現。這樣做的好處是:對外隱藏了后端的細節,使得擴展和維護變得更容易。
在 kubernetes 中,service 后面對應的是 pod,這種對應關系是通過 label 來匹配的。每個 service 會配置 label selector 對后端的 pod 進行選擇,因此這種關系是動態的,pod 的添加和刪除都會自動被關聯進來。
service 是單獨存在的,不必和 pod 或者 replication controller 綁定。即使后端沒有 pod,service 的存在也是合法的,當對應的 pod 出現時,會動態的綁定到 service 上。
Labels
labels 就是標簽的意思,主要用于過濾 pod、service 或者 replication controller,尤其是當集群的規模比較大的時候。
一個 label 就是一個鍵值對,用來表示用戶自己定義的屬性。給 pod 添加添加合理的標簽會做到事半功倍的效果,增加可讀性(通過 label 就能大致了解 pod 的功能)的同時也能方便查找對應的服務(service 和 replication controller 就是通過 label 來綁定后端 pod 的)。
利用 label 能夠把 service 和 pod 做到松耦合:兩者都可以單獨存在,并且這種綁定關系是動態的。
kubernetes 組件
kubernetes 整體上的框架是下面這樣的,由多個不同的部分組成,下面將逐個講解這些部分的功能。
kubectl
這是 kubernetes 提供的客戶端程序,也是目前常用的和集群交互的方式。創建、查看、管理、刪除、更新 pod、service、replication controller 都行,還有更多其他命令,可以查看幫助文檔。
etcd 集群
etcd 是 kubernetes 存放集群狀態和配置的地方,這是集群狀態同步的關鍵,所有節點都是從 etcd 中獲取集群中其他機器狀態的;集群中所有容器的狀態也是放在這里的。
kubernetes 在 etcd 中存儲的數據在 /registry 路徑下,結構類似下面這樣:
/registry/minions /registry/namespaces /registry/pods /registry/ranges /registry/serviceaccounts /registry/services /registry/controllers /registry/events
Master 組件
kubernetes 是典型的 master-slave 模式,master 是整個集群的大腦,負責控制集群的方方面面。
API server
對外提供 kubernetes API,也就是 kubernetes 對外的統一入口。封裝了 kubernetes 所有的邏輯,通過 RESTful 的方式供客戶端使用,kubectl 就是最常用到的客戶端程序。
Scheduler
調度器:實現容器調度的組件,調度算法可以由用戶自己實現。Scheduler 會收集并分析當前系統中所有 slave 節點的負載情況,在調度的時候作為決策的重要依據。
調度器監聽 etcd 中 pods 目錄的變化,當發現新的 pod 時,會利用調度算法把 pod 放到某個節點進行部署。可能的 scheduler 包括:
- random:隨機調度算法
- round robin:輪詢調度
Controller Manager Server
集群中其他功能都是在 controller manager 中實現的,每個部分負責一個獨立功能的管理。例如:
- endpoints controller
- node controller
- replication controller
- service controller
- ……
slave 組件
kubelet
kubelet 是 slave 上核心的工作進程,負責容器和 pod 的實際管理工作(創建、刪除等)以及和 master 通信,內容包括:
- 負責容器的創建、停止、刪除等具體工作,也包括鏡像下載、 volume 管理
- 從 etcd 中獲取分配給自己的信息,根據其中的信息來控制容器以達到對應的目標狀態
- 接受來自 master 的請求,匯報本節點的信息
kube-proxy
正如名字提示的一樣,kube-proxy 為 pod 提供代理服務,用來實現 kubernetes 的 service 機制。每個 service 都會被分配一個虛擬 ip,當應用訪問到 service ip 和端口的時候,會先發送到 kube-proxy,然后才轉發到機器上的容器服務。
參考資料