K8s集群調度續章

目錄

一、污點(Taint)

1、污點(Taint)

2、污點組成格式

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

4、查看node節點上的污點

5、設置污點

6、清除污點

7、示例一

查看pod狀態,模擬驅逐node02上的pod

設置驅逐node02

再次查看pod狀態

此時node02全部被驅逐

二、容忍(Tolerations)

1、容忍的簡介

2、面對污點,創建pod資源的容忍的實例

在兩個 Node 上都設置了污點后,此時 Pod 將無法創建成功

然后在修改pod3.yaml文件創建pod資源的容忍設置

此時pod創建成功

3、其他注意事項

①當不指定 key 值時,表示容忍所有的污點 key

②當不指定 effect 值時,表示容忍所有的污點作用

③有多個 Master 存在時,防止資源浪費,可以如下設置

4、維護操作cordon和drain

5、pod啟動階段(相位phase)

5.1.一般來說,pod 這個過程包含以下幾個步驟:

5.2.phase的可能狀態有

6、如何和刪除UNknown狀態的pod

三、k8s集群的故障排查步驟

1、查看pod事件

2、查看pod日志(Failed狀態下)

3、進入pod(狀態為running,但是服務沒有提供)

4、查看集群信息

5、發現集群狀態正常

6、查看kubelet日志發現


一、污點(Taint)

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 驅逐出去。

2、污點組成格式

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

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

①NoSchedule:表示 k8s 將不會將 Pod 調度到具有該污點的 Node 上

②PreferNoSchedule:表示 k8s 將盡量避免將 Pod 調度到具有該污點的 Node 上

③NoExecute:表示 k8s 將不會將 Pod 調度到具有該污點的 Node 上,同時會將 Node 上已經存在的 Pod 驅逐出去

4、查看node節點上的污點

格式:kubectl describe nodes <節點名稱> | grep Taints 
或者是kubectl describe nodes <節點名稱> | grep -i taints
eg:查看master01的污點
kubectl describe nodes master01 |grep -i taints

5、設置污點

格式kubectl taint node 指定的node key1=value1:NoSchedule
eg:給node01  設置污點進行測試
kubectl taint node node01 abc=a:NoSchedule

6、清除污點

格式:kubectl taint node 指定的node key:NoSchedule-
eg:清除node01 設置的污點
kubectl taint node node01 abc:NoSchedule-

7、示例一

查看pod狀態,模擬驅逐node02上的pod
[root@master01 ~]]#kubectl get pods -owide
查看pod狀態

設置驅逐node02
kubectl taint node node02 check=mycheck:NoExecute

再次查看pod狀態
kubectl get pods -owide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
affinity                            1/1     Running   0          20h   10.244.2.24   node01   <none>           <none>
myapp-699655c7fd-rnfzg              1/1     Running   0          20h   10.244.2.23   node01   <none>           <none>
myapp-699655c7fd-v2dtt              1/1     Running   0          20h   10.244.2.22   node01   <none>           <none>
myapp-699655c7fd-vxbz9              1/1     Running   0          20h   10.244.2.21   node01   <none>           <none>
myapp1-58794f76cb-6twr4             1/1     Running   0          20h   10.244.2.27   node01   <none>           <none>
myapp1-58794f76cb-75gzs             1/1     Running   0          20h   10.244.2.25   node01   <none>           <none>
myapp1-58794f76cb-v5gcz             1/1     Running   0          20h   10.244.2.26   node01   <none>           <none>
myapp10                             1/1     Running   0          19h   10.244.2.28   node01   <none>           <none>
myapp20                             1/1     Running   0          19h   10.244.2.29   node01   <none>           <none>
nginx-deployment-797d747cf6-nldj2   1/1     Running   0          29s   10.244.2.31   node01   <none>           <none>
nginx-deployment-797d747cf6-sqcm9   1/1     Running   0          29s   10.244.2.32   node01   <none>           <none>
nginx-deployment-797d747cf6-t4tsk   1/1     Running   0          29s   10.244.2.30   node01   <none>           <none>

此時node02全部被驅逐

二、容忍(Tolerations)

1、容忍的簡介

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

2、面對污點,創建pod資源的容忍的實例

kubectl taint node node01 check=mycheck:NoExecute
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: nginx:1.14tolerations:- key: "abc"operator: "Equal"value: "a"effect: "NoExecute"tolerationSeconds: 3600

在兩個 Node 上都設置了污點后,此時 Pod 將無法創建成功
然后在修改pod3.yaml文件創建pod資源的容忍設置
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1tolerations:- key: "check"operator: "Equal"value: "mycheck"effect: "NoExecute"tolerationSeconds: 3600
[root@master01 ~]]#kubectl delete -f pod3.yaml 
pod "myapp01" deleted
[root@master01 ~]]#kubectl apply -f pod3.yaml 
pod/myapp01 created
[root@master01 ~]]#kubectl get pods -owide
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
affinity                            1/1     Running   0          23h     10.244.2.24   node01   <none>           <none>
myapp-699655c7fd-rnfzg              1/1     Running   0          23h     10.244.2.23   node01   <none>           <none>
myapp-699655c7fd-v2dtt              1/1     Running   0          23h     10.244.2.22   node01   <none>           <none>
myapp-699655c7fd-vxbz9              1/1     Running   0          23h     10.244.2.21   node01   <none>           <none>
myapp01                             1/1     Running   0          87s     10.244.1.18   node02   <none>           <none>
myapp1-58794f76cb-6twr4             1/1     Running   0          23h     10.244.2.27   node01   <none>           <none>
myapp1-58794f76cb-75gzs             1/1     Running   0          23h     10.244.2.25   node01   <none>           <none>
myapp1-58794f76cb-v5gcz             1/1     Running   0          23h     10.244.2.26   node01   <none>           <none>
myapp10                             1/1     Running   0          23h     10.244.2.28   node01   <none>           <none>
myapp20                             1/1     Running   0          23h     10.244.2.29   node01   <none>           <none>
nginx-deployment-797d747cf6-nldj2   1/1     Running   0          3h20m   10.244.2.31   node01   <none>           <none>
nginx-deployment-797d747cf6-sqcm9   1/1     Running   0          3h20m   10.244.2.32   node01   <none>           <none>
nginx-deployment-797d747cf6-t4tsk   1/1     Running   0          3h20m   10.244.2.30   node01   <none>           <none>

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

此時pod創建成功

3、其他注意事項

①當不指定 key 值時,表示容忍所有的污點 key

tolerations:
? - operator: "Exists"

②當不指定 effect 值時,表示容忍所有的污點作用

tolerations:
? - key: "key"
? ? operator: "Exists"

③有多個 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-

4、維護操作cordon和drain

##對節點執行維護操作:
kubectl get nodes//將 Node 標記為不可調度的狀態,這樣就不會讓新創建的 Pod 在此 Node 上運行
kubectl cordon <NODE_NAME>          #該node將會變為SchedulingDisabled狀態//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//kubectl uncordon 將 Node 標記為可調度的狀態
kubectl uncordon <NODE_NAME>

5、pod啟動階段(相位phase)

Pod 創建完之后,一直到持久運行起來,中間有很多步驟,也就有很多出錯的可能,因此會有很多不同的狀態。

5.1.一般來說,pod 這個過程包含以下幾個步驟:

①調度到某臺 node 上。kubernetes 根據一定的優先級算法選擇一臺 node 節點將其作為 Pod 運行的 node

②拉取鏡像

③掛載存儲配置等

④運行起來,如果有健康檢查,會根據檢查的結果來設置其狀態

5.2.phase的可能狀態有

①Pending:表示APIServer創建了Pod資源對象并已經存入了etcd中,但是它并未被調度完成(比如還沒有調度到某臺node上),或者仍然處于從倉庫下載鏡像的過程中。

②Running:Pod已經被調度到某節點之上,并且Pod中所有容器都已經被kubelet創建。至少有一個容器正在運行,或者正處于啟動或者重啟狀態(也就是說Running狀態下的Pod不一定能被正常訪問)。

③Succeeded:有些pod不是長久運行的,比如job、cronjob,一段時間后Pod中的所有容器都被成功終止,并且不會再重啟。需要反饋任務執行的結果。

④Failed:Pod中的所有容器都已終止了,并且至少有一個容器是因為失敗終止。也就是說,容器以非0狀態退出或者被系統終止,比如 command 寫的有問題。

⑤Unknown:表示無法讀取 Pod 狀態,通常是 kube-controller-manager 無法與 Pod 通信。

6、如何和刪除UNknown狀態的pod

①從集群中刪除有問題的 Node。使用公有云時,kube-controller-manager 會在 VM 刪除后自動刪除對應的 Node。 而在物理機部署的集群中,需要管理員手動刪除 Node(kubectl delete node <node_name>)。

②被動等待 Node 恢復正常,Kubelet 會重新跟 kube-apiserver 通信確認這些 Pod 的期待狀態,進而再決定刪除或者繼續運行這些 Pod。

③主動刪除 Pod,通過執行 kubectl delete pod <pod_name> --grace-period=0 --force 強制刪除 Pod。但是這里需要注意的是,除非明確知道 Pod 的確處于停止狀態(比如 Node 所在 VM 或物理機已經關機),否則不建議使用該方法。特別是 StatefulSet 管理的 Pod,強制刪除容易導致腦裂或者數據丟失等問題

三、k8s集群的故障排查步驟

1、查看pod事件

kubectl describe TYPE NAME_PREFIX  

2、查看pod日志(Failed狀態下)

kubectl logs <POD_NAME> [-c Container_NAME]

3、進入pod(狀態為running,但是服務沒有提供)

kubectl exec –it <POD_NAME> bash

4、查看集群信息

kubectl get nodes

5、發現集群狀態正常

kubectl cluster-info

6、查看kubelet日志發現

journalctl -xefu kubelet

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

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

相關文章

NoSQL數據庫技術與應用 教學設計

《NoSQL數據庫技術與應用》 教學設計 課程名稱&#xff1a;NoSQL數據庫技術與應用 授課年級&#xff1a; 20xx年級 授課學期&#xff1a; 20xx學年第一學期 教師姓名&#xff1a; 某某老師 2020年5月6日 課題 名稱 第1章 初識NoSQL 計劃 學時 3 課時 內容 分析 隨著云計算、…

【軟件安裝】office不讓卸載、visio安裝報錯64位等

問題描述 office安裝時報錯&#xff0c;顯示64位、32位不能共存。或者word已經安裝了&#xff0c;再裝visio的時候就顯示報錯。 解決思路 卸載已經安裝的版本重新安裝 遇到的問題 首先是卸載不了&#xff0c;在windows的setting里面&#xff0c;無法卸載&#xff1b;安裝包…

【面試】JDK和JVM是什么關系?

目錄 1. JDK2. JVM3. 關系 1. JDK 1.Java Development Kit&#xff0c;java開發工具包。2.提供了java應用程序開發所需的所有工具和API。3.JDK包含了JRE&#xff08;Java Runtime Environment&#xff09;,即Java運行環境&#xff0c;以及編譯Java源代碼的編譯器&#xff08;j…

消費增值的真面目!綠色積分的合理運用!

各位朋友&#xff0c;大家好&#xff01;我是吳軍&#xff0c;來自一家備受矚目的軟件開發企業&#xff0c;擔任產品經理一職。今天&#xff0c;我非常榮幸能有機會與大家分享一種在市場上備受矚目的新型商業模式——消費增值模式。 隨著環保和可持續發展理念日益深入人心&…

對象解構與迭代器的貓膩?

前言 變量的解構賦值是前端開發中經常用到的一個技巧&#xff0c;比如&#xff1a; // 對象解構 const obj { a: 1, b: 2 }; const { a, b } obj; console.log(a, b)數組解構 const arr [1, 2, 3]; const [a, b] arr; console.log(a, b)工作中我們最經常用的就是類似上面…

輕松拿捏C語言——自定義類型之【結構體】

&#x1f970;歡迎關注 輕松拿捏C語言系列&#xff0c;來和 小哇 一起進步&#xff01;? &#x1f389;創作不易&#xff0c;請多多支持&#x1f389; &#x1f308;感謝大家的閱讀、點贊、收藏和關注&#x1f495; &#x1f339;如有問題&#xff0c;歡迎指正 1. 結構體類型的…

echarts-象形柱圖

象形柱圖 一般的柱圖都是純色柱圖&#xff0c;使用象形柱圖可以給柱圖定義自己的樣式。 樣式的調節與柱圖一樣&#xff0c;核心在于symbol調節柱圖的組成。 let options {tooltip: {},xAxis: {type: "category",data: ["d1", "d2", "d3&qu…

具有固定寬度的盒子:\makebox, \parbox

makebox \makebox 是 LaTeX 中的一個命令&#xff0c;用于創建一個具有固定寬度的盒子&#xff0c;并在該盒子內放置內容。這個命令可以用于控制文本或對象的位置和對齊。 語法如下&#xff1a; \makebox[<width>][<alignment>]{<content>}其中&#xff1…

存儲+調優:存儲-memcached

存儲調優&#xff1a;存儲-memcached 什么是memcached? 高性能的分布式內存緩存服務器。通過緩存數據庫的查詢結果&#xff0c;減少數據庫訪問次數&#xff0c;以提高動態Web應用的速度、提高可擴展性。 在memcached中存什么&#xff1f; 盡快被保存 訪問頻率高 1.數據保…

【CSharp】int類型與IntPtr類型之間的轉換

【CSharp】int類型與IntPtr類型之間的轉換 1.背景2.int轉IntPtr接口3.IntPtr轉int接口4.相互轉化示例1.背景 .NET提供了一個結構體System.IntPtr專門用來代表句柄或指針。 IntPtr 結構,表示一個帶符號整數,其中位寬度與指針相同。 注解 類型 IntPtr 設計為一個整數,其大小…

unity回到低版本報錯解決

用高版本2022打開過后的再回到2020就報了一個錯。 報錯如下&#xff1a; Library\PackageCache\com.unity.ai.navigation1.1.5\Runtime\NavMeshSurface.cs 看了一下是Library&#xff0c;然后我刪除了整個Library文件夾&#xff0c;重啟啟動生成Library&#xff0c;然后還是…

IT人的拖延——渴望成功與害怕成功的矛盾

很多人都以為&#xff0c;害怕失敗是拖延的主要誘因&#xff0c;但其實“害怕成功”也是拖延的主要誘因之一。要說這個原因&#xff0c;我們不得不提起Bible中的一個人“約拿”&#xff0c;讓我們先來看看他的故事帶給我們什么啟示。 約拿情結簡介 約拿是Bible中的一名先知&a…

二十九、openlayers官網示例DeclutterGroup解析——避免矢量圖層的文字重疊

官網demo地址&#xff1a; Declutter Group 這篇說的是如何設置矢量圖層上多數據點文字不重疊。 主要是屬性declutter &#xff0c;用于處理矢量圖層上重疊的標注和符號&#xff0c;為true時啟用去重疊功能。所有矢量特征的標注和符號都會被處理以避免重疊。false則與之相反。…

Nuxt - middleware 路由中間件

官方文檔&#xff1a;https://nuxt.com.cn/docs/guide/directory-structure/middleware 目錄 1 中間件類別2 中間件執行順序3 內聯路由中間件4 命名路由中間件5 全局路由中間件 1 中間件類別 內聯路由中間件&#xff0c;直接在頁面內定義。命名路由中間件&#xff0c;放置在 …

es安裝錯誤Exception in thread “main“ java.nio.file.NoSuchFileException解決方案

docker 啟動es出現一下錯誤的解決方案 Exception in thread “main” java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config/jvm.options Exception in thread "main" java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config/jvm.op…

香橙派OrangePi AIpro,助力國產AIoT邁向新的臺階!

前言&#xff1a;很高興受邀CSDN與OrangePi官方組織的測評活動&#xff0c;本次測評是一塊基于AI邊緣計算的香橙派開發板OrangePi AIpro。這是 香橙派 聯合 華為昇騰 合作精心打造的新一代邊緣AI計算產品&#xff0c;于2023年12月初發布&#xff0c;提供 8/20TOPS澎湃算力[1]&a…

Java | Leetcode Java題解之第102題二叉樹的層序遍歷

題目&#xff1a; 題解&#xff1a; class Solution {public List<List<Integer>> levelOrder(TreeNode root) {Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();if (root ! null) queue.a…

Bean的一些屬性信息總結

我們知道&#xff0c;在Spring中&#xff0c;一個Bean可以理解為一個對象&#xff0c;但是二者之間肯定是有區別的&#xff0c;比如一個Bean可以實例化成很多個對象、Bean中可以帶有某些描述信息。 學習Bean&#xff0c;能更好地使用Bean。 1、Spring兩個核心概念的由來【可忽…

Git和plink

安裝git的話首先進入到git官網進行下載Git - Downloading Package (git-scm.com) &#xff0c;點擊便會自動進行下載。 安裝plink時也是根據自己電腦的版本號選擇進行安裝&#xff0c;我的是windows的64位&#xff0c;由此選擇以上版本進行安裝&#xff0c;這一個下載完成之后不…

python lxml安裝失敗怎么解決

通過pip install lxml 安裝lxml多次失敗&#xff0c;失敗原因總結如下&#xff1a; 1、pip版本未更新 解決方法&#xff1a;通過pip安裝時&#xff0c;需保證pip的版本沒有問題。 更新方法&#xff1a;在系統框輸入&#xff1a;python -m pip install --upgrade pip 2、下載…