經過前段時間的學習和實踐,對k8s的架構有了一個大致的理解。
1. k8s 分層架構
架構層級 | 核心組件 |
---|---|
控制平面層 | etcd、API Server、Scheduler、Controller Manager |
工作節點層 | Kubelet、Kube-proxy、CRI(容器運行時接口)、CNI(網絡插件)、CSI(存儲插件) |
資源對象層 | Pod、Deployment、StatefulSet、HPA、VPA |
擴展插件層 | CoreDNS、Ingress Controller、KEDA(事件驅動自動擴縮)、Argo Rollouts |
2. 組件
2.1. kube-apiserver
作用:Kubernetes
集群的核心入口,提供 RESTful API
服務。
功能:
接收所有來自客戶端(如 kubectl
)或集群內部組件的請求。
驗證和校驗請求的合法性(如權限、資源配額等)。
作為唯一直接與 etcd
交互的組件,負責集群狀態的讀寫。
充當其他組件之間通信的樞紐(如 kube-scheduler、kube-controller-manager
等)。
2.2. kube-controller-manager
作用:運行一系列控制器(Controller
),確保集群的實際狀態與期望狀態一致。
核心控制器:
Node Controller
:監控節點狀態(如節點宕機時觸發處理)。
Replication Controller
:確保 Pod
副本數符合預期(如 Deployment
的副本數)。
Endpoint Controller
:維護 Service
與 Pod
的映射關系(Endpoints
)。
Service Account & Token Controller
:管理服務賬戶和訪問令牌。
2.3. kube-scheduler
作用:負責將新創建的 Pod
調度到合適的節點上運行。
調度流程:
過濾:排除不滿足 Pod
需求的節點(如資源不足、標簽不匹配)。
打分:對剩余節點按優先級排序(如資源利用率、親和性等)。
綁定:將 Pod
綁定到最優節點,由對應節點的 kubelet
執行創建。
可擴展性:支持自定義調度策略。
2.4. kubelet
作用:運行在每個節點上的“節點代理”,負責管理本節點上的 Pod
生命周期。
功能:
監聽 API Server
或本地 Pod
清單(如靜態 Pod
),確保 Pod
按預期運行。
執行 Pod
的創建、啟動、停止、監控等操作。
定期向 API Server
匯報節點狀態(如資源使用情況、Pod
狀態)。
與容器運行時(如 Docker、containerd、CRI-O
)交互,管理容器。
2.5. kube-proxy
作用:實現 Kubernetes Service
的網絡代理和負載均衡。
功能:
維護節點上的網絡規則(如 iptables/IPVS
),將訪問 Service
的請求轉發到后端 Pod
。
實現 Service
的 ClusterIP、NodePort、LoadBalancer
等類型的網絡暴露。
確保 Pod
之間的網絡通信和負載均衡。
2.6. etcd
作用:Kubernetes
集群的分布式鍵值存儲數據庫,保存所有集群狀態和數據。
功能:
存儲集群的配置信息、節點信息、Pod 狀態、Secrets、ConfigMaps
等。
提供高可用和強一致性的數據存儲(基于 Raft
共識算法)。
僅通過 kube-apiserver
進行讀寫,其他組件不直接操作。
3. CRI
kubernetes
從v1.5
版本開始引入了CRI
規范,通過插件接口模式,kubernetes
無須重新編譯就可以使用多種不同類型的容器運行時。kubernetes
從 v1.23
及之前的版本可以將 docker
作為容器運行時,從v1.24
版本開始不再支持 docker
作為容器運行時,采用containerd 、CRI-O
作為容器運行時。
kubelet
基于gRPC
框架通過UNIX Socket
與容器運行時通信。在該過程中,kubelet
作為客戶端,CRI
是服務端。
CRI
主要包括兩個gRPC
服務:ImageService
和RuntimeService
,實現對容器鏡像和容器實例的管理功能。
ImageService
:負責容器鏡像的拉取,查看和移除鏡像等。RuntimeService
: 負責pod
和容器的生命周期管理,以及與容器的交互(如exec、attac、 port-forward
等)。