1、Master組件
1、API Server
K8S對外的唯一接口,提供HTTP/HTTPS RESTful API,即kubernetes API。所有的請求都需要經過這個接口進行通信。主要負責接收、校驗並響應所有的REST請求,結果狀態被持久存儲在etcd當中,所有資源增刪改查的唯一入口。
2、etcd
負責保存k8s 集群的配置信息和各種資源的狀態信息,當數據發生變化時,etcd會快速地通知k8s相關組件。etcd是一個獨立的服務組件,並不隸屬於K8S集群。生產環境當中etcd應該以集群方式運行,以確保服務的可用性。
etcd不僅僅用於提供鍵值數據存儲,而且還為其提供了監聽(watch)機制,用於監聽和推送變更。在K8S集群系統中,etcd的鍵值發生變化會通知倒API Server,並由其通過watch API向客戶端輸出。
3、Controller Manager
負責管理集群各種資源,保證資源處於預期的狀態。Controller Manager由多種controller組成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller等 。由控制器完成的主要功能主要包括生命周期功能和API業務邏輯,具體如下:
生命周期功能:包括Namespace創建和生命周期、Event垃圾回收、Pod終止相關的垃圾回收、級聯垃圾回收及Node垃圾回收等。
API業務邏輯:例如,由ReplicaSet執行的Pod擴展等。
4、調度器(Schedule)
資源調度,負責決定將Pod放到哪個Node上運行。Scheduler在調度時會對集群的結構進行分析,當前各個節點的負載,以及應用對高可用、性能等方面的需求。
2、Node組件
Node主要負責提供容器的各種依賴環境,並接受Master管理。每個Node有以下幾個組件構成。
1、Kubelet
kubelet是node的agent,當Scheduler確定在某個Node上運行Pod后,會將Pod的具體配置信息(image、volume等)發送給該節點的kubelet,kubelet會根據這些信息創建和運行容器,並向master報告運行狀態。
2、Container Runtime
每個Node都需要提供一個容器運行時(Container Runtime)環境,它負責下載鏡像並運行容器。目前K8S支持的容器運行環境至少包括Docker、RKT、cri-o、Fraki等。
3、Kube-proxy
service在邏輯上代表了后端的多個Pod,外借通過service訪問Pod。service接收到請求就需要kube-proxy完成轉發到Pod的。每個Node都會運行kube-proxy服務,負責將訪問的service的TCP/UDP數據流轉發到后端的容器,如果有多個副本,kube-proxy會實現負載均衡,有2種方式:LVS或者Iptables
3、核心附件
K8S集群還依賴一組附件組件,通常是由第三方提供的特定應用程序。
1、KubeDNS
在K8S集群中調度並運行提供DNS服務的Pod,同一集群內的其他Pod可以使用該DNS服務來解決主機名。K8S自1.11版本開始默認使用CoreDNS項目來為集群提供服務注冊和服務發現的動態名稱解析服務。
2、Dashboard
K8S集群的全部功能都要基於Web的UI,來管理集群中的應用和集群自身。
3、Heapster
容器和節點的性能監控與分析系統,它收集並解析多種指標數據,如資源利用率、生命周期時間,在最新的版本當中,其主要功能逐漸由Prometheus結合其他的組件進行代替。
4、Ingress Controller
Service是一種工作於4層的負載均衡器,而Ingress是在應用層實現的HTTP(S)的負載均衡。不過,Ingress資源自身並不能進行流量的穿透,,它僅僅是一組路由規則的集合,這些規則需要通過Ingress控制器(Ingress Controller)發揮作用。目前該功能項目大概有:Nginx-ingress、Traefik、Envoy和HAproxy等。
