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

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

海外網(wǎng)站cdn加速下載設(shè)計(jì)好看的網(wǎng)站

海外網(wǎng)站cdn加速下載,設(shè)計(jì)好看的網(wǎng)站,武漢做網(wǎng)絡(luò)營銷的公司,網(wǎng)站建設(shè)服務(wù)套餐調(diào)度約束 Kubernetes 是通過 List-Watch 的機(jī)制進(jìn)行每個(gè)組件的協(xié)作,保持?jǐn)?shù)據(jù)同步的,每個(gè)組件之間的設(shè)計(jì)實(shí)現(xiàn)了解耦。 用戶是通過 kubectl 根據(jù)配置文件,向 APIServer 發(fā)送命令,在 Node 節(jié)點(diǎn)上面建立 Pod 和 Container。 APIServer…

調(diào)度約束

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

用戶是通過 kubectl 根據(jù)配置文件,向 APIServer 發(fā)送命令,在 Node 節(jié)點(diǎn)上面建立 Pod 和 Container。


APIServer 經(jīng)過 API 調(diào)用,權(quán)限控制,調(diào)用資源和存儲(chǔ)資源的過程,實(shí)際上還沒有真正開始部署應(yīng)用。這里?? ?需要 Controller Manager、Scheduler 和 kubelet 的協(xié)助才能完成整個(gè)部署過程。

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

K8S是通過 List-Watch 機(jī)制實(shí)現(xiàn)每個(gè)組件的協(xié)作
controller-manager、scheduler、kubelet 通過 List-Watch 機(jī)制監(jiān)聽 apiserver 發(fā)出的事件,apiserver 通過 List-Watch 機(jī)制監(jiān)聽 etcd 發(fā)出的事件?

Pod 是 Kubernetes 的基礎(chǔ)單元,Pod 啟動(dòng)典型創(chuàng)建過程如下
(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ā)出來的事件。

(2)用戶通過 kubectl 或其他 API 客戶端提交請(qǐng)求給 APIServer 來建立一個(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,通過https的6443端口)APIServer 中的事件。此時(shí) APIServer 接受到了 Create 事件,又會(huì)發(fā)送給 Controller Manager。

(6)Controller Manager 在接到 Create 事件以后,調(diào)用其中的 Replication Controller 來保證 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 的信息通過事件發(fā)送給 APIServer。

(9)由于 Scheduler 在監(jiān)聽(Watch)APIServer,并且它在系統(tǒng)中起到了“承上啟下”的作用,“承上”是指它負(fù)責(zé)接收創(chuàng)建的 Pod 事件,為其安排 Node;“啟下”是指安置工作完成后,Node 上的 kubelet 進(jìn)程會(huì)接管后繼工作,負(fù)責(zé) Pod 生命周期中的“下半生”。 換句話說,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 中,保存起來。

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

(12)kubelet 是在 Node 上面運(yùn)行的進(jìn)程,它也通過 List-Watch 的方式監(jiān)聽(Watch,通過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,事件將通過它被接受。

#注意:在創(chuàng)建 Pod 的工作就已經(jīng)完成了后,為什么 kubelet 還要一直監(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)獲取最新的鏡像文件并且加載。

調(diào)度過程

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

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)上。

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

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

如果在 predicate 過程中沒有合適的節(jié)點(diǎn),pod 會(huì)一直在 pending 狀態(tài),不斷重試調(diào)度,直到有節(jié)點(diǎn)滿足條件。 經(jīng)過這個(gè)步驟,如果有多個(gè)節(jié)點(diǎn)滿足條件,就繼續(xù) priorities 過程:按照優(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)包括:(優(yōu)選)
●LeastRequestedPriority:通過計(jì)算CPU和Memory的使用率來決定權(quán)重,使用率越低權(quán)重越高。也就是說,這個(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)重越高。

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

scheduler 的調(diào)度策略

預(yù)選策略/預(yù)算策略

通過調(diào)度算法過濾掉不滿足條件的Node節(jié)點(diǎn),如果沒有滿足條件的Node節(jié)點(diǎn),Pod會(huì)處于Pending狀態(tài),直到有符合條件的Node節(jié)點(diǎn)出現(xiàn)
PodFitsResources、PodFitsHost、PodFitsHostPorts、PodSelectorMatches、NoDiskConflict

優(yōu)選策略

根據(jù)優(yōu)先級(jí)選項(xiàng)為滿足預(yù)選策略條件的Node節(jié)點(diǎn)進(jìn)行優(yōu)先級(jí)權(quán)重排序,最終選擇優(yōu)先級(jí)最高的Node節(jié)點(diǎn)來調(diào)度Pod
LeastRequestedPriority、BalancedResourceAllocation、ImageLocalityPriority

指定調(diào)度節(jié)點(diǎn)

Pod 調(diào)度到指定的 Node節(jié)點(diǎn)

  1. 使用 nodeName 字段指定 Node節(jié)點(diǎn)名稱
  2. 使用 nodeSelector 指定 Node節(jié)點(diǎn)的標(biāo)簽
  3. 使用 節(jié)點(diǎn)/Pod 親和性
  4. 使用 污點(diǎn)+容忍?

