關于k8s集群的污點和容忍,以及k8s集群的故障排查思路

?

?一 污點(Taint) 和 容忍(Tolerations)

(一)污點
在Kubernetes(K8s)中,污點(Taints)是一個重要的概念,用于實現Pod的調度控制。以下是關于污點的詳細解釋:1.污點定義
污點是什么:污點是一種定義在節點上的鍵值型屬性數據,用于讓節點拒絕將Pod調度運行于其上,除非該Pod對象具有接納節點污點的容忍度(Toleration)。鍵值型數據:污點由三個部分組成:key、value和effect。其中key和value是污點的名稱和值,而effect則定義了污點的效果。2.污點效果
污點的效果(Effect)主要有三種類型:NoSchedule:新的不能容忍此污點的Pod對象不會被調度至當前節點,但已在該節點上運行的Pod對象不受影響。PreferNoSchedule:Kubernetes會盡量避免將新的不能容忍此污點的Pod對象調度至當前節點,但如果沒有其他可用節點,仍然會調度。類似于節點親和與pod親和中的軟策略NoExecute:新的不能容忍此污點的Pod對象不會被調度至當前節點,而且已在該節點上運行但不再滿足匹配規則的Pod對象將被驅逐。

1.1 污點(taint)

節點親和性,是Pod的一種屬性(偏好或硬性要求),它使Pod被吸引到一類特定的節點。Taint 則相反,它使節點能夠排斥一類特定的 Pod。
Taint 和 Toleration 相互配合,可以用來避免 Pod 被分配到不合適的節點上。每個節點上都可以應用一個或多個 taint ,這表示對于那些不能容忍這些 taint 的 Pod,是不會被該節點接受的。如果將 toleration 應用于 Pod 上,則表示這些 Pod 可以(但不一定)被調度到具有匹配 taint 的節點上

使用 kubectl taint 命令可以給某個 Node 節點設置污點,Node 被設置上污點之后就和 Pod 之間存在了一種相斥的關系,可以讓 Node 拒絕 Pod 的調度執行,甚至將 Node 已經存在的 Pod 驅逐出去。

污點的組成格式下
key=value:effect

每個污點有一個 key 和 value 作為污點的標簽,其中 value 可以為空,effect 描述污點的作用。

當前 taint effect 支持如下三個選項:

●NoSchedule:表示 k8s 將不會將 Pod 調度到具有該污點的 Node 上
●PreferNoSchedule:表示 k8s 將盡量避免將 Pod 調度到具有該污點的 Node 上
●NoExecute:表示 k8s 將不會將 Pod 調度到具有該污點的 Node 上,同時會將 Node 上已經存在的 Pod 驅逐出去
?

?master 就是因為有 NoSchedule 污點,k8s 才不會將 Pod 調度到 master 節點上

設置污點
kubectl taint node node01 key1=value1:NoSchedule

#節點說明中,查找 Taints 字段
kubectl describe node node-name ?

#去除污點
kubectl taint node node01 key1:NoSchedule-

kubectl taint node node01 鍵名=鍵值:NoSchedule
//增加污點kubectl taint node node01 鍵名=鍵值:NoSchedule-
kubectl taint node node01 鍵名-
//刪除kubectl describe nodes node01|grep -A5 -i taint
//查看

?

?舉例說明:將node02節點設置為NoSchedule

?

驗證污點的作用——NoExecute?

此時,給node02也設置為NoExecute 兩個都是驅逐?

因此所有在node01上面的pod都被驅逐出來,并轉移到node02上面,查看 Pod 狀態,會發現 node01 上的 Pod 已經被全部驅逐(注:如果是 Deployment 或者 StatefulSet 資源類型,為了維持副本數量則會在別的 Node 上再創建新的 Pod)

?

?自主創建的pod會停止,一直處于pending的狀態,因為node01 node02都被設置成了NoExecute,找不到適合的node,才會變成pending

驗證污點的作用—NoSchedule??

原本在node1上面的pod不會被刪除,新建的pod不會調度到node1節點上面

?隨后,新建一個pod 觀察一下,因為node01 有污點,不會將pod調度到node01上,因此pod01 在node02上

?

?

驗證污點的作用——PreferNoSchedule?

分別給node01 node02 創建污點

?過濾一下node1? node02的taint污點

