kubernetes是一個分布式的集群管理系統,在每個節點(node)上都要運行一個 worker 對容器進行生命周期的管理,這個 worker 程序就是kubelet。
簡單地說,kubelet的主要功能就是定時從某個地方獲取節點上 pod/container 的期望狀態(運行什么容器、運行的副本數量、網絡或者存儲如何配置等等),並調用對應的容器平台接口達到這個狀態。
集群狀態下,kubelet 會從 master 上讀取信息,但其實 kubelet 還可以從其他地方獲取節點的 pod 信息。目前 kubelet 支持三種數據源:
- 本地文件
- 通過 url 從網絡上某個地址來獲取信息
- API Server:從 kubernetes master 節點獲取信息
從管理的對象來說,kubelet 目前支持docker和rkt,默認情況下使用的 docker。
kubelet 主要功能
pod 管理
在 kubernetes 的設計中,最基本的管理單位是 pod,而不是 container。pod 是 kubernetes 在容器上的一層封裝,由一組運行在同一主機的一個或者多個容器組成。如果把容器比喻成傳統機器上的一個進程(它可以執行任務,對外提供某種功能),那么 pod 可以類比為傳統的主機:它包含了多個容器,為它們提供共享的一些資源。
之所以費功夫提供這一層封裝,主要是因為容器推薦的用法是里面只運行一個進程,而一般情況下某個應用都由多個組件構成的。
pod 中所有的容器最大的特性也是最大的好處就是共享了很多資源,比如網絡空間。pod 下所有容器共享網絡和端口空間,也就是它們之間可以通過localhost訪問和通信,對外的通信方式也是一樣的,省去了很多容器通信的麻煩。
除了網絡之外,定義在 pod 里的 volume 也可以 mount 到多個容器里,以實現共享的目的。
最后,定義在 pod 的資源限制(比如 CPU 和 Memory) 也是所有容器共享的。
容器健康檢查
創建了容器之后,kubelet 還要查看容器是否正常運行,如果容器運行出錯,就要根據設置的重啟策略進行處理。檢查容器是否健康主要有兩種方式:在容器中執行命令和通過 HTTP 訪問預定義的 endpoint。
先來說說執行命令的方式,簡單來說就是在容器中執行某個 shell 命令,根據它的 exit code 來判斷容器是否正常工作:
livenessProbe: exec: command: - cat - /tmp/health initialDelaySeconds: 15 timeoutSeconds: 1
另外一種就是 HTTP 的方式,通過向某個 url 路徑發送 HTTP GET 請求,根據 response code 判斷容器是否正常工作:
livenessProbe: httpGet: path: /healthz port: 8080 httpHeaders: - name: X-Custom-Header value: Awesome initialDelaySeconds: 15 timeoutSeconds: 1 可以看到,你也可以自定義發送的 HTTP 請求的頭部。
不管用什么方式,如果檢測到容器不健康,kubelet 會刪除該容器,並根據容器的重啟策略進行處理(比如重啟,或者什么都不做)。
容器監控
kubelet 還有一個重要的責任,就是監控所在節點的資源使用情況,並定時向 master 報告。知道整個集群所有節點的資源情況,對於 pod 的調度和正常運行至關重要。
kubelet 使用cAdvisor進行資源使用率的監控。cAdvisor 是 google 開源的分析容器資源使用和性能特性的工具,在 kubernetes 項目中被集成到 kubelet 里,無需額外配置。默認情況下,你可以在http://<host_ip>:4194地址看到 cAdvisor 的管理界面。
Analyzes resource usage and performance characteristics of running containers.
除了系統使用的 CPU,Memory,存儲和網絡之外,cAdvisor 還記錄了每個容器使用的上述資源情況。
運行和驗證 kubelet
參數介紹
對於 kubelet 的配置,基本上都可以通過命令行啟動時候的參數進行控制。因為 kubernetes 處於快速開發過程中,參數也可能會發生變化,這里給出1.4版本一些重要的參數含義:
參數 | 解釋 | 默認值 |
---|---|---|
–address | kubelet 服務監聽的地址 | 0.0.0.0 |
–port | kubelet 服務監聽的端口 | 10250 |
–read-only-port | 只讀端口,可以不用驗證和授權機制,直接訪問 | 10255 |
–allow-privileged | 是否允許容器運行在 privileged 模式 | false |
–api-servers | 以逗號分割的 API Server 地址,用於和集群中數據交互 | [] |
–cadvisor-port | 當前節點 cadvisor 運行的端口 | 4194 |
–config | 本地 manifest 文件的路徑或者目錄 | ”” |
–file-check-frequency | 輪詢本地 manifest 文件的時間間隔 | 20s |
–container-runtime | 后端容器 runtime,支持 docker 和 rkt | docker |
–enable-server | 是否啟動 kubelet HTTP server | true |
–healthz-bind-address | 健康檢查服務綁定的地址,設置成 0.0.0.0 可以監聽在所有網絡接口 | 127.0.0.1 |
–healthz-port | 健康檢查服務的端口 | 10248 |
–hostname-override | 指定 hostname,如果非空會使用這個值作為節點在集群中的標識 | ”” |
–log-dir | 日志文件,如果非空,會把 log 寫到該文件 | ”” |
–logtostderr | 是否打印 log 到終端 | true |
–max-open-files | 允許 kubelet 打開文件的最大值 | 1000000 |
–max-pods | 允許 kubelet 運行 pod 的最大值 | 110 |
–pod-infra-container-image | 基礎鏡像地址,每個 pod 最先啟動的容器,會配置共享的網絡 | gcr.io/google_containers/pause-amd64:3.0 |
–root-dir | kubelet 保存數據的目錄 | /var/lib/kubelet |
–runonce | 從本地 manifest 或者 URL 指定的 manifest 讀取並運行結束就退出,和--api-servers、--enable-server參數不兼容 | |
–v | 日志 level | 0 |
啟動 kubelet
在這篇教程中,我們會單獨運行 kubelet,選擇從本地目錄中讀取 pod manifest 信息去啟動 pod。[Unit]
Description=Kubelet Service Documentation=http://kubernetes.com After=network.target Wants=network.target [Service] Type=simple EnvironmentFile=-/etc/sysconfig/kubelet ExecStartPre=/usr/bin/mkdir -p /etc/kubernetes/manifests ExecStart=/usr/bin/kubelet \ --allow-privileged=true \ --config=/etc/kubernetes/manifests \ --pod-infra-container-image=172.16.1.41:5000/google_containers/pause:0.8.0 \ --hostname-override=192.168.8.100 TimeoutStartSec=0 Restart=on-abnormal [Install] WantedBy=multi-user.target
引用:https://www.2cto.com/net/201702/598560.html