●pod.spec.nodeName (節(jié)點(diǎn)名)將 Pod 直接調(diào)度到指定的 Node 節(jié)點(diǎn)上,會(huì)跳過 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: node01 #這里指定節(jié)點(diǎn)名containers:- name: myappimage: nginxports:- containerPort: 80
kubectl apply -f myapp.yaml
kubectl get pods -o wideNAME ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES
myapp-6bc58d7775-6wlpp ? 1/1 ? ? Running ? 0 ? ? ? ? ?14s ? 10.244.1.25 ? node01 ? <none> ? ? ? ? ? <none>
myapp-6bc58d7775-szcvp ? 1/1 ? ? Running ? 0 ? ? ? ? ?14s ? 10.244.1.26 ? node01 ? <none> ? ? ? ? ? <none>
myapp-6bc58d7775-vnxlp ? 1/1 ? ? Running ? 0 ? ? ? ? ?14s ? 10.244.1.24 ? node01 ? <none> ? ? ? ? ? <none>

//查看詳細(xì)事件(發(fā)現(xiàn)未經(jīng)過 scheduler 調(diào)度分配)

kubectl describe pod myapp-6bc58d7775-6wlpp......Type ? ?Reason ? Age ? From ? ? ? ? ? ? Message---- ? ?------ ? ---- ?---- ? ? ? ? ? ? -------Normal ?Pulled ? 95s ? kubelet, node01 ?Container image "nginx" already present on machineNormal ?Created ?99s ? kubelet, node01 ?Created container nginxNormal ?Started ?99s ? kubelet, node01 ?Started container nginx

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

//獲取標(biāo)簽幫助

kubectl label --helpUsage:kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version] [options]

//需要獲取 node 上的 NAME 名稱

kubectl get nodeNAME ? ? STATUS ? ROLES ? ?AGE ? VERSION
master ? Ready ? ?master ? 30h ? v1.20.11
node01 ? Ready ? ?<none> ? 30h ? v1.20.11
node02 ? Ready ? ?<none> ? 30h ? v1.20.11

//給對(duì)應(yīng)的 node 設(shè)置標(biāo)簽分別為 mylabel=a 和 mylabel=b

kubectl label nodes node01 mylabel=akubectl label nodes node02 mylabel=b

//查看標(biāo)簽

kubectl get nodes --show-labelsNAME ? ? STATUS ? ROLES ? ?AGE ? VERSION ? LABELS
master ? Ready ? ?master ? 30h ? v1.20.11 ? beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01 ? Ready ? ?<none> ? 30h ? v1.20.11 ? beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,mylabel=a,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02 ? Ready ? ?<none> ? 30h ? v1.20.11 ? beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,mylabel=b,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux

//修改成 nodeSelector 調(diào)度方式

vim myapp1.yamlapiVersion: apps/v1
kind: Deployment ?
metadata:name: myapp1
spec:replicas: 3selector:matchLabels:app: myapp1template:metadata:labels:app: myapp1spec:nodeSelector: #這里指定節(jié)點(diǎn)標(biāo)簽mylabel: acontainers:- name: myapp1image: nginxports:- containerPort: 80
kubectl apply -f myapp1.yaml

查看pods,都根據(jù)指定的節(jié)點(diǎn)擁有的標(biāo)簽分配到了node1上?

kubectl get pods -o wideNAME ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES
myapp1-58cff4d75-52xm5 ? 1/1 ? ? Running ? 0 ? ? ? ? ?24s ? 10.244.1.29 ? node01 ? <none> ? ? ? ? ? <none>
myapp1-58cff4d75-f747q ? 1/1 ? ? Running ? 0 ? ? ? ? ?24s ? 10.244.1.27 ? node01 ? <none> ? ? ? ? ? <none>
myapp1-58cff4d75-kn8gk ? 1/1 ? ? Running ? 0 ? ? ? ? ?24s ? 10.244.1.28 ? node01 ? <none> ? ? ? ? ? <none>

//查看詳細(xì)事件(通過事件可以發(fā)現(xiàn)要先經(jīng)過 scheduler 調(diào)度分配)

kubectl describe pod myapp1-58cff4d75-52xm5Events:Type ? ?Reason ? ? Age ? From ? ? ? ? ? ? ? Message---- ? ?------ ? ? ---- ?---- ? ? ? ? ? ? ? -------Normal ?Scheduled ?57s ? default-scheduler ?Successfully assigned default/myapp1-58cff4d75-52xm5 to node01Normal ?Pulled ? ? 57s ? kubelet, node01 ? ?Container image "nginx" already present on machineNormal ?Created ? ?56s ? kubelet, node01 ? ?Created container myapp1Normal ?Started ? ?56s ? kubelet, node01 ? ?Started container myapp1



//修改一個(gè) label 的值,需要加上 --overwrite 參數(shù)

kubectl label nodes node02 mylabel=a --overwrite

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

kubectl label nodes node02 mylabel-

//指定標(biāo)簽查詢 node 節(jié)點(diǎn)

kubectl get node -l mylabel=a

標(biāo)簽的管理操作

???添加標(biāo)簽

kubectl label <資源類型> <資源名稱> ?標(biāo)簽key=標(biāo)簽value

更改標(biāo)簽
kubectl label <資源類型> <資源名稱> ?標(biāo)簽key=標(biāo)簽value --overwrite