隨后,創建一個新的pod

污點設置在node上面,容忍設置在pod節點上面

?

?二、容忍(pod可以適應node上面的污點)

設置了污點的 Node 將根據 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之間產生互斥的關系,Pod 將在一定程度上不會被調度到 Node 上。但我們可以在 Pod 上設置容忍(Tolerations),意思是設置了容忍的 Pod 將可以容忍污點的存在,可以被調度到存在污點的 Node 上。,沒有設置污點的node也是可以調度的。

2.容忍的組成

容忍通常包含以下幾個部分:

鍵(Key):與污點的鍵相匹配。

值(Value):與污點的值相匹配。如果不指定值,Pod將容忍所有值的同名污點。

效應(Effect):與污點的效應相匹配。常見的效應包括NoSchedule、PreferNoSchedule和NoExecute。

容忍期限(TolerationSeconds)(僅對NoExecute效應有效):指定Pod在節點被賦予NoExecute污點后,能夠繼續在該節點上運行的時間(以秒為單位)。超過這個時間后,Pod將被驅逐。

操作符(Operator):用于指定容忍與污點的匹配方式。常見的操作符包括Equal和Exists。Equal要求鍵、值和效應都完全匹配,而Exists只要求鍵和效應匹配。

?隨后,設置一個pod 跟node02這個節點做容忍

apiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1tolerations:- key: "check"operator: "Equal"value: "no"effect: "NoExecute"tolerationSeconds: 15

?

?#其中的 key、vaule、effect 都要與 Node 上設置的 taint 保持一致
#operator 的值為 Exists 將會忽略 value 值,即存在即可
#tolerationSeconds 用于描述當 Pod 需要被驅逐時可以在 Node 上繼續保留運行的時間

?其它注意事項(equal表示精確匹配,exists表示模糊匹配)

(1)當不指定 key 值時,表示容忍所有的污點 key,就是指明只要key這個鍵相同即可,里面的值是什么都無所謂。
? tolerations:
? - operator: "Exists"

舉例說明:


? 隨后,寫一個yaml文件去創建pod


當超過40秒之后,就會被驅逐

2)作當不指定 effect 值時,表示容忍所有的污點用
? tolerations:
? - key: "key"
? ? operator: "Exists"

//其它注意事項
(1)當不指定 key 值時,表示容忍所有的污點 keytolerations:- operator: "Exists"(2)當不指定 effect 值時,表示容忍所有的污點作用tolerations:- key: "key"operator: "Exists"(3)有多個 Master 存在時,防止資源浪費,可以如下設置
kubectl taint node Master-Name node-role.kubernetes.io/master=:PreferNoSchedule//如果某個 Node 更新升級系統組件,為了防止業務長時間中斷,可以先在該 Node 設置 NoExecute 污點,把該 Node 上的 Pod 都驅逐出去
kubectl taint node node01 check=mycheck:NoExecute//此時如果別的 Node 資源不夠用,可臨時給 Master 設置 PreferNoSchedule 污點,讓 Pod 可在 Master 上臨時創建
kubectl taint node master node-role.kubernetes.io/master=:PreferNoSchedule//待所有 Node 的更新操作都完成后,再去除污點
kubectl taint node node01 check=mycheck:NoExecute-

?(三)資源優化

1.多master使用

當有多個master存在時,可以將備用的master的污點狀態設置為PreferNoSchedule,這樣的話,會盡可能避免此節點,當其它節點不可調用(資源頂峰、節點故障、節點更新等)時,可以使用master進行臨時調度,待資源恢復時,再將pod轉移?

kubectl taint node Master-Name node-role.kubernetes.io/master=:PreferNoSchedule
2.Node更新

當某個node節點需要資源更新時,為防止業務長時間中斷,可以依次升級node,首先將需要升級的node節點設置污點,將pod資源調度到其它node節點上(如master資源充足也可以臨時調用),等到該節點升級完畢后,去除污點。依次類推,將所有節點更新升級?

kubectl taint node node-name key=value:NoExecute
#設置污點
-------------------------------------------------------------------------------
kubectl taint node node-name key:NoExecute-
#去除污點
3.維護操作

作用:阻止新的 Pods 被調度到該節點上。當一個節點被標記為 cordon 時,已經在該節點上運行的 Pods 不會被驅逐,但新的 Pods 不會被調度到這個節點。

