什么是kubernetes?
- kubernetes是Google 開源的容器集群管理系統,是大規模容器應用編排系統,是在眾多容器之上的又一抽象層
- 它支持自動部署,大規模可伸縮,應用容器化管理
- kubernetes是Google 開源的一個容器編排引擎,它支持自動化部署,大規模可伸縮,應用容器化管理
- 在kubernetes中部署應用是一件容易的事,因其有着彈性伸縮,橫向擴展的優勢並同時提供負載均衡能力以及良好的自愈性(自動部署,自動重啟,自動復制,自動擴展等)
優質掃盲博文:
主要功能包括:
- 基於容器的應用部署,維護和滾動升級
- 負載均衡和服務發現
- 跨機器和跨地區的集群調度
- 自動伸縮
- 無狀態服務和有狀態服務
- 插件機制保證擴展性
kubernetes特點:
- 可移植性:支持公有雲,私有雲,混合雲,多重雲
- 可擴展性:模塊化,插件化,可掛載,可組合
- 自動化:自動部署,自動重啟,自動復制,自動擴展/伸縮
kubernetes 核心組件:
1. master組件
- kube-apiserver 提供了資源操作的唯一入口,任何資源的請求/調用操作都是通過它,並提供認證,授權,訪問控制,API 注冊和發現機制
- kube -controller-manager 集群控制器,負責維護集群的狀態,比如故障檢測,自動擴展,滾動更新等
- kube- scheduler 負責資源的調度,按照預定的調度策略將pod調度到相應的機器上,為pod選擇一個node
- etcd 保存了整個集群的狀態信息,分布式鍵值對(k/v)存儲服務
- core DNS 第三方插件,提供集群的dns服務,實現服務注冊和服務發現,為service提供dns記錄
2.Node 組件
- kubelet 負責維護容器的生命周期,同時也負責volume(CVI )和網絡(CNI )的管理
- kube- proxy 負責為service提供cluster內部的服務發現和負載均衡(負責將后端pod訪問規則具體為節點上的iptables/ipvs規則)
- container runtime (docker)負責鏡像管理以及pod和容器的真正運行(CRI)
kubernetes中的負載均衡的主要兩種機制:
- Service:使用service提供集群內部的負載均衡,kube-proxy負責將service請求負載均衡到后端pod中(體現為iptables/ipvs規則)
- Ingress controller:使用ingress提供集群外部的負載均衡,將集群內部服務開放到集群外部訪問
(1)常用的ingress controller:nginx,traefik,kong,openresty
Job & CronJob 任務和定時任務
- Job負責批量處理短暫的一次性任務(short lived>CronJob即定時任務,就類似於linux的定時任務cronntab任務,在指定時間內周期運行指定的任務
kubernetes工作流:
- 提交請求:用戶通常是提交一個yaml文件,向api server發送請求創建一個pod,yaml文件含有此pod的詳細信息,包含此pod運行的副本數,鏡像,labels,名稱,端口暴露情況等。API server接收到請求后將yaml文件中的spec數據存入etcd中
- 資源狀態同步:這一步涉及到Replication組件,Replication組件監控着數據庫中的數據變化,對已有的pod進行數量上的同步
- 資源分配:Scheduler會檢查etcd數據庫中記錄的沒有被分配的pod,將此類pod分配到具有運行能力的node節點上,並更新etcd數據庫中的該pod分配情況
- 新建容器:kubernetes集群node節點中的kubelet通過api server對etcd數據庫中的pod部署狀態進行同步,目標node節點上的kubelet將pod相關yaml文件中spec(期望狀態)數據遞給后端容器運行引擎(如docker等容器)后者負責pod容器的運行停止和更新;kubelet會通過容器運行時引擎獲取pod的狀態信息並將此信息通過api server更新寫入到etcd中;
- 節點通訊:kube-proxy負責各節點中pod網絡通訊,負責服務發現和負載均衡
集群核心組件詳述:
1. API Server
- 組件在pod工作流中的功能
- 為整個pod工作流提供了資源對象(pod,deployment,service等)的增刪改查操作以及集群管理的rest api接口,集群管理主要包括認證授權准入控制,集群狀態管理和數據校驗等
- 提供集群中各組件的通信以及交互功能
- 提供資源配額控制入口功能
- 安全的訪問控制機制
- 在kubernetes集群中,API Server運行在Master節點上,默認開放兩個端口,分別是本地端口的8080(非認證或授權的kttp請求通過該端口訪問api server)和安全加密端口6443(該端口用於接收https請求並且用於token文件或客戶端證書及http basic的認證同時用於基於策略的授權), kubernetes中默認不啟動https安全訪問控制
- 集群組件間通訊:API server在整個pod工作流中主要負責各個組件間通信,Scheduler,Controller Manager,Kubelet通過API Server將資源對象信息存入etcd中,當各組件需要這些數據時又通過API Server的Rest接口來實現信息交換,以下分別說明。
>>>>
1-1. Kubelet與API Server
在Pod工作流中,位於集群中每個Node節點上的Kubelet會定期調用API Server的Rest接口去告知當前自身狀態,API Sever接收到狀態信息后,將其更新至Etcd中,Kubelet也同時通過API Server的Watch接口去監聽Pod信息,從而對各個Node節點上的Pod進行管理,主要監聽信息如表1所示:
表1:
|
監聽信息
|
Kubelet 執行
|
|
是否有新的Pod被綁定到Node節點
|
執行Pod對應容器的創建和啟動
|
|
是否有Pod對象被刪除
|
刪除Node上相應Pod容器
|
|
是否有修改Pod信息
|
修改Node上Pod的信息
|
>>>>
1-2. kube-controller-manager與API Server
Controller Manager包含許多控制器,例如Endpoint Controller、Replication Controller、Service Account Controller等, 具體會在后面Controller Manager部分說明,這些控制器通過API Server提供的接口去實時監控當前kubernetes集群中每個資源對象的狀態變化並將最新的信息保存在Etcd中,當集群中發生各種故障導致系統發生變化時,各個控制器會從Etcd中獲取資源對象信息並嘗試將系統狀態修復至理想狀態。
>>>>
1-3. kube-scheduler與API Server
Scheduler通過API Server的Watch接口監聽Master節點新建的Pod副本信息並檢索所有符合該Pod要求的Node列表同時執行調度邏輯,成功后將Pod綁定在目標節點處。由於在集群中各組件頻繁對API Server進行訪問,各組件采用了緩存機制來緩解請求量,各組件定時從API Server獲取資源對象信息並將其保存在本地緩存中,所以組件大部分時間是通過訪問緩存數據來獲得信息的。
2.Controller Manager
Controller Manager在pod工作流中起着管理和控制整個集群的作用,主要對資源對象進行管理,當node節點中運行的pod對象或是node自身發生意外或故障時,Controller Manager會及時發現並處理,以確保整個集群處於理想工作狀態。核心邏輯就是和解循環;控制器負責創建kubernetes集群上的具體對象,並確保其當前狀態status與用戶自定的期望狀態spec保持相同
>>>>
2-1. Replication Controller
Replication Controller稱為副本控制器,在Pod工作流中主要用於保證集群中Replication Controller所關聯的Pod副本數始終保持在預期值,比如若發生節點故障的情況導致Pod被意外殺死,Replication Controller會重新調度保證集群仍然運行指定副本數,另外還可通過調整Replication Controller中spec.replicas屬性值來實現擴容或縮容。
>>>>
2-2. Endpoint Controller
Endpoint用來表示kubernetes集群中Service對應的后端Pod副本的訪問地址,Endpoint Controller則是用來生成和維護Endpoints對象的控制器,其主要負責監聽Service和對應Pod副本變化。如果監測到Service被刪除,則刪除和該Service同名的Endpoints對象;如果監測到新的Service被創建或是被修改,則根據該Service信息獲得相關的Pod列表,然后創建或更新對應的Endpoints對象;如果監測到Pod的事件,則更新它對應的Service的Endpoints對象。圖5所示為Service、Endpoint、Pod的關系:
3.Scheduler
Scheduler在整個pod工作流中負責調度pod到具體的node節點,Scheduler通過api server監聽pod狀態,如果有待調度的pod,則根據Scheduler Controller中預選策略和優選策略給各個預備node節點打分排序,最后將pod調度到分數最高的node上,然后由node中的kubelet組件啟停pod。當然如果部署pod指定了NodeName屬性,Scheduler會根據該屬性指調度到指定node節點上。
整個調度流程分兩步:
第一步預選策略(Predicates)
預選策略的主要工作機制是遍歷所有當前kubernetes集群中的Node,按照具體的預選策略選出符合要求的Node列表;如果沒有符合的Node節點,則該Pod會被暫時掛起,直到有Node節點能滿足條件。通用的預選策略篩選規則有:
PodFitsResources、PodFitsHostPorts、HostName、MatchNodeSelector。
第二步優選策略(Priorities)
有了第一步預選策略的篩選后,再根據優選策略給待選Node節點打分,最終選擇一個分值最高的節點去部署 Pod。kubernetes 用一組優先級函數處理每一個待選的主機。每一個優先級函數會返回一個0-10的分數,分數越高表示節點越適應需求,同時每一個函數也會對應一個表示權重的值。最終主機的得分用以下公式計算得出:
FinalScoreNode = (weight1 priorityFunc1) + (weight2 priorityFunc2) + … + (weightn * priorityFuncn)
4.Kubelet
kubelet在pod工作流中是為保證它所在的節點pod能夠正常工作,核心為監聽API server,當發現節點的pod配置發生變化則根據最新的配置執行相應的動作,保證pod在理想的預期狀態,其中對pod進行啟停更新操作用到的是容器運行時。另外kubelet也負責volume(cvi)和網絡(cni)管理。