去除標(biāo)簽
kubectl label <資源類型> <資源名稱> ?標(biāo)簽key-

?

查看pod具有的標(biāo)簽

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

查看具有特定標(biāo)簽的pod
kubectl get <資源類型> -l 標(biāo)簽key[=標(biāo)簽value]


親和性

一個(gè)新創(chuàng)建的pod,想要被調(diào)度到指定的節(jié)點(diǎn),或是與另一個(gè)pod存在于相同的拓?fù)溆蛑?#xff0c;即為親和性

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

節(jié)點(diǎn)親和性的策略
pod.spec.nodeAffinity

  • preferredDuringSchedulingIgnoredDuringExecution:軟策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略

Pod 親和性
pod.spec.affinity.podAffinity/podAntiAffinity

  • preferredDuringSchedulingIgnoredDuringExecution:軟策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略

硬策略(required....)

強(qiáng)制性的滿足指定條件,如果沒有滿足條件的Node節(jié)點(diǎn),Pod會(huì)處于Pending狀態(tài),直到有符合條件的Node節(jié)點(diǎn)出現(xiàn)

軟策略(preferred....)

非強(qiáng)制性的,會(huì)優(yōu)先選擇滿足條件的Node節(jié)點(diǎn)調(diào)度,即使沒有滿足條件的Node節(jié)點(diǎn),Pod依然會(huì)完成調(diào)度

可以把自己理解成一個(gè)Pod,當(dāng)你報(bào)名來學(xué)云計(jì)算,如果你更傾向去zhangsan老師帶的班級(jí),把不同老師帶的班級(jí)當(dāng)作一個(gè)node的話,這個(gè)就是節(jié)點(diǎn)親和性。如果你是必須要去zhangsan老師帶的班級(jí),這就是硬策略;而你說你想去并且最好能去zhangsan老師帶的班級(jí),這就是軟策略。
如果你有一個(gè)很好的朋友叫l(wèi)isi,你傾向和lisi同學(xué)在同一個(gè)班級(jí),這個(gè)就是Pod親和性。如果你一定要去lisi同學(xué)在的班級(jí),這就是硬策略;而你說你想去并且最好能去lisi同學(xué)在的班級(jí),這就是軟策略。軟策略是不去也可以,硬策略則是不去就不行。

親和性

節(jié)點(diǎn)親和性(nodeAffinity)

匹配指定的Node節(jié)點(diǎn)標(biāo)簽,將要部署的Pod調(diào)度到滿足條件的Node節(jié)點(diǎn)上

Pod親和性(podAffinity)

匹配指定的Pod標(biāo)簽,將要部署的Pod調(diào)度到與指定Pod所在的Node節(jié)點(diǎn)處于 同一個(gè)拓?fù)溆?的Node節(jié)點(diǎn)上

Pod反親和性(podAntiAffinity)

匹配指定的Pod標(biāo)簽,將要部署的Pod調(diào)度到與指定Pod所在的Node節(jié)點(diǎn)處于 不同的拓?fù)溆?的Node節(jié)點(diǎn)上

如何判斷是否在同一個(gè)拓?fù)溆?#xff1f;

看拓?fù)溆騥ey(topologyKey),如果有其它Node節(jié)點(diǎn)擁有與指定Pod所在的Node節(jié)點(diǎn)相同的 拓?fù)溆騥ey的標(biāo)簽key和value,那么它們就在同一個(gè)拓?fù)溆?(下文會(huì)演示實(shí)例)

鍵值運(yùn)算關(guān)系
●In:label 的值在某個(gè)列表中
●NotIn:label 的值不在某個(gè)列表中
●Gt:label 的值大于某個(gè)值
●Lt:label 的值小于某個(gè)值
●Exists:某個(gè) label 存在
●DoesNotExist:某個(gè) label 不存在

kubectl get nodes --show-labels
NAME ? ? STATUS ? ROLES ? ?AGE ? VERSION ? LABELS
master ? Ready ? ?master ? 11d ? v1.20.11 ? beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01 ? Ready ? ?<none> ? 11d ? v1.20.11 ? beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02 ? Ready ? ?<none> ? 11d ? v1.20.11 ? beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux

節(jié)點(diǎn)親和性?

//requiredDuringSchedulingIgnoredDuringExecution:硬策略?

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: nginxaffinity:         #親和性nodeAffinity:   #節(jié)點(diǎn)親和性requiredDuringSchedulingIgnoredDuringExecution:  #硬策略nodeSelectorTerms:- matchExpressions:#- key: kubernetes.io/hostname ? ?#指定node的標(biāo)簽(這里是key)- key: mylabel        #指定mylabel:a(node1擁有的標(biāo)簽)operator: NotIn ? ? #設(shè)置Pod安裝到kubernetes.io/hostname的標(biāo)簽值不在values列表中的node上values: #這里是key里的值 - a#- node02

設(shè)置了節(jié)點(diǎn)親和 硬策略。指定了node1 上自定義的標(biāo)簽 mylabel:a 代表要去node1.?