使用場景:通常用于節點的維護或升級,確保在維護期間不會有新的工作負載被分配到該節點上。命令示例:kubectl cordon node01

首先,刪除node1 node2上面的污點


? ? ? ? ? ? ?? ? ? ? ? ?設置的cordon維護策略,默認的污點為NoSchedule

驗證一下:

創建兩個pod

?

恢復調度

使用 kubectl uncordon node01 命令可以恢復節點的調度狀態,允許新的 Pods 調度到該節點上。

?drain?

//kubectl drain 可以讓 Node 節點開始釋放所有 pod,并且不接收新的 pod 進程。drain 本意排水,意思是將出問題的 Node 下的 Pod 轉移到其它 Node 下運行
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-emptydir-data --force--ignore-daemonsets:無視 DaemonSet 管理下的 Pod。
--delete-emptydir-data:如果有 mount local volume 的 pod,會強制殺掉該 pod。
--force:強制釋放不是控制器管理的 Pod。

注:執行 drain 命令,會自動做了兩件事情:
(1)設定此 node 為不可調度狀態(cordon)
(2)evict(驅逐)了 Pod?
?

簡單來說

cordon的作用類似于NoSchedule

drain的作用類似于NoExecute

?四、Pod啟動階段?

第一步:controller manager管理的控制器創建pod副本

第二步:scheduler調度器根據調度算法選擇最合適的node節點調度pod

第三步:kubelet拉取鏡像

第四步:kubelet掛載存儲卷

第五步:kubelet創建并運行容器

第六步:kubelet根據容器探針的探測結果設置Pod狀態

?

五、關于pod的五種狀態

Pending:Pod已經創建,但是Pod還處于包括未完成調度到node節點或者還處于在拉取鏡像的過程中、存儲卷掛載失敗的情況
Running:Pod所有容器已被創建,且至少有一個容器正在運行
Succeeded:Pod所有容器都已經成功退出,且不再重啟。(Completed)
Failed:Pod所有容器都已經退出,且至少有一個容器是異常退出的。(Error)
Unknown:master節點的controller manager無法獲取到Pod的狀態信息,通常是因為master節點的apiserver與Pod所在node節點的kubelet通信失聯導致的(比如node節點宕機或kubelet進程故障)
總結:Pod遵循預定于的生命周期,起始于Pend階段,如果至少有一個容器正常運行,則進Running階段,之后取決于Pod是否有容器以失敗狀態退出而進入Succeeded或Failed階段。

?六、k8s常見的排障手段

針對組件故障

kubectl get nodes                               查看node節點運行狀態
kubectl describe nodes <node節點名稱>           查看node節點的詳細信息和資源描述
kubectl get cs                                  查看master組件的健康狀態
kubectl cluster-info                            查看集群信息journalctl -u -f kubelet                        跟蹤查看kubelet進程日志

針對pod故障

kubectl get pods -o wide                          查看Pod的運行狀態和就緒狀態
kubectl describe <pods|其它資源類型> <資源名稱>   查看資源的詳細信息和事件描述,主要是針對處于Pending狀態的故障
kubectl logs <Pod資源名稱> -c <容器名稱> -f -p    查看Pod容器的主進程日志,主要是針對進入Running狀態后的故障,比如Failed異常問題
kubectl exec -it <Pod資源名稱> -c <容器名稱> sh|bash   進入Pod容器查看容器內部相關的狀態信息,比如進程、端口、文件、流量等狀態信息
kubectl debug -it <Pod資源名稱> --image=<臨時工具容器的鏡像名> --target=<目標容器>    在Pod中創建臨時工具容器進入目標容器進行調試,主要針對沒有調試工具的容器使用
nsenter -n --target <容器ID>                   在Pod容器宿主機使用nsenter轉換網絡namespace,直接在宿主機進入目標容器的網絡命名空間進行抓包等調試工作

針對網絡故障

kubectl get svc                                查看service資源的clusterIP、port、nodePort等信息
kubectl describe svc <svc資源名稱>             查看service資源的標簽選擇器、endpoints端點等信息
kubectl get pods --show-lables                 查看Pod的標簽

故障排除思路

