k8s節點包含的組件及功能
1、kubernetes master與node節點的各組件及功能
k8s集群主要包含:k8s-master、k8s-node、etcd等,如下圖:
1.1 k8s master組件
k8s master主要有kube-apiserver、kube-controller-manager、kube-scheduler組成。
1.1.1 kube-apiserver
◆ kube-apiserver:
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/
Kubernetes API Server提供了k8s各類資源對象的增刪改查及watch等HTTP Rest接口,這些對象包括pods、services、replicationcontrollers等,API Server為REST操作提供服務,並為集群的共享狀態提供前端,所有其他組件都通過該前端進行交互。
◆ RESTful API
是REST風格的網絡接口,REST描述的是在網絡中client和server的一種交互形式。
◆ REST
是一種軟件架構風格,或者說是一種規格,其強調HTTP應當以資源為中心,並且規范了URI的風格,規范了HTTP請求操作(GET/PUT/POST/DELETE/HEAD/OPTIONS)的使用,具有對應的語義。
https://github.com/Arachni/arachni/wiki/REST-API
1.1.2 kube-scheduler
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-scheduler/
◆ Kubernetes調度器是一個控制面進程,負責將Pods指派到節點上。
◆ 通過調度算法為待調度Pod列表的每個pod從可用Node列表中選擇一個最適合的Node,並將信息寫入etcd中。
◆ node節點上的kubelet通過API Server監聽到Kubernetes Scheduler產生的Pod綁定信息,然后獲取對應的Pod清單,下載Image,並啟動容器。
◆ 策略:
1)先排除不符合條件的節點;2)在剩余的可用選出一個最符合條件的節點。
★ LeastRequestedPriority
優先從備選節點列表中選擇資源消耗最小的節點(CPU+內存)
★ CalculateNodeLabelPriority
優先選擇還有指定Label的節點
★ BalancedResourceAllocation
優先從備選節點列表中選擇各項資源使用率最均衡的節點。
1.1.3 kube-controller-manager
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/
◆ kube-controller-manager:Controller Manager還包括一些子控制器(副本控制器、節點控制器、命名空間控制器和服務賬號控制器等),控制器作為集群內部的管理控制中心,負責集群內的node、pod副本、服務端點(Endpoint)、命名空間(Namespace)、服務賬號(ServiceAccount)、資源定額(ResourceQuota)的管理,當某個node意外宕機時,Controller Manager會及時發現並執行自動化修復流程,確保集群中的Pod副本始終處於預期的工作狀態。
◆ controller-manager控制器每間隔5秒檢查一次節點的狀態;
◆ 如果controller-manager控制器沒有收到自節點的心跳,則將該node節點被標記為不可達;
◆ controller-manager將在標記為無法訪問之前等待40秒;
◆ 如果該node節點被標記為無法訪問后5分鍾還沒有恢復,controller-manager會刪除當前node節點的所有pod並在其它可用節點重建這些pod。
pod高可用機制:
node monitor period:節點監視周期,5s;
node monitor grace period:節點監視器寬限期,40s;
pod eviction timeout:pod驅逐超時時間,5m;
1.2 k8s node節點
1.2.1 kube-proxy
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-proxy/
◆ kube-proxy:kubernetes網絡代理運行在node上,它反映了node上Kubernetes API中定義的服務,並可以通過一組后端進行簡單的TCP、UDP和SCTP流轉發或者在一組后端進行循環TCP、UDP和SCTP轉發,用戶必須使用apiserver API創建一個服務來配置代理,其實就是kube-proxy通過在主機上維護網絡規則並執行連續轉發來實現Kubernetes服務訪問。
◆ kube-proxy運行在每個節點上,監聽API Server中服務對象的變化,再通過管理Iptables或者IPVS規則,來實現網絡的轉發。
◆ kube-proxy不同的版本可支持三種工作模式:
★ UserSpace:k8s v1.1之前使用,k8s 1.2及以后就已經淘汰;
★ iptables:k8s 1.1版本開始支持,1.2開始為默認;
★ IPVS:k8s 1.9引入到1.11為正式版本,需要安裝ipvsadm、ipset工具包和加載ip_vs內核模塊;
1.2.2 kubelet
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
kubelet是運行在每個worker節點的代理組件,它會監視已分配給節點的pod,具體功能如下:
◆ 向master匯報node節點的狀態信息;
◆ 接受指令並在Pod中創建docker容器;
◆ 准備Pod所需的數據卷;
◆ 返回Pod的運行狀態;
◆ 向node節點執行容器健康檢查;
1.3 kubectl
kubectl:https://kubernetes.io/zh/docs/reference/kubectl/kubectl/
◆ kubectl是一個通過命令行對Kubernetes集群進行管理的客戶端工具。
2、kubernetes pod調度流程