kubectl apply -f pod1.yaml
kubectl get pods -o wideNAME ? ? ? READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES
affinity ? 1/1 ? ? Running ? 0 ? ? ? ? ?13s ? 10.244.1.30 ? node01 ? <none> ? ? ? ? ? <none>
kubectl delete pod --all && kubectl apply -f pod1.yaml && kubectl get pods -o wide

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

preferredDuringSchedulingIgnoredDuringExecution:軟策略

vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:name: affinitylabels:app: node-affinity-pod
spec:containers:- name: with-node-affinityimage: nginxaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1 ? #如果有多個(gè)軟策略選項(xiàng)的話,權(quán)重越大,優(yōu)先級(jí)越高preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node03

這里軟策略指定分配到node03,但是沒有這個(gè)節(jié)點(diǎn)!于是被分配到node1或是2上。?

kubectl apply -f pod2.yaml
kubectl get pods -o wideNAME ? ? ? READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES
affinity ? 1/1 ? ? Running ? 0 ? ? ? ? ?5s ? ?10.244.2.35 ? node02 ? <none> ? ? ? ? ? <none>

//把values:的值改成node01,則會(huì)優(yōu)先在node01上創(chuàng)建Pod

kubectl delete pod --all && kubectl apply -f pod2.yaml && kubectl get pods -o wide

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

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

由于優(yōu)先滿足硬策略,排除node2。然后滿足軟策略,選擇自定義標(biāo)簽mylabel=a的節(jié)點(diǎn)。于是選擇了node1。?

Pod親和性與反親和性

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

將兩個(gè)節(jié)點(diǎn)自定義標(biāo)簽mylabel都設(shè)置為a(若拓?fù)溆蜻x擇mylabel則兩節(jié)點(diǎn)同一拓?fù)溆?#xff09;

將兩個(gè)節(jié)點(diǎn)自定義標(biāo)簽difftop一個(gè)a一個(gè)b(若拓?fù)溆蜻x擇difftop則兩節(jié)點(diǎn)處于不同拓?fù)溆?#xff09;

kubectl label nodes node1 mylabel=a
kubectl label nodes node2 mylabel=akubectl label nodes node1 difftop=a
kubectl label nodes node2 difftop=b

//創(chuàng)建一個(gè)標(biāo)簽為 app=myapp01 的 Pod(作為pod2的親和項(xiàng))

vim pod3.yamlapiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: nginx
kubectl apply -f pod3.yaml
kubectl get pods --show-labels -o wideNAME ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES ? LABELS
myapp01 ? 1/1 ? ? Running ? 0 ? ? ? ? ?37s ? 10.244.2.3 ? node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp01

//使用 Pod 親和性調(diào)度,創(chuàng)建多個(gè) Pod 資源

vim pod4.yamlkind: Deployment
metadata:name: myapp02
spec:replicas: 3selector:matchLabels:app: myapp02template:metadata:labels:app: myapp02spec:containers:- name: myapp02image: nginxports:- containerPort: 80affinity:podAffinity: #節(jié)點(diǎn)親和requiredDuringSchedulingIgnoredDuringExecution: #硬需求- labelSelector: #標(biāo)簽選擇器,指定需要親和的pod標(biāo)簽matchExpressions:- key: app #指定需要親和的pod標(biāo)簽的keyoperator: Invalues:- myapp01 #指定需要親和的pod標(biāo)簽key的值topologyKey: mylabel #指定拓?fù)溆騧ylabel (兩個(gè)節(jié)點(diǎn)相同)這里指定了mylabel標(biāo)簽作為拓?fù)溆?#xff0c;由于node1,node2都設(shè)置了mylabel=a,值相同都為a,所以處于同一拓?fù)溆?#xff0c;會(huì)在node1,或是node2,生成pod。拓?fù)溆蛴糜趧澏╬od生成的節(jié)點(diǎn)范圍。

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。
#如果?mylabel 對(duì)應(yīng)的值不一樣就是不同的拓?fù)溆?。比?Pod1 在?mylabel =a?的 Node 上Pod2 在?mylabel =b?的 Node 上Pod3 在?mylabel =a?的 Node 上,則 Pod2Pod1、Pod3 不在同一個(gè)拓?fù)溆?#xff0c;而Pod1 和 Pod3在同一個(gè)拓?fù)溆颉?/p>

kubectl apply -f pod4.yaml

由于這里設(shè)置兩個(gè)node擁有的標(biāo)簽 mylabel =?a 值一致,所以這兩個(gè)node在同一個(gè)拓?fù)溆颉?/span>

  1. 老的pod生成在的node2具有標(biāo)簽mylabel=a
  2. 由于配置了新pod親和拓?fù)溆驗(yàn)閙ylabel
  3. 于是新的pod 選擇同樣值為a的mylabel? ?的節(jié)點(diǎn)(node1或是node2,都有同樣的值,都在同一個(gè)拓?fù)溆?#xff09;,在這個(gè)兩個(gè)節(jié)點(diǎn)上平均創(chuàng)建新pod
