1、基本概念和組件
基礎架構
Kubernetes 是一個跨主機集群的 開源的容器調度平台,它可以自動化應用容器的部署、擴展和操作 , 提供以容器為中心的基礎架構。
使用 Kubernetes, 您可以快速高效地響應客戶需求:
- 快速、可預測地部署您的應用程序
- 擁有即時擴展應用程序的能力
- 不影響現有業務的情況下,無縫地發布新功能
- 優化硬件資源,降低成本
我們的目標是構建一個軟件和工具的生態系統,以減輕您在公共雲或私有雲運行應用程序的負擔。
Kubernetes 具有如下特點:
- 便攜性: 無論公有雲、私有雲、混合雲還是多雲架構都全面支持
- 可擴展: 它是模塊化、可插拔、可掛載、可組合的,支持各種形式的擴展
- 自修復: 它可以自保持應用狀態、可自重啟、自復制、自縮放的,通過聲明式語法提供了強大的自修復能力
集群有Master和Node節點,架構如下:
其中:
- etcd 保存了整個集群的狀態,就是一個數據庫,只有API Server能與其通信;
- apiserver 提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API 注冊和發現等機制;
- controller manager 負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
- scheduler 負責資源的調度,按照預定的調度策略將 Pod 調度到相應的機器上;
- kubelet 負責維護容器的生命周期,同時也負責 Volume(CSI)和網絡(CNI)的管理;
- Container runtime 負責鏡像管理以及 Pod 和容器的真正運行(CRI);
- kube-proxy 負責為 Service 提供 cluster 內部的服務發現和負載均衡;
scheduler
和controller-manager
都是通過apiserver
從etcd
中獲取各種資源的狀態,進行相應的調度和控制操作。
除了上面的這些組件,還有一些第三方的組件:
- kube-dns 負責為整個集群提供 DNS 服務
- Ingress Controller 為服務提供外網入口
- Heapster 提供資源監控
- Dashboard 提供 GUI
組件之間的關系:
從上面圖可以看到所有組件均是通過API Server進行通信,所以API Server就是一個中樞神經,在生產中我們會把master部署為多節點,做高可用。
etcd主要是存儲集群里的信息,比如集群狀態,集群的各Node信息等,只有API能與其通信,所以我們也會把etcd做高可用,etcd是一個單獨的組件,一個應用軟件,做高可用建議是奇數節點,比如3,5等,節點不應過多,因為節點過多,節點之間的數據同步是會有一定的開銷,影響集群的性能。
Schduler負責整個集群的調度,它通過API Server來檢測Node上Pod的狀態,然后會根據定義的策略來調度pod並綁定Node。
Controller manager負責pod的控制,常見的比如定義了一個Pod為replicaSet,然后因為某些原因當前pod掛掉了,這時候Controller manager就會為你在Node上重啟該Pod。
kubelet是Node上的組件,它會檢測Node上的Pod,並將其狀態更新到API Server。
kube-proxy主要是負責代理轉發,主要控制service,並將sevice狀態更新到API Server。
kubectl是集群的管理組件,主要也是調用API Server,然后進行整個集群的管理。
高可用
Kubernetes 集群,在生產環境,必須實現高可用:
- 實現Master節點及其核心組件的高可用;
- 如果Master節點出現問題的話,那整個集群就失去了控制;
具體的 HA 示意圖:
具體工作原理:
- etcd 集群:etcd集群建議和主集群分開,3個節點允許一個容錯,5個節點允許2個容錯,根據實際情況進行選擇
- **master集群: **對master節點來說一般3個節點就夠了,主要需要我們做高可用的組件是apiserver,我們可以在前面做一個負載均衡器,比如加一個Nginx,Nginx還可以通過keepalived做高可用,工作節點和客戶端通過這個負載均衡器(VIP)和apiserver進行通信
pod-master
保證僅是主master
可用,scheduler、controller-manager 在集群中多個實例只有一個工作,其他為備用