kubelet作用概述
在Kubernetes集群中,在每個Node上都會啟動一個 kubelet服務進程。kubelet作為連接Kubernetes Master和各Node之間的橋梁,用於處理Master下發到本節點的任務,管理 Pod及Pod中的容器。每個kubelet進程都會在api-server上注冊本節點自身的信息,定期向Master匯報節點資源的使用情況,並通過cAdvisor監控 容器和節點資源。
節點管理
kubelet在啟動時通過API Server注冊節點信息,並定時向API Server 發送節點的新消息,API Server在接收到這些信息后,將這些信息寫入 etcd。這里有一些啟動參數可以設置,比如,是否希望在啟動的時候就進行注冊本節點的信息(這個叫自注冊模式),可以通過設置啟動參數“--register-node”為true;比如,可以設置kubelet每隔多長時間向api-server報告節點狀態,通過啟動參數“--node-status- update-frequency”。等等。
Pod管理
kubelet通過以下幾種方式獲取自身Node上要運行的Pod清單。
- 文件:
- HTTP端口:
- API Server:kubelet通過API Server監聽etcd目錄,同步Pod列表。
所有以非API Server方式創建的Pod都叫作Static Pod。這里只討論通過API Server的方式獲取Pod清單的方式。
kubelet通過API Server Client 使用Watch加List的方式監聽“/registry/nodes/$”當前節點的名稱和“/registry/pods”目錄,將獲取的信息同步到本地緩存中。
kubelet監聽etcd,所有針對Pod的操作都會被kubelet監聽。如果發現 有新的綁定到本節點的Pod,則按照Pod清單的要求創建該Pod。 如果發現本地的Pod被修改,則kubelet會做出相應的修改,比如在 刪除Pod中的某個容器時,會通過Docker Client刪除該容器。
容器健康檢查
Pod通過兩類探針來檢查容器的健康狀態。
LivenessProbe
探針,用於判斷容器是否健康並反饋給kubelet。如果LivenessProbe探針探測到容器不健康,則kubelet將刪除該容器,並根據容器的重啟策略做相應的處理。如果一個容器不包含LivenessProbe探針,那么kubelet認為該容器的LivenessProbe探針返回的值永遠是Success。ReadinessProbe
探針,用於判斷容器是否啟動完成,且准備接收請求。 如果ReadinessProbe探針檢測到容器啟動失敗,則Pod的狀態將被修改, Endpoint Controller將從Service的Endpoint中刪除包含該容器所在Pod的IP 地址的Endpoint條目。(這里需要補充“Endpoint Controller”的概念)
kubelet定期調用容器中的LivenessProbe探針來診斷容器的健康狀況。那么到底通過什么特征來判斷容器是否“健康”呢?有以下3種實現方式:
- ExecAction:在容器內部執行一個命令,如果該命令的退出狀態碼為0,則表明容器健康。
- TCPSocketAction:通過容器的IP地址和端口號執行TCP檢查,如果端口能被訪問,則表明容器健康。
- HTTPGetAction:通過容器的IP地址和端口號及路徑調用 HTTP Get方法,如果響應的狀態碼大於等於200且小於等於400,則認為 容器狀態健康。
LivenessProbe探針被包含在Pod定義的spec.containers.{某個容器}
中。比如下面這個例子,展示了通過在容器內部執行一個命令來檢查健康狀態。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 5
periodSeconds: 5
kubelet在容器中執行cat /tmp/health
命令,如果該命令返回的值為 0,則表明容器處於健康狀態,否則表明容器處於不健康狀態。
每次探測都將獲得以下三種結果之一:
- Succeed:容器通過了診斷。
- Failed:容器未通過診斷。
- Unknown:診斷失敗,因此不會采取任何行動。
cAdvisor資源監控
在Kubernetes集群中,應用程序的執行情況可以在不同的級別上監測到,這些級別包括:容器、Pod、Service和整個集群。用戶如何查看各個級別的資源使用情況,從而更深入的了解應用的執行情況呢?——這就需要用到了cAdvisor。cAdvisor是一個開源的分析容器資源使用率和性能特性的代理工具,kubelet則通過cAdvisor獲取其所在節點及容器的數據。cAdvisor自動查找所有在其所在Node上的容器,自動采集CPU、內存、文件系統和網絡使用的統計信息。
從Kubernetes 1.8版本開始,性能指標數據的查詢接口升級為標准的Metrics API,后端服務則升級為全新的 Metrics Server(cAdvisor在4194端口提供的UI和API服務於1.12版本關閉)。在新的Kubernetes監控體系中,Metrics Server用於提供Core Metrics(核心指標),包括Node和Pod的CPU和內存使用數據。其他 Custom Metrics(自定義指標)則由第三方組件(如Prometheus)采集和存儲。
本文參考《kubernetes 權威指南》第4版