kubectl get pods --show-labels -o wideNAME                       READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES   LABELS
myapp01                    1/1     Running   0          10m     10.244.2.35   node2   <none>           <none>            app=myapp01
myapp02-76975f4869-cdtcn   1/1     Running   0          4m16s   10.244.2.36   node2   <none>           <none>            app=myapp02,pod-template-hash=76975f4869
myapp02-76975f4869-qdpjj   1/1     Running   0          4m16s   10.244.2.37   node2   <none>           <none>            app=myapp02,pod-template-hash=76975f4869
myapp02-76975f4869-xs7fj   1/1     Running   0          4m16s   10.244.1.36   node1   <none>           <none>            app=myapp02,pod-template-hash=76975f4869
myapp02-95d4fc876-jbb2h    1/1     Running   0          74s     10.244.1.38   node1   <none>           <none>            app=myapp02,pod-template-hash=95d4fc876
myapp02-95d4fc876-l75bx    1/1     Running   0          74s     10.244.2.38   node2   <none>           <none>            app=myapp02,pod-template-hash=95d4fc876
myapp02-95d4fc876-sqfl5    1/1     Running   0          74s     10.244.1.37   node1   <none>           <none>            app=myapp02,pod-template-hash=95d4fc876

?

更改拓?fù)溆驗(yàn)閐ifftop (兩個(gè)節(jié)點(diǎn)不同)

vim pod4.yamlapiVersion: v1
kind: Pod
metadata:name: myapp02labels:app: myapp02
spec:containers:- name: myapp02image: nginxaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- myapp01topologyKey: difftop #?指定拓?fù)溆騞ifftop (兩個(gè)節(jié)點(diǎn)不同)
#?kubectl delete -f pod4.yaml #刪除剛剛的kubectl apply -f pod4.yaml #創(chuàng)建更改過的

由于這里設(shè)置兩個(gè)node擁有的標(biāo)簽 difftop =?a (node1)difftop =?b(node2) 值不一致,所以這兩個(gè)node不在同一個(gè)拓?fù)溆颉?/span>

  1. 老的pod生成在的node1具有標(biāo)簽difftop =?a
  2. 由于配置了新pod親和拓?fù)溆驗(yàn)閐ifftop
  3. 于是新的pod 選擇同樣值為a的difftop 的節(jié)點(diǎn)(只有node1是difftop=a,不與node2在同一個(gè)拓?fù)溆?#xff09;,在node1上創(chuàng)建新pod

kubectl get pods --show-labels -o wideNAME                      READY   STATUS    RESTARTS   AGE    IP            NODE    NOMINATED NODE   READINESS GATES   LABELS
myapp01                   1/1     Running   0          2m2s   10.244.1.42   node1   <none>           <none>            app=myapp01
myapp02-c559f76f5-5hhlk   1/1     Running   0          43s    10.244.1.45   node1   <none>           <none>            app=myapp02,pod-template-hash=c559f76f5
myapp02-c559f76f5-79lf4   1/1     Running   0          43s    10.244.1.43   node1   <none>           <none>            app=myapp02,pod-template-hash=c559f76f5
myapp02-c559f76f5-fttk7   1/1     Running   0          43s    10.244.1.44   node1   <none>           <none>            app=myapp02,pod-template-hash=c559f76f5

//使用 Pod 反親和性調(diào)度
示例1:

vim pod5.yamlapiVersion: v1
kind: Pod
metadata:name: myapp10labels:app: myapp10
spec:containers:- name: myapp10image: nginxaffinity:podAntiAffinity:  #反親和preferredDuringSchedulingIgnoredDuringExecution:  #軟限制- weight: 100podAffinityTerm:
#          namespaces:  #若指定pod的命名空間
#          - defaultlabelSelector:matchExpressions:- key: appoperator: Invalues:- myapp01#topologyKey: kubernetes.io/hostname #根據(jù)主機(jī)名topologyKey: difftop  #根據(jù)自定義標(biāo)簽difftop中兩個(gè)node值分別為a,b 兩個(gè)節(jié)點(diǎn)在不同的拓?fù)溆?/code>

指定舊的pod(app?myapp01,目前位于node1,difftop=a) ,

由于設(shè)置了反親和,

新的pod會(huì)生成在與舊pod不同的 拓?fù)溆蛏?#xff08;node2,difftop=b)。

kubectl apply -f pod5.yaml
kubectl get pods --show-labels -o wideNAME ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES ? LABELS
myapp01 ? 1/1 ? ? Running ? 0 ? ? ? ? ?44m ? 10.244.1.3 ? node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp01
myapp10 ? 1/1 ? ? Running ? 0 ? ? ? ? ?75s ? 10.244.2.4 ? node02 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03


示例2:若硬限制反親和(必須,不像軟限制一樣盡量),并且沒有除了指定拓?fù)溆蛞酝獾娜魏纹渌負(fù)溆虻墓?jié)點(diǎn),會(huì)直接pending等待資源

vim pod6.yamlapiVersion: v1
kind: Pod
metadata:name: myapp20labels:app: myapp20
spec:containers:- name: myapp20image: nginxaffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- myapp01topologyKey: mylabel

指定舊的pod(myapp01,位于node1,mylabel=a

由于設(shè)置了反親和,需要找到拓?fù)溆騧ylabel值不為a的節(jié)點(diǎn)創(chuàng)建pod(但是node1,node2兩個(gè)節(jié)點(diǎn)的mylabel都是a,處于同一個(gè)拓?fù)溆颉?/span>此時(shí)沒有其他的拓?fù)溆?/span>