在k8s的操作中,由于組件較多,任何一步有錯誤,都可能導致整個k8s集群陷入不可以狀態,下面我就結合工作中的一些操作做一總結

1.環境設置
防火墻策略、核心防護可能會導致節點之間無法通信

swap分區會導致kubelet無法啟動,kubelet無法啟動,意味著網絡插件與kube-proxy容器無法啟動

集群信息:使用kubectl get node查看集群信息,確保節點之間通信正常

2.pod事件處理
kubectl describe <資源類型> <資源名稱>:查看資源詳細信息

kubectl get events:指令查看所有事件信息,并使用grep過濾關鍵字?

kubectl exec –it pod_name bash :進入容器查看,只限于處于Running狀態

kubectl logs pod_name:查看pod日志,在Failed狀態下

journalctl -xefu kubelet:查看kubelet日志

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17891.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17891.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

元宇宙vr科普館場景制作引領行業潮流

在這個數字化高速發展的時代&#xff0c;北京3D元宇宙場景在線制作以其獨特的優勢&#xff0c;成為了行業內的創新引領者。它能夠快速完成空間設計&#xff0c;根據您的個性化需求&#xff0c;輕松設置布局、燈光、音效以及互動元素等&#xff0c;為您打造出一個更加真實、豐富…

【算法】位運算算法——判斷字符是否唯一

題解&#xff1a;判斷字符是否唯一(位運算算法) 目錄 1.題目2.題解3.位圖參考代碼4.細節5.總結 1.題目 題目鏈接&#xff1a;LINK 2.題解 題解有兩種方法&#xff0c; 一是做一個哈希數組&#xff0c;去查重&#xff1b; 二是直接用一個變量每一位來對應表示是否有這個字母…

Android - failed to set system property

記錄一次疏忽&#xff0c;起因是我需要在自定義的 receiver 中保存 property 方便&#xff0c;方便在三方 app 中使用&#xff0c;結果直接崩潰了&#xff0c;雖然結果保存成功了&#xff0c;但是這種情況也是無法接收的&#xff0c;錯誤日志如下&#xff1a; M006082 05-25 1…

【OpenGL Mathematics(GLM)下載鏈接】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、OpenGL Mathematics(GLM)二、使用步驟 前言 3D 圖形編程會大量使用向量和矩陣代數。因此&#xff0c;配合一個支持常見數學計算任務的函數庫或者類包&…

趕緊收藏!2024 年最常見 20道 Rocket MQ面試題(二)

上一篇地址&#xff1a;趕緊收藏&#xff01;2024 年最常見 20道 Rocket MQ面試題&#xff08;一&#xff09;-CSDN博客 三、如何在RocketMQ中保證消息的順序性&#xff1f; 在RocketMQ中保證消息的順序性主要通過以下幾個方面實現&#xff1a; 1、單線程順序寫入&#xff1a…

場景題11111

關單操作&#xff1f; 優先考慮定時任務、Redissonredis、RocketMQ延遲消息實現&#xff08;訂單量特別大的時候&#xff0c;不建議使用MQ&#xff09; 每個訂單都有一個消息會增加資源消耗可靠性問題&#xff08;丟失&#xff09;大量的無效消息不是所有消息隊列都支持一般通…

PID控制中的積分到底是什么,為什么它可以將矩形線轉換為曲線?simulink搭建PID控制,積分模塊1/s

PID控制中的積分到底是什么&#xff0c;為什么它可以將矩形線轉換為曲線&#xff0c; 這個問題呢其實道理很簡單&#xff0c;用到的是初中的知識 我們做幾個測試案例 如下面matlab搭建了積分1/s 那顯示如下&#xff08;紅色曲線相當于加速度、藍色曲線相當于速度&#xff09;&a…

Flutter 中的 AnimatedPadding 小部件:全面指南

Flutter 中的 AnimatedPadding 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;動畫是增強用戶界面和提升用戶體驗的重要工具。AnimatedPadding 是 Flutter 的動畫庫中的一個組件&#xff0c;它允許你為子組件添加動態變化的內邊距。這個組件可以在展開或折疊列表項、標…

5.28_Java語法_運算符,接收鍵盤數據

1、運算符 具體應用同我C語言操作符詳解博客相同,另有補充會直接寫 1.1、基本的算術運算符、符號做連接符 CSDN 具體應用同我C語言操作符詳解博客相同 符號做連接符&#xff1a; ""符號與字符串運算連用的時候是用作連接符的&#xff0c;其結果依然是一個字符串…

【html項目實戰】年長者便捷上網中心

作品介紹 本HTML作品名為“年長者便捷上網中心”,旨在為年長用戶提供一個友好且易于操作的在線界面。考慮到年長用戶對于大字體、清晰的顏色和簡潔布局的需求,該作品在設計和樣式上進行了精心打造,以確保用戶能夠輕松瀏覽和使用。 一、整體布局 作品采用經典的頭部(head…

SQL常用基礎語句(二)-- FGHIJ開頭

GROUP BY GROUP BY語法可以根據給定數據列的每個成員對查詢結果進行分組統計&#xff0c;最終得到一個分組匯總表。在GROUP BY子句后面包含了一個HAVING子句&#xff0c;HAVING類似于WHERE&#xff0c;&#xff08;唯一的差別是WHERE過濾行&#xff0c;HAVING過濾組&#xff0…

前端響應式期末作品

網頁設計成品_前端響應式 主題&#xff1a;租房網站&#xff0c;共6個html頁面&#xff0c;包含首頁&#xff0c;登錄注冊&#xff0c;租房新聞&#xff0c;租房精選&#xff0c;租房詳情&#xff0c;數據可視化頁面&#xff08;可以修改內容&#xff09; 采用技術&#xff1a;…

啟動ChatGPT 的快捷鍵,探索全新 ChatGPT MacOS 應用程序!

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

前端錯誤監控與日志收集實踐

前端錯誤監控與日志收集是確保應用程序穩定性和用戶體驗的關鍵部分。今天我們來聊聊前端常用的前端錯誤監控與日志收集方法&#xff1a; 使用try-catch捕獲錯誤 在可能出現錯誤的代碼塊中&#xff0c;使用try-catch結構捕獲錯誤&#xff1a; try {// 可能會拋出錯誤的代碼} c…

深度解析Java 11核心新特性

碼到三十五 &#xff1a; 個人主頁 < 免責聲明 > 避免對文章進行過度解讀&#xff0c;因為每個人的知識結構和認知背景都不同&#xff0c;沒有一種通用的解決方案。對于文章觀點&#xff0c;不必急于評判。融入其中&#xff0c;審視自我&#xff0c;嘗試從旁觀者角度認清…

kafka 工作流程文件存儲

爬蟲組件分析 目錄概述需求&#xff1a; 設計思路實現思路分析1.kafka 工作流程2.kafka 文件存儲 參考資料和推薦閱讀 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for…

軟考結束。有什么要說的

1. 竟然是機試&#xff0c;出乎我意料。是 考試機構覺得筆試成本高了么。這次的考試是機試&#xff0c;相比以往有所不一樣。感言是不是以后都會在固定地點考試也說不準。 2. 遇到年輕人。 這次旁邊的一個女同學第一次參加&#xff0c;還像我詢問了一些關于軟考的事。我是有…

深度解析Vue.js組件間的通信方式

Vue.js 組件通信主要通過以下幾種方式來實現&#xff1a; Props&#xff08;屬性&#xff09; 方向&#xff1a;父組件到子組件用途&#xff1a;父組件通過屬性向子組件傳遞數據。特性&#xff1a; 只讀&#xff1a;默認情況下&#xff0c;子組件不能改變props的值。驗證&…

關于學習Go語言的并發編程

開始之前&#xff0c;介紹一下?最近很火的開源技術&#xff0c;低代碼。 作為一種軟件開發技術逐漸進入了人們的視角里&#xff0c;它利用自身獨特的優勢占領市場一角——讓使用者可以通過可視化的方式&#xff0c;以更少的編碼&#xff0c;更快速地構建和交付應用軟件&#…

【數據結構】直接選擇排序詳解!

文章目錄 1.直接選擇排序 1.直接選擇排序 &#x1f427; begin 有可能就是 maxi &#xff0c;所以交換的時候&#xff0c;要及時更新 maxi &#x1f34e; 直接選擇排序是不穩定的&#xff0c;例如&#xff1a; 9 [9] 5 [5]&#xff0c;排序后&#xff0c;因為直接選擇排序是會…