目錄
目錄 1
1. 前言 1
2. 系統架構 2
2.1. 主從架構 2
2.2. 基本概念 3
2.3. 主控節點(Master Node) 4
2.3.1. kube-apiserver 4
2.3.2. kube-controller-manager 4
2.3.3. kube-scheduler 4
2.3.4. cloud-controller-manager 5
2.4. 工作節點(Work Node) 5
2.4.1. Kubelet 5
2.4.2. kube-proxy 5
2.4.3. Container Runtime 5
2.5. 擴展插件(Addons) 5
2.5.1. DNS 5
2.5.2. Web UI (Dashboard) 6
2.5.3. Container Resource Monitoring 6
2.5.4. Cluster-level Logging 6
1. 前言
Kubernetes簡稱k8s(也縮寫為kube),一個開源的用於自動化部署容器化(主要針對Docker,其它如katacontainers和rkt也支持)應用程序系統,通過分組容器(容器組被命名為Pod,Pod也是Kubernetes的最小調度單元)來調度和管理容器,官方網站:https://kubernetes.io/,本文大量參考了官方的https://kubernetes.io/docs/concepts/、https://kubernetes.io/zh/(官方中文)等。
如何快速認識和上手Kubernetes?可從三方面入手,一是了解Kubernetes的系統架構,二是了解Kubernetes涉及的主要概念,三是動手安裝運行初體驗。
2. 系統架構
2.1. 主從架構
Kubernetes采用的是常見的主從架構(master-slave),注意這里的Slave並不是Master的復制節點,而是工作節點(Work Node)。
Kubernetes官方把Slave節點直接叫節點(Node),本文把它叫作工作節點(Work Node),以從名稱上更好的區分於主控節點(Master Node)。其中Master為單個節點,而Slave則多節點;Master負責管理、調度和監控,Slave負責執行。
Master由三部分組成:kube-apiserver、kube-controller-manager、kube-scheduler和cloud-controller-manager,每一成員均為一獨立進程,Master依賴Etcd存儲各狀態數據;Slave由兩部分組成:kubelet、kube-proxy和Container Runtime,每一成員也均為一獨立進程。
下為Kubernetes官方提供的架構圖(cloud-controller manager還非正式發布):
2.2. 基本概念
前言部分已介紹Pod是Kubernetes的最小調度單元,而不是容器Container。Pod、容器(Container)和節點(Node,這里特指工作節點)三者密切相關,可理解為一種包含關系,如下圖所示:
如果把Pod視作進程組,則Container可視為進程(實際上,一個容器內還可有多個物理進程)。一個Pod內可有多個容器,一個節點可有多個Pod,Kubernetes的最基本作用就是通過Pod來管理容器,包括分配運行容器的工作節點(Work Node)和容器的啟停等。因為Pod是Kubernetes的最小調度單元,所以實際直接操作的是Pod。
Pod類似進程,是臨時性的,有五種狀態:
Pending |
待運行 |
Kubernetes已接受Pod,但一或多個容器映射還沒被創建,可能是調度正在下載容器映射等 |
Running |
運行中 |
Pod已被調度到工作節點,所有的容器也已創建好,至少一個容器正在運行或正在(重)啟動中。 |
Succeeded |
運行成功(結束) |
Pod中的所有容器都運行結束,並且全部運行成功,而且不會重啟 |
Failed |
運行失敗(結束) |
Pod中的所有容器都運行結束,但至少有一個運行失敗(容器退出狀態非0) |
Unknown |
未知 |
通常是因為無法和Pod所在節點通信,導致無法獲取Pod狀態 |
2.3. 主控節點(Master Node)
2.3.1. kube-apiserver
Kubernetes的對外窗口,是Kubernetes的控制面(control plane),操控Kubernetes需經過kube-apiserver。有兩種操作Kubernetes方法:一是使用Kubernetes提供的命令行工具kube-apiserver,二是使用Kubernetes提供的API。kube-apiserver是無狀態的且沒有單點問題,所以沒有主備之分。
2.3.2. kube-controller-manager
Kubernetes控制管理器是Kubernetes的大腦,通過kube-apiserver管理和監控Kubernetes的各種資源,由幾大管理控制器組成:
Node Controller |
節點控制器 |
負責在節點出現故障時進行通知和響應 |
Replication Controller |
副本控制器 |
負責為系統中的每個副本控制器對象維護正確數量的Pod |
Endpoints Controller |
端點控制器 |
填充Endpoints對象(即,加入Services&Pods) |
Service Account & Token Controllers |
服務帳戶和訪問令牌控制器 |
為新Namespace創建默認帳戶和API訪問令牌 |
kube-controller-manager有單點,所以有主備kube-controller-manager,通過選舉的方式產生主kube-controller-manager。
2.3.3. kube-scheduler
調度器監視新創建的未分配工作節點的Pod,將Pod調度到(分配)最佳的工作節點。Kubernetes支持自定義調度器,來取代默認的kube-scheduler調度器。
如果調度器不能為Pod找到合適的工作節點,則Pod保持未調度狀態,直到被調度分配工作節點。
kube-scheduler通過兩步操作為Pod選擇一個工作節點:
|
操作 |
說明 |
1 |
Filtering |
過濾出合適的工作節點,如果沒有過濾出任何工作節點,則Pod保持為未調度狀態 |
2 |
Scoring |
對工作節點打分,選擇分數最高的,分數相同的隨機選擇 |
kube-scheduler有單點,所以有主備kube-scheduler,通過選舉的方式產生主kube-scheduler。
2.3.4. cloud-controller-manager
雲控制管理器運行與底層雲提供商(如AWS)交互的控制器,也由四大管理控制器組成:
Node Controller |
節點控制器 |
用於檢查雲提供程序,以確定節點停止響應后是否已將其刪除到雲中 |
Route Controller |
路由控制器 |
用於在基礎雲基礎架構中設置路由 |
Service Controller |
服務控制器 |
用於創建、更新和刪除雲提供商負載平衡器 |
Volume Controller |
卷控制器 |
用於創建、附加和安裝卷以及與雲提供商交互以編排卷 |
2.4. 工作節點(Work Node)
2.4.1. Kubelet
運行在每個工作節點上的系統代理(Agent),確保容器運行在Pod中,Kubelet確保PodSpec描述的容器運行正常。Kubelet只管理Kubernetes所創建的容器,而不管理其它非Kubernetes創建的容器。
2.4.2. kube-proxy
運行在每個工作節點上的網絡代理(Proxy),實現了Kubernetes Service概念的部分。kube-proxy維護工作節點上的網絡規則,這些規則允許Kubernetes集群內外部與Pod進行網絡通訊。如果系統的數據包過濾層可用,則kube-proxy使用它,否則kube-proxy自己轉發流量。
2.4.3. Container Runtime
Kubernetes支持除Docker外的多種容器,運行具體的容器是通過容器運行時完成的。Kubernetes支持:Docker、containerd、cri-o、rktlet、Frakti和實現Kubernetes CRI(容器運行時接口,Container Runtime Interface)的任何容器。
2.5. 擴展插件(Addons)
擴展插件使用Kubernetes資源實現集群特性,因為它們提供了群集級功能,所以插件的命名空間資源屬於kube-system命名空間,下列是部分可選的插件。
2.5.1. DNS
除DNS外的其它的擴展插件不是必須的,但應有集群級的DNS服務器。由Kubernetes啟動的容器,會在其DNS搜索中自動包括此DNS服務器。
2.5.2. Web UI (Dashboard)
儀表板(Dashboard)是Kubernetes集群的通用基於Web的UI,它允許用戶管理集群中運行的應用程序以及集群本身並進行故障排除。
2.5.3. Container Resource Monitoring
容器資源監視在中央數據庫中記錄有關容器的一般時間序指標,並提供用於瀏覽該數據的UI。
2.5.4. Cluster-level Logging
集群級日志記錄,負責通過搜索/瀏覽接口將容器日志保存到中央日志存儲中。