并且設(shè)置了硬限制,此時(shí)沒有資源于是直接進(jìn)入pending等待資源。(如果是軟限制則滿足不了就將就一下,盡量選一個(gè)能滿足的,硬限制就只能滿足)

kubectl get pod --show-labels -owideNAME ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? ? IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES ? LABELS
myapp01 ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ?43s ? ? 10.244.1.68 ? node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp01
myapp20 ? ? ? 0/1 ? ? Pending ? 0 ? ? ? ? ?4s ? ? ?<none> ? ? ? ?<none> ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03

此時(shí)將node2的mylabel改為b(與node1的mylabel=a區(qū)分開,使得成為兩個(gè)不同的拓?fù)溆?#xff09;?

kubectl label nodes node02 mylabel=b --overwrite

這樣反親和就能在 不是處于myapp01的拓?fù)溆?#xff08;mylabel=a【node1節(jié)點(diǎn)】)的其他拓?fù)溆?#xff08;mylabel=b【node2節(jié)點(diǎn)】)上生成pod

kubectl get pod --show-labels -o wideNAME ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? ? IP ? ? ? ? ? ?NODE ? ? NOMINATED NODE ? READINESS GATES ? LABELS
myapp01 ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ?7m40s ? 10.244.1.68 ? node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp01
myapp21 ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ?7m1s ? ?10.244.2.65 ? node02 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03

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

污點(diǎn)(Taint)?

節(jié)點(diǎn)親和性,是Pod的一種屬性(偏好或硬性要求),它使Pod被吸引到一類特定的節(jié)點(diǎn)。Taint 則相反,它使節(jié)點(diǎn)能夠排斥一類特定的 Pod。
Taint 和 Toleration 相互配合,可以用來避免 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ū)逐出去。

污點(diǎn)的組成格式如下:

key=value:effectsuch like:
mycheck=xue:NoSchedule
tadcx=sino:PreferNoSchedule

每個(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ū)逐出去

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

kubectl get nodesNAME ? ? STATUS ? ROLES ? ?AGE ? VERSION
master ? Ready ? ?master ? 11d ? v1.20.11
node01 ? Ready ? ?<none> ? 11d ? v1.20.11
node02 ? Ready ? ?<none> ? 11d ? v1.20.11
kubectl describe node master
......
Taints: ? ? ? ? ? ? node-role.kubernetes.io/master:NoSchedule

#設(shè)置污點(diǎn)

kubectl taint node node01 key1=value1:NoSchedule#鍵值隨意取名,效果注意即可。
node01將不會(huì)被調(diào)度在其上面生成pod完整命令
kubectl taint node <node名稱>  key=value:effectNoSchedule(一定不會(huì)被調(diào)度)PreferNoSchedule(盡量不被調(diào)度) NoExecute(不會(huì)被調(diào)度,并驅(qū)逐節(jié)點(diǎn)上的Pod)

?#節(jié)點(diǎn)說明中,查找 Taints 字段

kubectl describe node [node-name]
kubectl describe nodes  <node名稱>  | grep Taints

#去除污點(diǎn) 末尾添上 -

kubectl taint node node01 key1:NoSchedule-
kubectl taint node <node名稱>  key[=value:effect]-

NoExecute選項(xiàng)還會(huì)額外驅(qū)逐已經(jīng)存在的pod

kubectl get pods -o wideNAME ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? ? IP ? ? ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES
myapp01 ? 1/1 ? ? Running ? 0 ? ? ? ? ?4h28m ? 10.244.2.3 ? node02 ? <none> ? ? ? ? ? <none>
myapp02 ? 1/1 ? ? Running ? 0 ? ? ? ? ?4h13m ? 10.244.2.4 ? node02 ? <none> ? ? ? ? ? <none>
myapp03 ? 1/1 ? ? Running ? 0 ? ? ? ? ?3h45m ? 10.244.1.4 ? node01 ? <none> ? ? ? ? ? <none>
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。

? ? ? ?如果是直接創(chuàng)建的pod沒有創(chuàng)建deploy等控制器,則寄了就是寄了。

kubectl get pods -o wideNAME ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? ? IP ? ? ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES
myapp03 ? 1/1 ? ? Running ? 0 ? ? ? ? ?3h48m ? 10.244.1.4 ? node01 ? <none> ? ? ? ? ? <none>

容忍(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 上

設(shè)置node1的污點(diǎn)?NoExecute

kubectl taint node node01 check=mycheck:NoExecute#鍵值隨意取名,效果注意即可。

pod配置文件,此時(shí)還設(shè)置容忍?

vim pod3.yamlapiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: nginx
kubectl apply -f pod3.yaml

//在兩個(gè) Node 上都設(shè)置了污點(diǎn)后,此時(shí) Pod 將無法創(chuàng)建成功

kubectl get pods -o wideNAME ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES
myapp01 ? 0/1 ? ? Pending ? 0 ? ? ? ? ?17s ? <none> ? <none> ? <none> ? ? ? ? ? <none>

?更改pod配置文件,添加容忍?

vim pod3.yamlapiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1tolerations: #容忍- key: "check" #與污點(diǎn)的鍵值相對(duì)應(yīng) exist操作符時(shí)可以不寫operator: "Equal" #Equal(等于)或 Exists(存在)value: "mycheck" #與污點(diǎn)的鍵值相對(duì)應(yīng)  可以不寫effect: "NoExecute"  #NoSchedule|PreferNoSchedule|NoExecute 與上面指定污點(diǎn)的效果相對(duì)應(yīng) exist操作符時(shí)可以不寫tolerationSeconds: 3600 #容忍期限 超過時(shí)間就不忍了 可以不寫其中的 key、vaule、effect 都要與 Node 上設(shè)置的 taint 保持一致
operator 的值為 Exists 將會(huì)忽略 value 值,即存在即可
tolerationSeconds 用于描述當(dāng) Pod 需要被驅(qū)逐時(shí)可以在 Node 上繼續(xù)保留運(yùn)行的時(shí)間
kubectl apply -f pod3.yaml

//在設(shè)置了容忍之后,Pod 創(chuàng)建成功

kubectl get pods -o wideNAME ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES
myapp01 ? 1/1 ? ? Running ? 0 ? ? ? ? ?10m ? 10.244.1.5 ? node01 ? <none> ? ? ? ? ? <none>

其它注意事項(xiàng)
(1)當(dāng)不指定 key 值時(shí),表示容忍所有的污點(diǎn) key

? tolerations:- operator: "Exists"
容忍所有污點(diǎn),無論key與類型

?(2)當(dāng)不指定 effect 值時(shí),表示容忍所有的污點(diǎn)作用

? tolerations:- key: "mykey"operator: "Exists"
容忍所有包含mykey這個(gè)鍵的污點(diǎn),無論類型

(3)有多個(gè) Master 存在時(shí),防止資源浪費(fèi),可以如下設(shè)置(設(shè)置盡量不調(diào)度模式,在master上也能調(diào)度pod。不太建議,master本來就很忙)

kubectl taint node [Master-Name] node-role.kubernetes.io/master=:PreferNoSchedule

(4)如果某個(gè) Node 更新升級(jí)系統(tǒng)組件,為了防止業(yè)務(wù)長時(shí)間中斷,可以先在該 Node 設(shè)置 NoExecute 污點(diǎn),把該 Node 上的 Pod 都驅(qū)逐出去?

kubectl taint node node01 check=mycheck:NoExecute

//此時(shí)如果別的 Node 資源不夠用,可臨時(shí)給 Master 設(shè)置 PreferNoSchedule 污點(diǎn),讓 Pod 可在 Master 上臨時(shí)創(chuàng)建

kubectl taint node master node-role.kubernetes.io/master=:PreferNoSchedule

//待所有 Node 的更新操作都完成后,再去除污點(diǎn)

kubectl taint node node01 check=mycheck:NoExecute-
kubectl taint node master node-role.kubernetes.io/master=:NoSchedule

cordon 和 drain 用于節(jié)點(diǎn)維護(hù)時(shí) 不可調(diào)度與驅(qū)逐pod

這兩條命令專門用于做節(jié)點(diǎn)維護(hù) (就是上面第四個(gè)升級(jí)的進(jìn)階版。相比上面的手動(dòng)設(shè)置污點(diǎn)驅(qū)逐,不用擔(dān)心pod已經(jīng)設(shè)置了容忍)

cordon (設(shè)置不可調(diào)度)

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

kubectl get nodes

cordon?將 Node 標(biāo)記為不可調(diào)度的狀態(tài),這樣就不會(huì)讓新創(chuàng)建的 Pod 在此 Node 上運(yùn)行

kubectl cordon 	<node名稱>
#該node將會(huì)變?yōu)镾chedulingDisabled狀態(tài)

恢復(fù)?

kubectl uncordon  <node名稱>

drain(設(shè)置不可調(diào)度與驅(qū)逐 drain = cordon + NoSchedule)

kubectl drain 可以讓 Node 節(jié)點(diǎn)開始釋放所有 pod,并且不接收新的 pod 進(jìn)程。drain 本意排水,意思是將出問題的 Node 下的 Pod 轉(zhuǎn)移到其它 Node 下運(yùn)行

kubectl drain  <node名稱>  --ignore-daemonsets --delete-emptydir-data --force--ignore-daemonsets:無視 DaemonSet 管理下的 Pod。
DaemonSet是所有pod上都會(huì)創(chuàng)建的pod,多數(shù)情況為守護(hù)進(jìn)程,類似網(wǎng)絡(luò)插件flannel。忽略,以免驅(qū)逐了守護(hù)進(jìn)程導(dǎo)致故障
--delete-emptydir-data:如果有 mount local volume 的 pod,會(huì)強(qiáng)制殺掉該 pod。
--force:強(qiáng)制釋放不是控制器管理的 Pod。

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

  1. 設(shè)定此 node 為不可調(diào)度狀態(tài)(cordon)
  2. evict(驅(qū)逐)了 Pod

恢復(fù)

kubectl uncordon 將 Node 標(biāo)記為可調(diào)度的狀態(tài)

kubectl uncordon <NODE_NAME>


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

Pod 創(chuàng)建完之后,一直到持久運(yùn)行起來,中間有很多步驟,也就有很多出錯(cuò)的可能,因此會(huì)有很多不同的狀態(tài)。
一般來說,pod 這個(gè)過程包含以下幾個(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)行起來。如果有健康檢查,會(huì)根據(jù)檢查的結(jié)果來設(shè)置其狀態(tài)。

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

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

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

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

●Unknown:表示無法讀取 Pod 狀態(tài),通常是 kube-controller-manager 無法與 Pod 通信。Pod 所在的 Node 出了問題或失聯(lián),從而導(dǎo)致 Pod 的狀態(tài)為 Unknow

如何刪除 Unknown 狀態(tài)的 Pod ?
●從集群中刪除有問題的 Node。使用公有云時(shí),kube-controller-manager 會(huì)在 VM 刪除后自動(dòng)刪除對(duì)應(yīng)的 Node。 而在物理機(jī)部署的集群中,需要管理員手動(dòng)刪除 Node(kubectl delete node <node_name>)。

●被動(dòng)等待 Node 恢復(fù)正常,Kubelet 會(huì)重新跟 kube-apiserver 通信確認(rèn)這些 Pod 的期待狀態(tài),進(jìn)而再?zèng)Q定刪除或者繼續(xù)運(yùn)行這些 Pod。

