Kubernetes 節點
什么是 Kubernetes 節點
Kubernetes 通過將容器放入在節點(Node)上運行的 Pod 中來執行你的作業負載,
節點上的組件
節點上的組件包括:
- kubelet:kubelet 接收一組通過各類機制提供給它的 PodSpecs,確保這些 PodSpecs 中描述的容器處于運行狀態且健康,
- 容器運行時:容器運行環境是負責運行容器的軟體,
- kube-proxy:kube-proxy 是集群中每個節點(node)所上運行的網路代理,實作 Kubernetes 服務(Service)概念的一部分,
如何管理節點
如何添加節點
向 API 服務器添加節點的方式主要有兩種:
- 節點上的 kubelet 向控制面執行自注冊
- 手動添加一個 Node 物件
節點名稱唯一性
節點的名稱用來標識 Node 物件,沒有兩個 Node 可以同時使用相同的名稱,Kubernetes 還假定名字相同的資源是同一個物件,
手動節點管理
你可以使用 kubectl 來創建和修改 Node 物件,
如果標記節點為不可調度(unschedulable),將阻止新 Pod 調度到該 Node 之上,但不會影響任何已經在其上的 Pod,這是重啟節點或者執行其他維護操作之前的一個有用的準備步驟,
要標記一個 Node 為不可調度,執行以下命令:
kubectl cordon $NODENAME
節點狀態
一個節點的狀態包含以下資訊:
- 地址(Addresses)
- 狀況(Condition)
- 容量與可分配(Capacity)
- 資訊(Info)
地址
這些欄位的用法取決于你的云服務商或者物理機配置,
- HostName:由節點的內核報告,可以通過 kubelet 的 --hostname-override 引數覆寫,
- ExternalIP:通常是節點的可外部路由(從集群外可訪問)的 IP 地址,
- InternalIP:通常是節點的僅可在集群內部路由的 IP 地址,
狀況
conditions 欄位描述了所有 Running 節點的狀況,狀況的示例包括:
| 節點狀況 | 描述 |
|---|---|
| Ready | 如節點是健康的并已經準備好接收 Pod 則為 True;False 表示節點不健康而且不能接收 Pod;Unknown 表示節點控制器在最近 node-monitor-grace-period 期間(默認 40 秒)沒有收到節點的訊息 |
| DiskPressure | True 表示節點存在磁盤空間壓力,即磁盤可用量低, 否則為 False |
| MemoryPressure | True 表示節點存在記憶體壓力,即節點記憶體可用量低,否則為 False |
| PIDPressure | True 表示節點存在行程壓力,即節點上行程過多;否則為 False |
| NetworkUnavailable | True 表示節點網路配置不正確;否則為 False |
如果 Ready 狀況的 status 處于 Unknown 或者 False 狀態的時間超過了 pod-eviction-timeout 值(一個傳遞給 kube-controller-manager 的引數),節點控制器會對節點上的所有 Pod 觸發 API 發起的驅逐,默認的逐出超時時長為 5 分鐘,
當節點上出現問題時,Kubernetes 控制面會自動創建與影響節點的狀況對應的污點,調度器在將 Pod 指派到某 Node 時會考慮 Node 上的污點設定,Pod 也可以設定容忍度,以便能夠在設定了特定污點的 Node 上運行,
容量(Capacity)與可分配(Allocatable)
這兩個值描述節點上的可用資源:
- CPU
- 記憶體
- 可以調度到節點上的 Pod 的個數上限
capacity 塊中的欄位標示節點擁有的資源總量,allocatable 塊指示節點上可供普通 Pod 消耗的資源量,
資訊(Info)
Info 指的是節點的一般資訊,如內核版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、容器運行時詳細資訊,以及節點使用的作業系統,kubelet 從節點收集這些資訊并將其發布到 Kubernetes API,
心跳
Kubernetes 節點發送的心跳幫助你的集群確定每個節點的可用性,并在檢測到故障時采取行動,
對于節點,有兩種形式的心跳:
- 更新節點的 .status
- kube-node-lease 名字空間中的 Lease(租約)物件,每個節點都有一個關聯的 Lease 物件,
與 Node 的 .status 更新相比,Lease 是一種輕量級資源,使用 Lease 來表達心跳在大型集群中可以減少這些更新對性能的影響,
kubelet 負責創建和更新節點的 .status,以及更新它們對應的 Lease,
- 當節點狀態發生變化時,或者在配置的時間間隔內沒有更新事件時,kubelet 會更新 .status,.status 更新的默認間隔為 5 分鐘(比節點不可達事件的 40 秒默認超時時間長很多),
- kubelet 會創建并每 10 秒(默認更新間隔時間)更新 Lease 物件,Lease 的更新獨立于 Node 的 .status 更新而發生,如果 Lease 的更新操作失敗,kubelet 會采用指數回退機制,從 200 毫秒開始重試,最長重試間隔為 7 秒鐘,
節點控制器
節點控制器在節點的生命周期中扮演多個角色:
- 當節點注冊時為它分配一個 CIDR 區段(如果啟用了 CIDR 分配)
- 保持節點控制器內的節點串列與云服務商所提供的可用機器串列同步,如果在云環境下運行,只要某節點不健康,節點控制器就會詢問云服務是否節點的虛擬機仍可用,如果不可用,節點控制器會將該節點從它的節點串列洗掉,
- 監控節點的健康狀況,節點控制器負責:
- 在節點不可達的情況下,在 Node 的 .status 中更新 Ready 狀況,在這種情況下,節點控制器將 NodeReady 狀況更新為 Unknown,
- 如果節點仍然無法訪問:對于不可達節點上的所有 Pod 觸發 API 發起的逐出操作,默認情況下,節點控制器在將節點標記為 Unknown 后等待 5 分鐘提交第一個驅逐請求,
參考資料
- kubernetes.io 官方檔案:Kubernetes 節點
思維導圖

B站學習
從零開始學習k8s:k8s節點

抖音學習

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/505594.html
標籤:其他
上一篇:HTMLTestRunner生成報告中有中文亂碼解決方案
下一篇:Git 使用指南
