kubernetes簡稱“k8s” 其中“8”代表的是“k”和“s”中間的8個字母。
k8s是Google公司開發的Borg項目中獨立出來的容器編排工具,然后將其捐獻給CNCF這個組織,然后發揚光大。
Kubernetes主要由以下幾個核心組件組成:
- etcd保存了整個集群的狀態;
- apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API注冊和發現等機制;
- controller manager負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
- scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
- kubelet負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理;
- Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);
- kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;
除了核心組件,還有一些推薦的Add-ons:
- kube-dns負責為整個集群提供DNS服務
- Ingress Controller為服務提供外網入口
- Heapster提供資源監控
- Dashboard提供GUI
- Federation提供跨可用區的集群
- Fluentd-elasticsearch提供集群日志采集、存儲與查詢
k8s基礎架構:
k8s各組件間工作流程:
①運維人員向kube-apiserver發出指令(我想干什么,我期望事情是什么狀態)(以下kube-apiserver簡稱apiserver、kube-controller-manager簡稱controller、kube-scheduler簡稱scheduler)
②api響應命令,通過一系列認證授權,把pod數據存儲到etcd,創建deployment資源並初始化。(期望狀態)
③controller通過list-watch機制,監測發現新的deployment,將該資源加入到內部工作隊列,發現該資源沒有關聯的pod和replicaset,啟用deployment controller創建replicaset資源,再啟用replicaset controller創建pod。
④所有controller被創建完成后.將deployment,replicaset,pod資源更新存儲到etcd。
⑤scheduler通過list-watch機制,監測發現新的pod,經過主機過濾、主機打分規則,將pod綁定(binding)到合適的主機。
⑥將綁定結果存儲到etcd。
⑦kubelet每隔 20s(可以自定義)向apiserver通過NodeName 獲取自身Node上所要運行的pod清單.通過與自己的內部緩存進行比較,新增加pod。
⑧kubelet創建pod。
⑨kube-proxy為新創建的pod注冊動態DNS到CoreOS。給pod的service添加iptables/ipvs規則,用於服務發現和負載均衡。
⑩controller通過control loop(控制循環)將當前pod狀態與用戶所期望的狀態做對比,如果當前狀態與用戶期望狀態不同,則controller會將pod修改為用戶期望狀態,實在不行會將此pod刪掉,然后重新創建pod。