●主動(dòng)刪除 Pod,通過執(zhí)行 kubectl delete pod <pod_name> --grace-period=0 --force 強(qiáng)制刪除 Pod。但是這里需要注意的是,除非明確知道 Pod 的確處于停止?fàn)顟B(tài)(比如 Node 所在 VM 或物理機(jī)已經(jīng)關(guān)機(jī)),否則不建議使用該方法。特別是 StatefulSet 管理的 Pod,強(qiáng)制刪除容易導(dǎo)致腦裂或者數(shù)據(jù)丟失等問題。

故障排除步驟

???????
//查看Pod事件

kubectl describe TYPE NAME_PREFIX ?

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

kubectl logs <POD_NAME> [-c Container_NAME]

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

kubectl exec –it <POD_NAME> bash

//查看集群信息

kubectl get nodes

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

kubectl cluster-info

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

journalctl -xefu kubelet


?

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

相關(guān)文章:

  • 關(guān)于網(wǎng)站建設(shè)的幾點(diǎn)體會(huì)搜索率最高的關(guān)鍵詞
  • 做視頻分享網(wǎng)站的參考書新產(chǎn)品推廣策劃方案
  • 網(wǎng)站開發(fā)_超速云怎么做網(wǎng)站宣傳
  • 商城小程序公司無錫seo公司哪家好
  • 開一家網(wǎng)站建設(shè)公司要多少錢深圳市網(wǎng)絡(luò)營銷推廣服務(wù)公司
  • 2018做網(wǎng)站賺錢不天津seo顧問
  • 人才網(wǎng)網(wǎng)站建設(shè)方案中小型企業(yè)網(wǎng)站設(shè)計(jì)與開發(fā)
  • 建設(shè)銀行etc信用卡申請(qǐng)網(wǎng)站google官網(wǎng)下載安裝
  • 成都小程序開發(fā)外包公司廣告開戶南京seo
  • 超市型網(wǎng)站開發(fā)企業(yè)微信scrm
  • 做網(wǎng)站廊坊百度網(wǎng)盤app下載安裝
  • 網(wǎng)站備案許可證號(hào)查詢b2b多平臺(tái)一鍵發(fā)布
  • 企業(yè)網(wǎng)站建設(shè)公司選擇分析免費(fèi)大數(shù)據(jù)查詢
  • 服裝企業(yè)網(wǎng)站建設(shè)現(xiàn)狀微博付費(fèi)推廣有用嗎
  • 長春做網(wǎng)站企業(yè)重慶網(wǎng)站seo好不好
  • 提供企業(yè)網(wǎng)站建設(shè)怎樣才能在百度上發(fā)布信息
  • 江西九江網(wǎng)站建設(shè)營銷型網(wǎng)站制作
  • 大鵬附近網(wǎng)站建設(shè)seo關(guān)鍵詞優(yōu)化軟件app
  • 做網(wǎng)站首頁的軟件百度一下網(wǎng)頁
  • 外文網(wǎng)站建設(shè)完成如何自建網(wǎng)站?
  • 合肥大型網(wǎng)站制作公司百度賬號(hào)官網(wǎng)
  • 網(wǎng)站做輪播圖的意義深圳網(wǎng)頁設(shè)計(jì)公司
  • 網(wǎng)站開發(fā)工程師中級(jí)高級(jí)星沙網(wǎng)站優(yōu)化seo
  • 參與賭博網(wǎng)站建設(shè)可判幾年微信推廣鏈接怎么制作
  • 微信商城網(wǎng)站建設(shè)app推廣策略
  • 北京外包公司 網(wǎng)站開發(fā)自助建站系統(tǒng)模板
  • 建設(shè)銀行網(wǎng)站功能介紹百度的seo關(guān)鍵詞優(yōu)化怎么弄
  • 陜西網(wǎng)站建設(shè)公司哪有網(wǎng)絡(luò)推廣都是收費(fèi)
  • 網(wǎng)絡(luò)優(yōu)化崗位詳細(xì)介紹網(wǎng)絡(luò)優(yōu)化工程師騙局
  • 化妝品網(wǎng)站開發(fā)的背景微信做單30元一單