kubelet組件功能


kubernetes是一個分布式的集群管理系統,在每個節點(node)上都要運行一個 worker 對容器進行生命周期的管理,這個 worker 程序就是kubelet。

簡單地說,kubelet的主要功能就是定時從某個地方獲取節點上 pod/container 的期望狀態(運行什么容器、運行的副本數量、網絡或者存儲如何配置等等),並調用對應的容器平台接口達到這個狀態。

集群狀態下,kubelet 會從 master 上讀取信息,但其實 kubelet 還可以從其他地方獲取節點的 pod 信息。目前 kubelet 支持三種數據源:

kubelet architecture

  1. 本地文件
  2. 通過 url 從網絡上某個地址來獲取信息
  3. API Server:從 kubernetes master 節點獲取信息

從管理的對象來說,kubelet 目前支持dockerrkt,默認情況下使用的 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM