中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

沈陽(yáng)網(wǎng)站制作定制策劃2024年2月疫情又開始了嗎

沈陽(yáng)網(wǎng)站制作定制策劃,2024年2月疫情又開始了嗎,海南旅游網(wǎng)站建設(shè)方式,投票網(wǎng)站定制文章目錄 一.pod集群調(diào)度概念1.調(diào)度約束( List-Watch組件)2.List-Watch的工作機(jī)制(1)List-Watch的工作機(jī)制流程(2)List-Watch的工作機(jī)制圖示 3.調(diào)度的過(guò)程(1)調(diào)度的任務(wù)(2)調(diào)度選擇p…

文章目錄

  • 一.pod集群調(diào)度概念
    • 1.調(diào)度約束( List-Watch組件)
    • 2.List-Watch的工作機(jī)制
      • (1)List-Watch的工作機(jī)制流程
      • (2)List-Watch的工作機(jī)制圖示
    • 3.調(diào)度的過(guò)程
      • (1)調(diào)度的任務(wù)
      • (2)調(diào)度選擇pod節(jié)點(diǎn)
      • (3)調(diào)度的過(guò)程
      • (4)調(diào)度的算法
      • (5)調(diào)度的優(yōu)先級(jí)
  • 二.pod集群調(diào)度示例
    • 1.指定調(diào)度節(jié)點(diǎn)示例
    • 2.通過(guò)節(jié)點(diǎn)標(biāo)簽調(diào)度(nodeSelector)示例
    • 3.平均調(diào)度節(jié)點(diǎn)示例
  • 三.親和性(節(jié)點(diǎn)親和、pod親和)
    • 1.節(jié)點(diǎn)親和
      • (1)節(jié)點(diǎn)親和概念
      • (2)鍵值運(yùn)算關(guān)系
      • (3)創(chuàng)建節(jié)點(diǎn)硬策略親和示例:
      • (4)創(chuàng)建節(jié)點(diǎn)軟策略親和示例:
      • (5)節(jié)點(diǎn)軟硬策略親和示例
    • 2.pod親和性與反親和性
      • (1)Pod親和性與反親和性的調(diào)整策略
      • (2)Pod親和性示例
      • (3)Pod 反親和性調(diào)度示例1
      • (4)Pod 反親和性調(diào)度示例2
  • 四.污點(diǎn)(Taint) 和 容忍(Tolerations)
    • 1.污點(diǎn)(Taint)
      • (1)污點(diǎn)概念
      • (2)污點(diǎn)的組成格式及污點(diǎn)的存在選項(xiàng)
      • (3)查看節(jié)點(diǎn)污點(diǎn)
      • (4)節(jié)點(diǎn)污點(diǎn)示例
    • 2.容忍(Tolerations)
      • (1)容忍(Tolerations)概念
      • (2)節(jié)點(diǎn)容忍示例
      • (3)污點(diǎn)注意事項(xiàng)
  • 五.維護(hù)操作
    • 1.cordon調(diào)度器
      • (1)對(duì)節(jié)點(diǎn)執(zhí)行維護(hù)操作
      • (2)cordon調(diào)度器
    • 2.drain命令
  • 六.Pod啟動(dòng)階段(相位 phase)
    • 1.pod啟動(dòng)過(guò)程
    • 2.phase 的可能狀態(tài)
    • 3.故障排除步驟
  • 總:
    • 1.list-watch
    • 2.scheduler
    • 3.pod 調(diào)度到指定節(jié)點(diǎn)的方法
    • 4.節(jié)點(diǎn)親和性和反親和性
    • 5.相關(guān)標(biāo)簽命令
    • 6.污點(diǎn)和容忍
    • 7.Pod啟動(dòng)階段(相位) 5個(gè)狀態(tài)
    • 8.排除故障方法

一.pod集群調(diào)度概念

1.調(diào)度約束( List-Watch組件)

Kubernetes 是通過(guò) List-Watch的機(jī)制進(jìn)行每個(gè)組件的協(xié)作,保持?jǐn)?shù)據(jù)同步的,每個(gè)組件之間的設(shè)計(jì)實(shí)現(xiàn)了解耦。

用戶是通過(guò) kubectl 根據(jù)配置文件,向 APIServer 發(fā)送命令,在 Node 節(jié)點(diǎn)上面建立 Pod 和 Container。
APIServer 經(jīng)過(guò) API 調(diào)用,權(quán)限控制,調(diào)用資源和存儲(chǔ)資源的過(guò)程,實(shí)際上還沒有真正開始部署應(yīng)用。這里 需要 Controller Manager、Scheduler 和 kubelet 的協(xié)助才能完成整個(gè)部署過(guò)程。

2.List-Watch的工作機(jī)制

(1)List-Watch的工作機(jī)制流程

在 Kubernetes 中,所有部署的信息都會(huì)寫到 etcd 中保存。實(shí)際上 etcd 在存儲(chǔ)部署信息的時(shí)候,會(huì)發(fā)送 Create 事件給 APIServer,而 APIServer 會(huì)通過(guò)監(jiān)聽(Watch)etcd 發(fā)過(guò)來(lái)的事件。其他組件也會(huì)監(jiān)聽(Watch)APIServer 發(fā)出來(lái)的事件。

Pod 是 Kubernetes 的基礎(chǔ)單元,Pod 啟動(dòng)典型創(chuàng)建過(guò)程如下:工作機(jī)制
(1)這里有三個(gè) List-Watch,分別是 Controller Manager(運(yùn)行在 Master),Scheduler(運(yùn)行在 Master),kubelet(運(yùn)行在 Node)。 他們?cè)谶M(jìn)程已啟動(dòng)就會(huì)監(jiān)聽(Watch)APIServer 發(fā)出來(lái)的事件。

(2)用戶通過(guò) kubectl 或其他 API 客戶端提交請(qǐng)求給 APIServer 來(lái)建立一個(gè) Pod 對(duì)象副本。

(3)APIServer 嘗試著將 Pod 對(duì)象的相關(guān)元信息存入 etcd 中,待寫入操作執(zhí)行完成,APIServer 即會(huì)返回確認(rèn)信息至客戶端。

(4)當(dāng) etcd 接受創(chuàng)建 Pod 信息以后,會(huì)發(fā)送一個(gè) Create 事件給 APIServer。

(5)由于 Controller Manager 一直在監(jiān)聽(Watch,通過(guò)https的6443端口)APIServer 中的事件。此時(shí) APIServer 接受到了 Create 事件,又會(huì)發(fā)送給 Controller Manager。

(6)Controller Manager 在接到 Create 事件以后,調(diào)用其中的 Replication Controller 來(lái)保證 Node 上面需要?jiǎng)?chuàng)建的副本數(shù)量。一旦副本數(shù)量少于 RC 中定義的數(shù)量,RC 會(huì)自動(dòng)創(chuàng)建副本??傊潜WC副本數(shù)量的 Controller(PS:擴(kuò)容縮容的擔(dān)當(dāng))。

(7)在 Controller Manager 創(chuàng)建 Pod 副本以后,APIServer 會(huì)在 etcd 中記錄這個(gè) Pod 的詳細(xì)信息。例如 Pod 的副本數(shù),Container 的內(nèi)容是什么。

(8)同樣的 etcd 會(huì)將創(chuàng)建 Pod 的信息通過(guò)事件發(fā)送給 APIServer。

(9)由于 Scheduler 在監(jiān)聽(Watch)APIServer,并且它在系統(tǒng)中起到了“承上啟下”的作用,“承上”是指它負(fù)責(zé)接收創(chuàng)建的 Pod 事件,為其安排 Node;“啟下”是指安置工作完成后,Node 上的 kubelet 進(jìn)程會(huì)接管后繼工作,負(fù)責(zé) Pod 生命周期中的“下半生”。 換句話說(shuō),Scheduler 的作用是將待調(diào)度的 Pod 按照調(diào)度算法和策略綁定到集群中 Node 上。

(10)Scheduler 調(diào)度完畢以后會(huì)更新 Pod 的信息,此時(shí)的信息更加豐富了。除了知道 Pod 的副本數(shù)量,副本內(nèi)容。還知道部署到哪個(gè) Node 上面了。并將上面的 Pod 信息更新至 API Server,由 APIServer 更新至 etcd 中,保存起來(lái)。

(11)etcd 將更新成功的事件發(fā)送給 APIServer,APIServer 也開始反映此 Pod 對(duì)象的調(diào)度結(jié)果。

(12)kubelet 是在 Node 上面運(yùn)行的進(jìn)程,它也通過(guò) List-Watch 的方式監(jiān)聽(Watch,通過(guò)https的6443端口)APIServer 發(fā)送的 Pod 更新的事件。kubelet 會(huì)嘗試在當(dāng)前節(jié)點(diǎn)上調(diào)用 Docker 啟動(dòng)容器,并將 Pod 以及容器的結(jié)果狀態(tài)回送至 APIServer。

(13)APIServer 將 Pod 狀態(tài)信息存入 etcd 中。在 etcd 確認(rèn)寫入操作成功完成后,APIServer將確認(rèn)信息發(fā)送至相關(guān)的 kubelet,事件將通過(guò)它被接受。

#注意:在創(chuàng)建 Pod 的工作就已經(jīng)完成了后,為什么 kubelet 還要一直監(jiān)聽呢?原因很簡(jiǎn)單,假設(shè)這個(gè)時(shí)候 kubectl 發(fā)命令,要擴(kuò)充 Pod 副本數(shù)量,那么上面的流程又會(huì)觸發(fā)一遍,kubelet 會(huì)根據(jù)最新的 Pod 的部署情況調(diào)整 Node 的資源。又或者 Pod 副本數(shù)量沒有發(fā)生變化,但是其中的鏡像文件升級(jí)了,kubelet 也會(huì)自動(dòng)獲取最新的鏡像文件并且加載。

總:三個(gè)組件(contrllor manager、scheduler、kubelet)監(jiān)聽apiserver,通過(guò)端口,來(lái)看調(diào)度、擴(kuò)容、縮容、升級(jí)等)

縮容、擴(kuò)容、鏡像升級(jí)的話這些機(jī)制都得再來(lái)一遍

(2)List-Watch的工作機(jī)制圖示

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

3.調(diào)度的過(guò)程

(1)調(diào)度的任務(wù)

Scheduler 是 kubernetes 的調(diào)度器,主要的任務(wù)是把定義的 pod 分配到集群的節(jié)點(diǎn)上。其主要考慮的問題如下:
●公平:如何保證每個(gè)節(jié)點(diǎn)都能被分配資源
●資源高效利用:集群所有資源最大化被使用
●效率:調(diào)度的性能要好,能夠盡快地對(duì)大批量的 pod 完成調(diào)度工作
●靈活:允許用戶根據(jù)自己的需求控制調(diào)度的邏輯

(2)調(diào)度選擇pod節(jié)點(diǎn)

Sheduler 是作為單獨(dú)的程序運(yùn)行的,啟動(dòng)之后會(huì)一直監(jiān)聽 APIServer,獲取 spec.nodeName 為空的 pod,對(duì)每個(gè) pod 都會(huì)創(chuàng)建一個(gè) binding,表明該 pod 應(yīng)該放到哪個(gè)節(jié)點(diǎn)上。

(3)調(diào)度的過(guò)程

調(diào)度分為幾個(gè)部分:首先是過(guò)濾掉不滿足條件的節(jié)點(diǎn),這個(gè)過(guò)程稱為預(yù)算策略(predicate);然后對(duì)通過(guò)的節(jié)點(diǎn)按照優(yōu)先級(jí)排序,這個(gè)是優(yōu)選策略(priorities);最后從中選擇優(yōu)先級(jí)最高的節(jié)點(diǎn)。如果中間任何一步驟有錯(cuò)誤,就直接返回錯(cuò)誤。

(4)調(diào)度的算法

Predicate 有一系列的常見的算法可以使用
●PodFitsResources:節(jié)點(diǎn)上剩余的資源是否大于 pod 請(qǐng)求的資源odeName,檢查節(jié)點(diǎn)名稱是否和 NodeName 匹配
●PodFitsHost:如果 pod 指定了 N
●PodFitsHostPorts:節(jié)點(diǎn)上已經(jīng)使用的 port 是否和 pod 申請(qǐng)的 port 沖突
●PodSelectorMatches:過(guò)濾掉和 pod 指定的 label 不匹配的節(jié)點(diǎn)。
●NoDiskConflict:已經(jīng) mount 的 volume 和 pod 指定的 volume 不沖突,除非它們都是只讀。

(5)調(diào)度的優(yōu)先級(jí)

如果在 predicate 過(guò)程中沒有合適的節(jié)點(diǎn),pod 會(huì)一直在 pending 狀態(tài),不斷重試調(diào)度,直到有節(jié)點(diǎn)滿足條件。 經(jīng)過(guò)這個(gè)步驟,如果有多個(gè)節(jié)點(diǎn)滿足條件,就繼續(xù) priorities 過(guò)程:按照優(yōu)先級(jí)大小對(duì)節(jié)點(diǎn)排序。

優(yōu)先級(jí)由一系列鍵值對(duì)組成,鍵是該優(yōu)先級(jí)項(xiàng)的名稱,值是它的權(quán)重(該項(xiàng)的重要性)。有一系列的常見的優(yōu)先級(jí)選項(xiàng)包括:
●LeastRequestedPriority:通過(guò)計(jì)算CPU和Memory的使用率來(lái)決定權(quán)重,使用率越低權(quán)重越高。也就是說(shuō),這個(gè)優(yōu)先級(jí)指標(biāo)傾向于資源使用比例更低的節(jié)點(diǎn)。
●BalancedResourceAllocation:節(jié)點(diǎn)上 CPU 和 Memory 使用率越接近,權(quán)重越高。這個(gè)一般和上面的一起使用,不單獨(dú)使用。比如 node01 的 CPU 和 Memory 使用率 20:60,node02 的 CPU 和 Memory 使用率 50:50,雖然 node01 的總使用率比 node02 低,但 node02 的 CPU 和 Memory 使用率更接近,從而調(diào)度時(shí)會(huì)優(yōu)選 node02。
●ImageLocalityPriority:傾向于已經(jīng)有要使用鏡像的節(jié)點(diǎn),鏡像總大小值越大,權(quán)重越高。

通過(guò)算法對(duì)所有的優(yōu)先級(jí)項(xiàng)目和權(quán)重進(jìn)行計(jì)算,得出最終的結(jié)果。

二.pod集群調(diào)度示例

1.指定調(diào)度節(jié)點(diǎn)示例

(1)pod.spec.nodeName 將 Pod 直接調(diào)度到指定的 Node 節(jié)點(diǎn)上,會(huì)跳過(guò) Scheduler 的調(diào)度策略,該匹配規(guī)則是強(qiáng)制匹配

vim myapp.yamlapiVersion: apps/v1  
kind: Deployment  
metadata:name: myapp
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:nodeName: node01containers:- name: myappimage: soscscs/myapp:v1ports:- containerPort: 80

注釋:

  • replicas: 3 指定了要?jiǎng)?chuàng)建的 Pod 副本數(shù)量為 3。
  • selector 通過(guò)標(biāo)簽選擇器指定了要管理的 Pod 集合,這里使用了 app: myapp 標(biāo)簽。
  • template 定義了創(chuàng)建 Pod 的模板,在其中可以設(shè)置容器和其他配置。
  • nodeName: node01 指定了 Pod 應(yīng)該運(yùn)行在名為 node01 的節(jié)點(diǎn)上。
  • containers 定義了要運(yùn)行的容器的配置,包括容器名稱、鏡像和端口等信息。

將在 Kubernetes 集群中創(chuàng)建 3 個(gè)副本的 Deployment,每個(gè) Pod 將運(yùn)行一個(gè)名為 myapp 的容器,并將這些 Pod 調(diào)度到名為 node01 的節(jié)點(diǎn)上。

kubectl apply -f myapp.yaml
kubectl get pods -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#查看詳細(xì)事件(發(fā)現(xiàn)未經(jīng)過(guò) scheduler 調(diào)度分配)
kubectl describe pod myapp-699655c7fd-m87pb

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

(2)pod.spec.nodeSelector:通過(guò) kubernetes 的 label-selector 機(jī)制選擇節(jié)點(diǎn),由調(diào)度器調(diào)度策略匹配 label,然后調(diào)度 Pod 到目標(biāo)節(jié)點(diǎn),該匹配規(guī)則屬于強(qiáng)制約束

#獲取標(biāo)簽幫助
kubectl label --help

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#需要獲取 node 上的 NAME 名稱
kubectl get node

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#給對(duì)應(yīng)的 node 設(shè)置標(biāo)簽分別為 blue=a 和 blue=b
kubectl label nodes node01 blue=a
kubectl label nodes node02 blue=b
#查看標(biāo)簽
kubectl get nodes --show-labels

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

2.通過(guò)節(jié)點(diǎn)標(biāo)簽調(diào)度(nodeSelector)示例

#修改成nodeSelector調(diào)度方式
vim myapp1.yamlapiVersion: apps/v1
kind: Deployment  
metadata:name: myapp1
spec:replicas: 3selector:matchLabels:app: myapp1template:metadata:labels:app: myapp1spec:nodeSelector:blue: acontainers:- name: myapp1image: soscscs/myapp:v1ports:- containerPort: 80

注釋:

  • replicas: 3 指定了要?jiǎng)?chuàng)建的 Pod 副本數(shù)量為 3。
  • selector 通過(guò)標(biāo)簽選擇器指定了要管理的 Pod 集合,這里使用了 app: myapp1 標(biāo)簽。
  • template 定義了創(chuàng)建 Pod 的模板,在其中可以設(shè)置容器和其他配置。
  • nodeSelector 使用了 blue: a 條件,表示只有具有標(biāo)簽 blue=a 的節(jié)點(diǎn)才能被選擇來(lái)調(diào)度 Pod。
  • containers 定義了要運(yùn)行的容器的配置,包括容器名稱、鏡像和端口等信息。

這個(gè)部署腳本將在 Kubernetes 集群中創(chuàng)建 3 個(gè)副本的 Deployment,每個(gè) Pod 將運(yùn)行一個(gè)名為 myapp1 的容器,并將這些 Pod 調(diào)度到帶有標(biāo)簽 blue=a 的節(jié)點(diǎn)上。

kubectl apply -f myapp1.yaml 
kubectl get pods -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#查看詳細(xì)事件(通過(guò)事件可以發(fā)現(xiàn)要先經(jīng)過(guò) scheduler 調(diào)度分配)
kubectl describe pod myapp1-86c7cf9c8c-96w6t

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

注:如資源大小不足可能會(huì)會(huì)造成調(diào)度失敗

#查看標(biāo)簽
kubectl get node --show-labels
#修改一個(gè)節(jié)點(diǎn)的 label 的值,需要加上 --overwrite 參數(shù)
kubectl label nodes node02 blue=a --overwrite

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#刪除一個(gè) label,只需在命令行最后指定 label 的 key 名并與一個(gè)減號(hào)相連即可:
kubectl label nodes node02 blue-

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#指定標(biāo)簽查詢 node 節(jié)點(diǎn)
kubectl get nodes -l blue=a

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

3.平均調(diào)度節(jié)點(diǎn)示例

注:資源大小不足可能會(huì)會(huì)造成調(diào)度失敗

平均放在node1、node2即可使用這個(gè)調(diào)度方法

#修改標(biāo)簽,講node01、node02節(jié)點(diǎn)上的標(biāo)簽都設(shè)置為一樣的值
kubectl label nodes node01 blue=a
kubectl label nodes node02 blue=a
kubectl get node --show-labels

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#刪除之前創(chuàng)建的
kubectl delete -f myapp1.yamlvim myapp1.yaml apiVersion: apps/v1
kind: Deployment  
metadata:name: myapp1
spec:replicas: 3selector:matchLabels:app: myapp1template:metadata:labels:app: myapp1spec:nodeSelector:blue: acontainers:- name: myapp1image: soscscs/myapp:v1ports:- containerPort: 80
#再次創(chuàng)建
kubectl apply -f myapp1.yaml 

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

節(jié)點(diǎn)標(biāo)簽未平均在node節(jié)點(diǎn)解決辦法

(1)查看剩余大小

free -h

#清緩存,來(lái)清除 Linux 系統(tǒng)緩存的操作,這個(gè)命令通常用于調(diào)優(yōu)系統(tǒng)性能或者在特定情況下需要釋放系統(tǒng)內(nèi)存時(shí)使用。但需要注意的是,清除緩存可能導(dǎo)致一些文件系統(tǒng)的性能下降,因?yàn)樵谥匦录虞d緩存時(shí)可能需要一些時(shí)間。

echo 3 > /proc/sys/vm/drop_caches

(2)查看節(jié)點(diǎn)是否存在污點(diǎn)

kubectl describe nodes | grep -B 3 Taints

(3)有可能是因?yàn)槎荚谝粋€(gè)節(jié)點(diǎn)是節(jié)點(diǎn)的資源過(guò)多,此處使用相同的配置文件修改名字,再次創(chuàng)建

cp myapp1.yaml myapp2.yaml

kubectl apply -f myapp2.yaml

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

三.親和性(節(jié)點(diǎn)親和、pod親和)

https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/

1.節(jié)點(diǎn)親和

(1)節(jié)點(diǎn)親和概念

節(jié)點(diǎn)親和:傾向于哪一個(gè)node節(jié)點(diǎn),硬策略是必須是哪一個(gè)node節(jié)點(diǎn),軟策略是最好是哪一個(gè)node節(jié)點(diǎn),但是不是也可以接受。
pod.spec.nodeAffinity
●preferredDuringSchedulingIgnoredDuringExecution:軟策略
●requiredDuringSchedulingIgnoredDuringExecution:硬策略

(2)鍵值運(yùn)算關(guān)系

●In:label 的值在某個(gè)列表中 pending————必須是
●NotIn:label 的值不在某個(gè)列表中————相反節(jié)點(diǎn)
●Gt:label 的值大于某個(gè)值
●Lt:label 的值小于某個(gè)值
●Exists:某個(gè) label 存在
●DoesNotExist:某個(gè) label 不存在

軟策略:配置NotIn使用較多

硬策略:in使用較多

(3)創(chuàng)建節(jié)點(diǎn)硬策略親和示例:

可以使用以下命令查看標(biāo)簽下的選項(xiàng):

kubectl explain pod.spec.aff1n1ty.nodeAffin1ty.requredDuring5chedulinglgnoredDuringExecut1on.nodeselectorTerms.

編輯文件中的標(biāo)簽key值:

kubectl get nodes --show-labels

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

kubectl get nodes --show-labels

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

mkdir /opt/affinity
cd /opt/affinity
vim pod1.yamlapiVersion: v1
kind: Pod
metadata:name: affinitylabels:app: node-affinity-pod
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostname    #指定node的標(biāo)簽operator: NotIn     #設(shè)置Pod安裝到kubernetes.io/hostname的標(biāo)簽值不在values列表中的node上values:- node02

注釋:

  • metadata 部分定義了 Pod 的元數(shù)據(jù),包括名稱和標(biāo)簽。

  • spec.containers 定義了要在 Pod 中運(yùn)行的容器的配置,包括容器名稱和鏡像。

  • affinity  定義了節(jié)點(diǎn)親和性配置。
    
    • nodeAffinity 指定了使用節(jié)點(diǎn)親和性。

    • requiredDuringSchedulingIgnoredDuringExecution 表示 Pod 必須滿足指定的節(jié)點(diǎn)親和性規(guī)則。

    • nodeSelectorTerms   定義了要匹配的節(jié)點(diǎn)標(biāo)簽條件。
      
      • matchExpressions   定義了節(jié)點(diǎn)選擇器的匹配表達(dá)式。
        
        • key 指定了要匹配的節(jié)點(diǎn)標(biāo)簽鍵,這里使用了 kubernetes.io/hostname 表示節(jié)點(diǎn)主機(jī)名。
        • operator 定義了匹配操作符,這里使用了 NotIn 表示節(jié)點(diǎn)主機(jī)名不在指定的列表中。
        • values 定義了不滿足匹配條件的節(jié)點(diǎn)主機(jī)名列表,這里只有一個(gè)值 node02。

因此,這個(gè) Pod 定義了一個(gè)節(jié)點(diǎn)親和性規(guī)則,要求將其調(diào)度到除了主機(jī)名為 node02 的節(jié)點(diǎn)以外的其他節(jié)點(diǎn)上。

kubectl apply -f pod1.yaml
kubectl get pods -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#如果硬策略不滿足條件,Pod 狀態(tài)一直會(huì)處于 Pending 狀態(tài)。

如果內(nèi)存不夠可能也無(wú)法使pod狀態(tài)正常

(4)創(chuàng)建節(jié)點(diǎn)軟策略親和示例:

cp pod1.yaml pod2.yaml
vim pod2.yamlapiVersion: v1
kind: Pod
metadata:name: affinity-prlabels:app: node-affinity-pod
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1   #如果有多個(gè)軟策略選項(xiàng)的話,權(quán)重越大,優(yōu)先級(jí)越高preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node03       #沒有這個(gè)節(jié)點(diǎn)服務(wù)器會(huì)自動(dòng)分配給存在的其他節(jié)點(diǎn)上

注釋:

  • metadata 部分定義了 Pod 的元數(shù)據(jù),包括名稱和標(biāo)簽。

  • spec.containers 定義了要在 Pod 中運(yùn)行的容器的配置,包括容器名稱和鏡像。

  • affinity   定義了節(jié)點(diǎn)親和性配置。
    
    • nodeAffinity 指定了使用節(jié)點(diǎn)親和性。

    • preferredDuringSchedulingIgnoredDuringExecution
      

      表示 Pod 首選滿足指定的節(jié)點(diǎn)親和性規(guī)則的節(jié)點(diǎn),但不是必須的。

      • weight 定義了此規(guī)則的權(quán)重,在多個(gè)規(guī)則存在時(shí),權(quán)重越大的規(guī)則優(yōu)先級(jí)越高。

      • preference   定義了節(jié)點(diǎn)選擇器的匹配條件。
        
        • matchExpressions   定義了節(jié)點(diǎn)選擇器的匹配表達(dá)式。
          
          • key 指定了要匹配的節(jié)點(diǎn)標(biāo)簽鍵,這里使用了 kubernetes.io/hostname 表示節(jié)點(diǎn)主機(jī)名。
          • operator 定義了匹配操作符,這里使用了 In 表示節(jié)點(diǎn)主機(jī)名在指定的列表中。
          • values 定義了滿足匹配條件的節(jié)點(diǎn)主機(jī)名列表,這里只有一個(gè)值 node03。

因此,這個(gè) Pod 定義了一個(gè)首選節(jié)點(diǎn)親和性規(guī)則,優(yōu)先調(diào)度到主機(jī)名為 node03 的節(jié)點(diǎn)上。如果不存在主機(jī)名為 node03 的節(jié)點(diǎn),則該 Pod 將被分配到其它節(jié)點(diǎn)上。

kubectl apply -f pod2.yaml

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

kubectl get pods -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#把values:的值改成node02,則會(huì)優(yōu)先在node02上創(chuàng)建Pod
kubectl delete pod --all && kubectl apply -f pod2.yaml && kubectl get pods -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

(5)節(jié)點(diǎn)軟硬策略親和示例

如果把硬策略和軟策略合在一起使用,則要先滿足硬策略之后才會(huì)滿足軟策略

vim pod3.yamlapiVersion: v1
kind: Pod
metadata:name: affinity-prelabels:app: node-affinity-pod
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:   #先滿足硬策略,排除有kubernetes.io/hostname=node02標(biāo)簽的節(jié)點(diǎn)nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: NotInvalues:- node02preferredDuringSchedulingIgnoredDuringExecution:  #再滿足軟策略,優(yōu)先選擇有blue=a標(biāo)簽的節(jié)點(diǎn)- weight: 1preference:matchExpressions:- key: blueoperator: Invalues:- a

注釋:

  • metadata 部分定義了 Pod 的元數(shù)據(jù),包括名稱和標(biāo)簽。

  • spec.containers 定義了要在 Pod 中運(yùn)行的容器的配置,包括容器名稱和鏡像。

  • affinity    定義了節(jié)點(diǎn)親和性配置。
    
    • nodeAffinity 指定了使用節(jié)點(diǎn)親和性。

    • requiredDuringSchedulingIgnoredDuringExecution   表示 Pod 必須滿足指定的節(jié)點(diǎn)親和性規(guī)則才能被調(diào)度到節(jié)點(diǎn)上。
      
      • nodeSelectorTerms    定義了節(jié)點(diǎn)選擇器的條件,這里只有一個(gè)匹配表達(dá)式。
        
        • matchExpressions     定義了節(jié)點(diǎn)選擇器的匹配表達(dá)式。
          
          • key 指定了要匹配的節(jié)點(diǎn)標(biāo)簽鍵,這里使用了 kubernetes.io/hostname 表示節(jié)點(diǎn)主機(jī)名。
          • operator 定義了匹配操作符,這里使用了 NotIn 表示排除匹配指定節(jié)點(diǎn)主機(jī)名的節(jié)點(diǎn)。
          • values 定義了不滿足匹配條件的節(jié)點(diǎn)主機(jī)名列表,這里只有一個(gè)值 node02。
    • preferredDuringSchedulingIgnoredDuringExecution   表示 Pod 首選滿足指定的節(jié)點(diǎn)親和性規(guī)則的節(jié)點(diǎn),但不是必須的。
      
      • weight 定義了此規(guī)則的權(quán)重,在多個(gè)規(guī)則存在時(shí),權(quán)重越大的規(guī)則優(yōu)先級(jí)越高。

      • preference    定義了節(jié)點(diǎn)選擇器的匹配條件。
        
        • matchExpressions     定義了節(jié)點(diǎn)選擇器的匹配表達(dá)式。
          
          • key 指定了要匹配的節(jié)點(diǎn)標(biāo)簽鍵,這里使用了 blue 表示藍(lán)色標(biāo)簽。
          • operator 定義了匹配操作符,這里使用了 In 表示節(jié)點(diǎn)標(biāo)簽值在指定的列表中。
          • values 定義了滿足匹配條件的藍(lán)色標(biāo)簽值列表,這里只有一個(gè)值 a。

因此,這個(gè) Pod 定義了一個(gè)節(jié)點(diǎn)親和性規(guī)則,必須滿足不在 node02 節(jié)點(diǎn)上才能被調(diào)度。此外,它還定義了一個(gè)首選節(jié)點(diǎn)親和性規(guī)則,優(yōu)先調(diào)度到具有藍(lán)色標(biāo)簽值為 a 的節(jié)點(diǎn)上。如果不存在滿足這些條件的節(jié)點(diǎn),則該 Pod 無(wú)法被調(diào)度。

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

kubectl apply -f pod3.yaml
kubectl get pod -owide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

2.pod親和性與反親和性

pod親和:相同的等級(jí),更傾向于哪一個(gè),就是pod親和性,如果一定要和其中一個(gè)平等,就是硬策略;如果是想和一個(gè)平等并且最好的是軟策略,軟策略是不去也可以,硬策略則是不去就不行。

(1)Pod親和性與反親和性的調(diào)整策略

調(diào)度策略匹配標(biāo)簽操作符拓?fù)溆蛑С?/th>調(diào)度目標(biāo)
nodeAffinity主機(jī)In, NotIn, Exists,DoesNotExist, Gt, Lt指定主機(jī)
podAffinityPodIn, NotIn, Exists,DoesNotExistPod與指定Pod同一拓?fù)溆?/td>
podAntiAffinityPodIn, NotIn, Exists,DoesNotExistPod與指定Pod不在同一拓?fù)溆?/td>

(2)Pod親和性示例

kubectl label nodes node01 blue=a
kubectl label nodes node02 blue=a
#創(chuàng)建一個(gè)標(biāo)簽為 app=myapp01 的 Pod
vim pod4.yamlapiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1

注釋:

  • apiVersion: v1 表示使用 Kubernetes API 的版本。
  • kind: Pod 表示部署的資源類型是 Pod。
  • metadata 定義了該資源的元數(shù)據(jù)信息,包括名稱和標(biāo)簽等屬性。
  • spec 定義了該 Pod 的具體配置信息,包括容器定義、存儲(chǔ)卷和網(wǎng)絡(luò)等相關(guān)配置。

在該 YAML 文件中,Pod 中包含一個(gè)容器,容器名稱為 with-node-affinity,它使用了鏡像 soscscs/myapp:v1,這個(gè)鏡像可能是開發(fā)者自己編寫的或從其他地方獲取的。

kubectl apply -f pod4.yaml
kubectl get pods --show-labels -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#使用 Pod 親和性調(diào)度,創(chuàng)建多個(gè) Pod 資源
vim pod5.yamlapiVersion: v1
kind: Pod
metadata:name: myapp02labels:app: myapp02
spec:containers:- name: myapp02image: soscscs/myapp:v1affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- myapp01topologyKey: blue

注釋:

文件定義了一個(gè)名為 myapp02 的 Pod,其中包含一個(gè)名為 myapp02 的容器。此外,它還定義了 Pod 間的親和性規(guī)則。

在這個(gè)規(guī)則中,myapp02 Pod 要求與具有標(biāo)簽 app: myapp01 的其他 Pod 在拓?fù)溆?#xff08;topology domain)上保持親和。具體來(lái)說(shuō),它要求與拓?fù)溆蛑芯哂邢嗤?blue 屬性的 Pod 保持親和。

拓?fù)溆蚴侵敢唤M共享相同資源或特征的節(jié)點(diǎn)。在這個(gè)例子中,通過(guò)指定 topologyKeybluemyapp02 Pod 希望與擁有相同 blue 屬性的其他 Pod 在同一個(gè)拓?fù)溆騼?nèi)被調(diào)度。

這種親和性規(guī)則可以用于將相關(guān)的 Pod 部署到相同的拓?fù)溆蛑?#xff0c;以提高應(yīng)用程序的性能和可靠性。

#僅當(dāng)節(jié)點(diǎn)和至少一個(gè)已運(yùn)行且有鍵為“app”且值為“myapp01”的標(biāo)簽 的 Pod 處于同一拓?fù)溆驎r(shí),才可以將該 Pod 調(diào)度到節(jié)點(diǎn)上。 (更確切的說(shuō),如果節(jié)點(diǎn) N 具有帶有鍵 kgc 和某個(gè)值 V 的標(biāo)簽,則 Pod 有資格在節(jié)點(diǎn) N 上運(yùn)行,以便集群中至少有一個(gè)具有鍵 blue 和值為 V 的節(jié)點(diǎn)正在運(yùn)行具有鍵“app”和值 “myapp01”的標(biāo)簽的 pod。)
#topologyKey 是節(jié)點(diǎn)標(biāo)簽的鍵。如果兩個(gè)節(jié)點(diǎn)使用此鍵標(biāo)記并且具有相同的標(biāo)簽值,則調(diào)度器會(huì)將這兩個(gè)節(jié)點(diǎn)視為處于同一拓?fù)溆蛑小?調(diào)度器試圖在每個(gè)拓?fù)溆蛑蟹胖脭?shù)量均衡的 Pod。
#如果 kgc 對(duì)應(yīng)的值不一樣就是不同的拓?fù)溆?。比?Pod1 在 kgc=a 的 Node 上,Pod2 在 kgc=b 的 Node 上,Pod3 在 blue=a 的 Node 上,則 Pod2 和 Pod1、Pod3 不在同一個(gè)拓?fù)溆?#xff0c;而Pod1 和 Pod3在同一個(gè)拓?fù)溆颉?/p>

kubectl apply -f pod5.yaml
kubectl get pods --show-labels -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

(3)Pod 反親和性調(diào)度示例1

vim pod5f.yamlapiVersion: v1
kind: Pod
metadata:name: myapp10labels:app: myapp10
spec:containers:- name: myapp10image: soscscs/myapp:v1affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- myapp01topologyKey: kubernetes.io/hostname

注釋:

文件定義了一個(gè) Pod 名為 myapp10,其中包含一個(gè)名為 myapp10 的容器。此外,它還定義了 Pod 間的反親和性規(guī)則。在本例中,myapp10 Pod 首選與具有標(biāo)簽 app: myapp01 的其他 Pod 在主機(jī)名(hostname)拓?fù)溆蛏媳3址从H和。具體來(lái)說(shuō),它首選不與拓?fù)溆蛑械木哂邢嗤鳈C(jī)名的 Pod 一起調(diào)度。這可以幫助將相關(guān)的 Pod 分散到不同的節(jié)點(diǎn)上。

#如果節(jié)點(diǎn)處于 Pod 所在的同一拓?fù)溆蚯揖哂墟I“app”和值“myapp01”的標(biāo)簽, 則該 pod 不應(yīng)將其調(diào)度到該節(jié)點(diǎn)上。 (如果 topologyKey 為 kubernetes.io/hostname,則意味著當(dāng)節(jié)點(diǎn)和具有鍵 “app”和值“myapp01”的 Pod 處于相同的拓?fù)溆?#xff0c;Pod 不能被調(diào)度到該節(jié)點(diǎn)上。)

kubectl apply -f pod5f.yaml
kubectl get pods --show-labels -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

(4)Pod 反親和性調(diào)度示例2

vim pod6f.yamlapiVersion: v1
kind: Pod
metadata:name: myapp20labels:app: myapp20
spec:containers:- name: myapp20image: soscscs/myapp:v1affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- myapp01topologyKey: blue

注釋:

文件定義了一個(gè) Pod 名為 myapp20,其中包含一個(gè)名為 myapp20 的容器。此外,它還定義了 Pod 間的反親和性規(guī)則。在本例中,myapp20 Pod 要求與具有標(biāo)簽 app: myapp01 的其他 Pod 在拓?fù)溆蛏媳3址从H和。具體來(lái)說(shuō),它要求不與拓?fù)溆蛑械木哂邢嗤?blue 屬性的 Pod 一起調(diào)度。這可以幫助將相關(guān)的 Pod 分散到不同的拓?fù)溆蛑小?/p>

由于指定 Pod 所在的 node01 節(jié)點(diǎn)上具有帶有鍵 kgc 和標(biāo)簽值 a 的標(biāo)簽,node02 也有這個(gè)kgc=a的標(biāo)簽,所以 node01 和 node02 是在一個(gè)拓?fù)溆蛑?#xff0c;反親和要求新 Pod 與指定 Pod 不在同一拓?fù)溆?#xff0c;所以新 Pod 沒有可用的 node 節(jié)點(diǎn),即為 Pending 狀態(tài)。

kubectl apply -f pod6f.yaml
kubectl get pod --show-labels -owide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

kubectl label nodes node02 blue=b --overwrite
kubectl get pod --show-labels -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

四.污點(diǎn)(Taint) 和 容忍(Tolerations)

1.污點(diǎn)(Taint)

(1)污點(diǎn)概念

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

使用 kubectl taint 命令可以給某個(gè) Node 節(jié)點(diǎn)設(shè)置污點(diǎn),Node 被設(shè)置上污點(diǎn)之后就和 Pod 之間存在了一種相斥的關(guān)系,可以讓 Node 拒絕 Pod 的調(diào)度執(zhí)行,甚至將 Node 已經(jīng)存在的 Pod 驅(qū)逐出去。

pod不會(huì)將服務(wù)部署到有污點(diǎn)的機(jī)器上

(2)污點(diǎn)的組成格式及污點(diǎn)的存在選項(xiàng)

key=value:effect

每個(gè)污點(diǎn)有一個(gè) key 和 value 作為污點(diǎn)的標(biāo)簽,其中 value 可以為空,effect 描述污點(diǎn)的作用。

當(dāng)前 taint effect 支持如下三個(gè)選項(xiàng):
●NoSchedule:表示 k8s 將不會(huì)將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上
●PreferNoSchedule:表示 k8s 將盡量避免將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上
●NoExecute:表示 k8s 將不會(huì)將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上,同時(shí)會(huì)將 Node 上已經(jīng)存在的 Pod 驅(qū)逐出去——更換節(jié)點(diǎn)使用

(3)查看節(jié)點(diǎn)污點(diǎn)

kubectl get nodes

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#master 就是因?yàn)橛?NoSchedule 污點(diǎn),k8s 才不會(huì)將 Pod 調(diào)度到 master 節(jié)點(diǎn)上
kubectl describe node master

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

(4)節(jié)點(diǎn)污點(diǎn)示例

#設(shè)置污點(diǎn)
kubectl taint node node01 key1=value1:NoSchedule
#節(jié)點(diǎn)說(shuō)明中,查找 Taints 字段
kubectl describe node node01 

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

vim pod6w.yamlapiVersion: v1
kind: Pod
metadata:name: pod6wlabels:app: node-affinity-pod
spec:containers:- name: pod6wimage: soscscs/myapp:v1affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: NotInvalues:- node01

注釋:

文件定義了一個(gè) Pod 名為 pod6w,其中包含一個(gè)名為 pod6w 的容器。此外,它還定義了節(jié)點(diǎn)親和性規(guī)則。在本例中,pod6w Pod 要求不被調(diào)度到具有標(biāo)簽 kubernetes.io/hostname: node01 的節(jié)點(diǎn)上。這將限制 Pod 的調(diào)度范圍,使其不運(yùn)行在指定的節(jié)點(diǎn)上。

kubectl apply -f pod6w.yaml
kubectl get pod -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#去除污點(diǎn)
kubectl taint node node01 key1:NoSchedule-
kubectl get pods -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

kubectl taint node node02 check=mycheck:NoExecute
#查看 Pod 狀態(tài),會(huì)發(fā)現(xiàn) node02 上的 Pod 已經(jīng)被全部驅(qū)逐(注:如果是 Deployment 或者 StatefulSet 資源類型,為了維持副本數(shù)量則會(huì)在別的 Node 上再創(chuàng)建新的 Pod)
kubectl get pods -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

注:取消設(shè)置的node02污點(diǎn)

kubectl taint node node02 check=mycheck:NoExecute-

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

2.容忍(Tolerations)

(1)容忍(Tolerations)概念

設(shè)置了污點(diǎn)的 Node 將根據(jù) taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之間產(chǎn)生互斥的關(guān)系,Pod 將在一定程度上不會(huì)被調(diào)度到 Node 上。但我們可以在 Pod 上設(shè)置容忍(Tolerations),意思是設(shè)置了容忍的 Pod 將可以容忍污點(diǎn)的存在,可以被調(diào)度到存在污點(diǎn)的 Node 上

(2)節(jié)點(diǎn)容忍示例

使用場(chǎng)景:如是為了測(cè)試后設(shè)置了污點(diǎn)秒數(shù),在測(cè)試結(jié)束后,達(dá)到秒數(shù)之后會(huì)自動(dòng)驅(qū)除,資源很多的情況下不建議做節(jié)點(diǎn)驅(qū)除

#設(shè)置節(jié)點(diǎn)容忍驅(qū)除
kubectl taint node node01 check=summer:NoExecute

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#查看節(jié)點(diǎn)容忍設(shè)置
kubectl describe nodes node01 | grep -i taint
vim demo01.yamlapiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1restartPolicy: AlwaysnodeSelector:kubernetes.io/hostname: node01tolerations:- key: "check"operator: "Equal"value: "summer"effect: "NoExecute"tolerationSeconds: 60      #設(shè)置60秒之后自動(dòng)驅(qū)除節(jié)點(diǎn)

注釋:

  • metadata: 定義了 Pod 的元數(shù)據(jù),包括名稱和標(biāo)簽。
  • spec: 定義了 Pod 的規(guī)格,包括容器、重啟策略、節(jié)點(diǎn)選擇和容忍策略。

在這個(gè)配置中:

  • containers: 定義了 Pod 中的容器,這里包含一個(gè)名為 with-node-affinity 的容器,使用 soscscs/myapp:v1 鏡像。
  • restartPolicy: 設(shè)置了容器的重啟策略為 Always,表示發(fā)生故障時(shí)會(huì)自動(dòng)重啟容器。
  • nodeSelector: 定義了節(jié)點(diǎn)選擇器,指定了 Pod 要運(yùn)行在具有標(biāo)簽 kubernetes.io/hostname: node01 的節(jié)點(diǎn)上。這將限制 Pod 的調(diào)度范圍,使其只能運(yùn)行在具有該標(biāo)簽的節(jié)點(diǎn)上。
  • tolerations: 定義了容忍策略,即 Pod 對(duì)于節(jié)點(diǎn)上的特定條件的容忍程度。在這個(gè)例子中,Pod 標(biāo)記了一個(gè)鍵值對(duì) check=summer,并設(shè)置容忍效果為 NoExecute,表示 Pod 允許在節(jié)點(diǎn)上執(zhí)行非關(guān)鍵的系統(tǒng)任務(wù)。tolerationSeconds 設(shè)置為 60,表示容忍持續(xù)的時(shí)間為 60 秒。

通過(guò)節(jié)點(diǎn)選擇器和容忍策略,可以對(duì) Pod 進(jìn)行更加具體的調(diào)度和限制,以滿足特定的需求。

kubectl apply -f demo01.yaml
kubectl get pod -o wide
kubectl get pod -w -o wide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#在兩個(gè) Node 上都設(shè)置了污點(diǎn)后,會(huì)創(chuàng)建在master01上,此時(shí) Pod 將無(wú)法創(chuàng)建成功,如果再將master01也設(shè)置污點(diǎn)則無(wú)法創(chuàng)建pod為Pending狀態(tài)
kubectl taint node node02 check=summer:NoExecute
kubectl describe node node01 
kubectl describe node node02kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
myapp01   0/1     Pending   0          17s   <none>   <none>   <none>           <none>

#其中的 key、vaule、effect 都要與 Node 上設(shè)置的 taint 保持一致
#operator 的值為 Exists 將會(huì)忽略 value 值,即存在即可
#tolerationSeconds 用于描述當(dāng) Pod 需要被驅(qū)逐時(shí)可以在 Node 上繼續(xù)保留運(yùn)行的時(shí)間

(3)污點(diǎn)注意事項(xiàng)

  • 當(dāng)不指定 key 值時(shí),表示容忍所有的污點(diǎn) key
tolerations:
- operator: "Exists"
  • 當(dāng)不指定 effect 值時(shí),表示容忍所有的污點(diǎn)作用
tolerations:
- key: "key""Exists"operator:
  • 有多個(gè) Master 存在時(shí),防止資源浪費(fèi),可以如下設(shè)置
kubect1 taint node Master-Name node role,kubernetes.io/master-;PreferNoSchedule
  • 如果某個(gè) Node 事新升級(jí)系統(tǒng)組件,為了防止業(yè)務(wù)長(zhǎng)時(shí)間中斷,可以先在該 Node 設(shè)置 NOExecule 污點(diǎn),把該Node 上的 Pod 都驅(qū)逐出去
kubect1 taint node node01 check=ycheck:NoExecute
  • 比時(shí)如果別的 Node資源不夠用,可臨時(shí)給 Master設(shè)置PreferNoSchedule污點(diǎn),讓pod可在 Master上臨時(shí)創(chuàng)建
kubectI taint node master node-role,kubernetes,io/master=:PreferNoSchedule
  • 待所有 node 的更新操作都完成后,再去除污點(diǎn)

    kubectl taint node node01 check=mycheck:NoExecute-
    

五.維護(hù)操作

1.cordon調(diào)度器

(1)對(duì)節(jié)點(diǎn)執(zhí)行維護(hù)操作

#查看節(jié)點(diǎn)的狀態(tài)
kubectl get nodes

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

(2)cordon調(diào)度器

使用場(chǎng)景:使需要維護(hù)的node節(jié)點(diǎn)機(jī)器不可以進(jìn)行資源創(chuàng)建,在取消調(diào)度器創(chuàng)建的資源會(huì)正常,注:開啟調(diào)度器之前的資源是正常的

①格式
#將 Node 標(biāo)記為不可調(diào)度的狀態(tài),這樣就不會(huì)讓新創(chuàng)建的 Pod 在此 Node 上運(yùn)行
#該node將會(huì)變?yōu)镾chedulingDisabled狀態(tài)
kubectl cordon <NODE NAME> 
#將 Node 標(biāo)記為可調(diào)度的狀態(tài)
kubectl uncordon <NODE_NAME>
②示例
#查看節(jié)點(diǎn)正常狀態(tài)
kubectl get nodes
#查看是否設(shè)置了污點(diǎn)
kubectl describe nodes node01|grep -i taint
kubectl describe nodes node02|grep -i taint
#設(shè)置了取消污點(diǎn)
kubectl taint node node01 check=summer:NoExecute-
kubectl taint node node02 check=summer:NoExecute-
kubectl cordon node02
kubectl get nodes

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

vim demo02.yaml apiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1restartPolicy: AlwaysnodeSelector:kubernetes.io/hostname: node02
kubectl apply -f demo02.yaml 
kubectl get pod

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

#關(guān)閉調(diào)度器
kubectl uncordon node02
#查看狀態(tài)
kubectl get pod -owide

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳

2.drain命令

①格式
#kubectl drain 可以讓: Node 節(jié)點(diǎn)開始釋放所有,并且不接收新的 pod 進(jìn)程。drain本意排水,意思是將出問題的 Node 下的 Pod 轉(zhuǎn)移到其它 Node 下運(yùn)行
kubectl drain <NODE NAME> --ignore-daemonsets --delete-local-data --force

注釋:

–iqnore-daemonsets:無(wú)視 DaemonSet 管理下的 Pode

–delete-local-data:如果有mount local volume 的 pod,會(huì)強(qiáng)制殺掉該 pod

–force:強(qiáng)制釋放不是控制器管理的 Pod,例如 kube-proxy

執(zhí)行 drain 命令,會(huì)自動(dòng)做了兩件事情:

  • 設(shè)定此 node 為不可調(diào)度狀態(tài) (cordon)
  • evict (驅(qū)逐)了 Pod
②示例
kubectl get pod -owide
kubectl drain node01 --ignore-daemonsets --delete-local-data --force
kubectl get pod -owide

在這里插入圖片描述

–ignore-daemonsets:在排空節(jié)點(diǎn)時(shí)忽略DaemonSet類型的Pod。
–delete-local-data:刪除節(jié)點(diǎn)上的本地?cái)?shù)據(jù)。包括PV、Volume等。
–force:強(qiáng)制執(zhí)行排空操作,不進(jìn)行確認(rèn)提示。
–grace-period=:設(shè)置節(jié)點(diǎn)上的Pod被遷移前的優(yōu)雅停機(jī)時(shí)間,默認(rèn)情況下為30秒。
–pod-selector=:指定要排空的Pod的標(biāo)簽選擇器,只有匹配選擇器的Pod才會(huì)被遷移。
–ignore-errors:繼續(xù)排空操作,即使在遷移Pod時(shí)發(fā)生錯(cuò)誤。
–timeout=:設(shè)置排空操作的超時(shí)時(shí)間,默認(rèn)情況下為0,表示無(wú)限等待,直到所有Pod被遷移完成

注:
使用kubectl drain命令需要具備集群管理員權(quán)限或特權(quán)賬號(hào)。
在執(zhí)行排空操作之前,請(qǐng)確保已經(jīng)做好備份和驗(yàn)證。
排空操作會(huì)將Pod遷移至其他可用節(jié)點(diǎn),因此可能會(huì)導(dǎo)致一段時(shí)間內(nèi)的業(yè)務(wù)中斷,請(qǐng)謹(jǐn)慎操作。

#取消drain命令使用結(jié)果
kubectl uncordon node01

在這里插入圖片描述

六.Pod啟動(dòng)階段(相位 phase)

1.pod啟動(dòng)過(guò)程

Pod 創(chuàng)建完之后,一直到持久運(yùn)行起來(lái),中間有很多步驟,也就有很多出錯(cuò)的可能,因此會(huì)有很多不同的狀態(tài)。
一般來(lái)說(shuō),pod 這個(gè)過(guò)程包含以下幾個(gè)步驟:
(1)調(diào)度到某臺(tái) node 上。kubernetes 根據(jù)一定的優(yōu)先級(jí)算法選擇一臺(tái) node 節(jié)點(diǎn)將其作為 Pod 運(yùn)行的 node
(2)拉取鏡像
(3)掛載存儲(chǔ)配置等
(4)運(yùn)行起來(lái)。如果有健康檢查,會(huì)根據(jù)檢查的結(jié)果來(lái)設(shè)置其狀態(tài)。

2.phase 的可能狀態(tài)

(1)Pending:表示APIServer創(chuàng)建了Pod資源對(duì)象并已經(jīng)存入了etcd中,但是它并未被調(diào)度完成(比如還沒有調(diào)度到某臺(tái)node上),或者仍然處于從倉(cāng)庫(kù)下載鏡像的過(guò)程中。

(2)Running:Pod已經(jīng)被調(diào)度到某節(jié)點(diǎn)之上,并且Pod中所有容器都已經(jīng)被kubelet創(chuàng)建。至少有一個(gè)容器正在運(yùn)行,或者正處于啟動(dòng)或者重啟狀態(tài)(也就是說(shuō)Running狀態(tài)下的Pod不一定能被正常訪問)。

(3)Succeeded:有些pod不是長(zhǎng)久運(yùn)行的,比如job、cronjob,一段時(shí)間后Pod中的所有容器都被成功終止,并且不會(huì)再重啟。需要反饋任務(wù)執(zhí)行的結(jié)果。

(4)Failed:Pod中的所有容器都已終止了,并且至少有一個(gè)容器是因?yàn)槭〗K止。也就是說(shuō),容器以非0狀態(tài)退出或者被系統(tǒng)終止,比如 command 寫的有問題。

(5)Unknown:表示無(wú)法讀取 Pod 狀態(tài),通常是 kube-controller-manager 無(wú)法與 Pod 通信。

3.故障排除步驟

(1)查看Pod事件

kubectl describe TYPE NAME_PREFIX  

(2)查看Pod日志(Failed狀態(tài)下)

kubectl logs <POD_NAME> [-c Container_NAME]

(3)進(jìn)入Pod(狀態(tài)為running,但是服務(wù)沒有提供)

kubectl exec –it <POD_NAME> bash

(4)查看集群信息

kubectl get nodes

(5)發(fā)現(xiàn)集群狀態(tài)正常

kubectl cluster-info

(6)查看kubelet日志發(fā)現(xiàn)

journalctl -xefu kubelet

總:

1.list-watch

controller-manager,scheduler,kubelet監(jiān)聽apiserver 發(fā)出的事件,apiserver 監(jiān)聽 etcd 發(fā)出的事件,

2.scheduler

預(yù)選策略:通過(guò)調(diào)度算法過(guò)濾掉不滿足的節(jié)點(diǎn)

優(yōu)選策略:通過(guò)優(yōu)先級(jí)選項(xiàng)給滿足調(diào)度條件的節(jié)點(diǎn)進(jìn)行優(yōu)先級(jí)和權(quán)重排序,選擇優(yōu)先級(jí)最高的節(jié)點(diǎn)

3.pod 調(diào)度到指定節(jié)點(diǎn)的方法

配置文件中指定nodename
nodeSelector

4.節(jié)點(diǎn)親和性和反親和性

節(jié)點(diǎn)親和性硬策略 (必要條件)軟策略(優(yōu)先級(jí))
pod親和性和滿足標(biāo)簽的條件的pod在同一個(gè)拓步域
pod反親和性和滿足標(biāo)簽的條件的pod不在同一個(gè)拓步域

5.相關(guān)標(biāo)簽命令

kubectl get <資源類型> <資源名稱> --show-labels

kubectl get <資源類型> -l <標(biāo)簽 key> [=<標(biāo)簽 value>]

kubectl label <資源類型> <資源名稱> key-value

kubectl label <資源類型> <資源名稱> key=vaule --overrwite

kubect1 label <資源光型> <資源名稱> key-

6.污點(diǎn)和容忍

(1)設(shè)置和取消

kubectl taint node <節(jié)點(diǎn)名稱> key=value:effect

effect:NoSchedule PeferNoSchedule Noexecute

kubectl taint node <節(jié)點(diǎn)名稱> key:effect-

(2)調(diào)度

kubectl cordon <節(jié)點(diǎn)名稱>不可調(diào)度

kubectl drain <節(jié)點(diǎn)名稱> 不可調(diào)度+驅(qū)逐

7.Pod啟動(dòng)階段(相位) 5個(gè)狀態(tài)

(1)pendding:pod已創(chuàng)建且寫入etcd,但是未完成調(diào)度或者仍處于鏡像拉取過(guò)程中

(2)running:正常狀態(tài)

(3)Succeeded:短期 (非長(zhǎng)久運(yùn)行的) Pod的正常退出

(4)failed:短期 (非長(zhǎng)久運(yùn)行的) pod 異常退出

(5)unkown:controller-manager 無(wú)法與pod 正常通信

8.排除故障方法

(1)kubectl describe

(2)kubectl logs

(3)kubectI exec -it

(4)kubectl cluster-info

(5)journalctl -u 服務(wù)進(jìn)程名 (比如kubelet)

http://www.risenshineclean.com/news/12148.html

相關(guān)文章:

  • wordpress注冊(cè)的用戶不是vipseo怎么推廣
  • 中山建站服務(wù)seo關(guān)鍵詞找29火星軟件
  • 開源網(wǎng)站開發(fā)文檔下載象山seo外包服務(wù)優(yōu)化
  • 湖南省建設(shè)網(wǎng)站西安百度推廣代理商
  • 如何做網(wǎng)站 優(yōu)幫云班級(jí)優(yōu)化大師官網(wǎng)下載
  • 天元建設(shè)集團(tuán)有限公司天元天筑網(wǎng)百度seo排名培訓(xùn)
  • 建設(shè)網(wǎng)站要做的工作總結(jié)網(wǎng)頁(yè)模板免費(fèi)下載網(wǎng)站
  • 中企動(dòng)力科技股份有限公司銷售seo網(wǎng)站診斷方案
  • 網(wǎng)站特效代碼html無(wú)錫百度推廣平臺(tái)
  • 網(wǎng)站空間域名購(gòu)買電商平臺(tái)開發(fā)
  • 網(wǎng)站接任務(wù)來(lái)做收錄查詢api
  • 洋洋點(diǎn)建站鄭州網(wǎng)
  • 北京微信網(wǎng)站建設(shè)公司大連企業(yè)網(wǎng)站建站模板
  • 品牌查詢網(wǎng)站seo關(guān)鍵詞排名優(yōu)化報(bào)價(jià)
  • 做b網(wǎng)站怎么快速優(yōu)化網(wǎng)站
  • 軟件行業(yè) 網(wǎng)站建設(shè) 模塊搜索引擎快速優(yōu)化排名
  • 成品網(wǎng)站 修改首頁(yè)做網(wǎng)絡(luò)推廣可以通過(guò)哪些渠道推廣
  • 怎么看一個(gè)網(wǎng)站做沒做競(jìng)價(jià)app推廣地推接單網(wǎng)
  • 網(wǎng)站優(yōu)化設(shè)計(jì)方案鄭州seo線上推廣技術(shù)
  • 石家莊做網(wǎng)站最好的公司百度小說(shuō)風(fēng)云榜排名完結(jié)
  • 網(wǎng)站標(biāo)題權(quán)重個(gè)人網(wǎng)站網(wǎng)址
  • 河北石家莊網(wǎng)站免費(fèi)推廣廣告鏈接
  • 做網(wǎng)站的風(fēng)險(xiǎn)英文站友情鏈接去哪里查
  • 網(wǎng)站開發(fā)職業(yè)崗位站長(zhǎng)工具官網(wǎng)
  • 辦個(gè)人網(wǎng)站租空間免費(fèi)推廣平臺(tái)有哪些
  • 建設(shè)一下網(wǎng)站要求提供源碼百度查詢網(wǎng)
  • 網(wǎng)站建設(shè)談客戶說(shuō)什么網(wǎng)絡(luò)營(yíng)銷有哪些形式
  • 建站網(wǎng)站怎么上傳代碼奉節(jié)縣關(guān)鍵詞seo排名優(yōu)化
  • 學(xué)生可以做的網(wǎng)站兼職百度論壇發(fā)帖
  • 廣州網(wǎng)站設(shè)計(jì)價(jià)格手機(jī)優(yōu)化大師官方版