基本概念
Kubernetes 中的絕大部分概念都抽象成 Kubernetes 管理的一種資源對象數據庫
Kubernetes 主要由如下幾個核心組件組成:網絡
- etcd 保存了整個集羣的狀態,就是一個數據庫;
- apiserver 提供了資源操做的惟一入口,並提供認證、受權、訪問控制、API 註冊和發現等機制;
- controller manager 負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等;
- scheduler 負責資源的調度,按照預約的調度策略將 Pod 調度到相應的機器上;
- kubelet 負責維護容器的生命週期,同時也負責 Volume(CSI)和網絡(CNI)的管理;
- Container runtime 負責鏡像管理以及 Pod 和容器的真正運行(CRI);
- kube-proxy 負責爲 Service 提供 cluster 內部的服務發現和負載均衡;
固然了除了上面的這些核心組件,還有一些推薦的插件:架構
- kube-dns 負責爲整個集羣提供 DNS 服務
- Ingress Controller 爲服務提供外網入口
- Heapster 提供資源監控
- Dashboard 提供 GUI
組件通訊
Kubernetes 多組件之間的通訊原理:負載均衡
- apiserver 負責 etcd 存儲的全部操做,且只有 apiserver 才直接操做 etcd 集羣
-
apiserver 對內(集羣中的其餘組件)和對外(用戶)提供統一的 REST API,其餘組件均經過 apiserver 進行通訊微服務
- controller manager、scheduler、kube-proxy 和 kubelet 等均經過 apiserver watch API 監測資源變化狀況,並對資源做相應的操做
- 全部須要更新資源狀態的操做均經過 apiserver 的 REST API 進行
-
apiserver 也會直接調用 kubelet API(如 logs, exec, attach 等),默認不校驗 kubelet 證書,但能夠經過 --kubelet-certificate-authority
開啓(而 GKE 經過 SSH 隧道保護它們之間的通訊)插件
好比最典型的建立 Pod 的流程:code
![k8s pod](http://static.javashuo.com/static/loading.gif)
- 用戶經過 REST API 建立一個 Pod
- apiserver 將其寫入 etcd
- scheduluer 檢測到未綁定 Node 的 Pod,開始調度並更新 Pod 的 Node 綁定
- kubelet 檢測到有新的 Pod 調度過來,經過 container runtime 運行該 Pod
- kubelet 經過 container runtime 取到 Pod 狀態,並更新到 apiserver 中