建模外包網(wǎng)站推廣怎么做
調(diào)度
- 一、Kurbernetes的list-watch機(jī)制
- 1.1 list-watch機(jī)制簡(jiǎn)介
- 1.2 創(chuàng)建pod的流程(結(jié)合list-watch機(jī)制)
- 二、Scheduler的調(diào)度策略
- 2.1 簡(jiǎn)介
- 2.2 預(yù)選策略(predicate)
- 2.3 優(yōu)選策略(priorities)
- 三、標(biāo)簽管理
- 3.1 查看標(biāo)簽的幫助信息
- 3.2 查看標(biāo)簽信息
- 3.3 添加標(biāo)簽
- 3.4 修改標(biāo)簽
- 3.5 刪除標(biāo)簽
- 3.6 根據(jù)標(biāo)簽值查找資源對(duì)象
- 四、kubernetes對(duì)Pod的調(diào)度策略
- 五、定向調(diào)度
- 5.1 調(diào)度策略簡(jiǎn)介
- 5.2 調(diào)度實(shí)例
- 5.2.1 通過(guò)nodeName字段
- 5.2.2 通過(guò)nodeSelector字段
- 配置
- 測(cè)試
- 六、親和性調(diào)度
- 6.1 Node親和性
- 6.2 Pod親和性
- 6.3 Pod反親和性
- 6.4 拓?fù)溆?/li>
- 6.4.1 拓?fù)溆虻亩x
- 6.4.2 如何判斷是否在同一個(gè)拓?fù)溆?#xff1f;
- 6.5 親和性的策略
- 6.6 親和性調(diào)度實(shí)例
- 6.6.1 node親和性
- 6.6.2 Pod親和性
- 6.6.3 Pod反親和性
- 六、污點(diǎn)和容忍
- 7.1 節(jié)點(diǎn)設(shè)置污點(diǎn)
- 7.2 Pod設(shè)置容忍
- 7.3 調(diào)度實(shí)例
- 八、Pod啟動(dòng)階段
- 8.1 Pod啟動(dòng)過(guò)程
- 8.2 Pod生命周期的5種狀態(tài)
- 九、小結(jié)
- 9.1 理論部分
- 9.2 K8s常用故障排錯(cuò)流程/手段
一、Kurbernetes的list-watch機(jī)制
1.1 list-watch機(jī)制簡(jiǎn)介
Kubernetes 通過(guò) List-Watch 的機(jī)制進(jìn)行每個(gè)組件的協(xié)作,保持?jǐn)?shù)據(jù)同步,每個(gè)組件之間的設(shè)計(jì)實(shí)現(xiàn)了解耦。
list 機(jī)制,通過(guò)調(diào)用資源的list API羅列資源,基于HTTP短鏈接實(shí)現(xiàn);
watch機(jī)制,通過(guò)調(diào)用資源的watch API監(jiān)聽(tīng)資源變更事件,基于HTTP 長(zhǎng)鏈接實(shí)現(xiàn)
這種機(jī)制對(duì)于需要持續(xù)跟蹤 Kubernetes 集群中資源的狀態(tài)變化的應(yīng)用程序非常有用,例如自動(dòng)伸縮、監(jiān)控、日志收集等。
1.2 創(chuàng)建pod的流程(結(jié)合list-watch機(jī)制)
1)客戶端向apiserver發(fā)送創(chuàng)建Pod的請(qǐng)求,然后apiserver將請(qǐng)求信息存入到etcd中;
2)存入完成后,etcd會(huì)通過(guò)apiserver發(fā)送創(chuàng)建Pod資源的事件;
3)controller manager通過(guò)list-watch機(jī)制監(jiān)聽(tīng)apiserver發(fā)送出來(lái)的事件,并創(chuàng)建相關(guān)的Pod資源,創(chuàng)建完成后,通過(guò)apiserver將信存入到etcd中
4) etcd存入更新信息之后,再次通過(guò)apiserver發(fā)送調(diào)度Pod資源的事件;
5)scheduler通過(guò)list-watch機(jī)制監(jiān)聽(tīng)到apiserver發(fā)出的調(diào)度事件,通過(guò)調(diào)度算法,將Pod資源調(diào)度到合適的node節(jié)點(diǎn)上,調(diào)度完成后通過(guò)apiserver將調(diào)度完成后的信息更新到etcd中;
6)etcd收到更新信息后,再次向apiserver發(fā)送創(chuàng)建Pod的事件;
7)kubelet通過(guò)list-watch機(jī)制監(jiān)聽(tīng)apiserver發(fā)出的創(chuàng)建Pod的事件,然后根據(jù)事件信息,在相應(yīng)的node節(jié)點(diǎn)完成Pod的創(chuàng)建。
二、Scheduler的調(diào)度策略
2.1 簡(jiǎn)介
Scheduler 是 kubernetes 的調(diào)度器,主要的任務(wù)是把定義的 pod 分配到集群的節(jié)點(diǎn)上。
Sheduler 是作為單獨(dú)的程序運(yùn)行的,啟動(dòng)之后會(huì)一直監(jiān)聽(tīng) APIServer
,獲取 spec.nodeName
為空的 pod,對(duì)每個(gè) pod 都會(huì)創(chuàng)建一個(gè) binding
,表明該 pod 應(yīng)該放到哪個(gè)節(jié)點(diǎn)上。
調(diào)度規(guī)則
1)公平:如何保證每個(gè)節(jié)點(diǎn)都能被分配資源
2)資源高效利用:集群所有資源最大化被使用
3)效率:調(diào)度的性能要好,能夠盡快地對(duì)大批量的 pod 完成調(diào)度工作
4)靈活:允許用戶根據(jù)自己的需求控制調(diào)度的邏輯
調(diào)度的流程
1)首先是過(guò)濾掉不滿足條件的節(jié)點(diǎn),這個(gè)過(guò)程稱為預(yù)算策略(predicate);
2)然后對(duì)通過(guò)的節(jié)點(diǎn)按照優(yōu)先級(jí)排序,這個(gè)是優(yōu)選策略(priorities);
3)最后從中選擇優(yōu)先級(jí)最高的節(jié)點(diǎn)。如果中間任何一步驟有錯(cuò)誤,就直接返回錯(cuò)誤。
2.2 預(yù)選策略(predicate)
預(yù)選策略:過(guò)濾掉不滿足條件的節(jié)點(diǎn)的過(guò)程。
常見(jiàn)的算法 | 描述 |
---|---|
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 | 過(guò)濾掉和 pod 指定的 label 不匹配的節(jié)點(diǎn)。 |
NoDiskConflict | 已經(jīng) mount 的 volume 和 pod 指定的 volume 不沖突,除非它們都是只讀。 |
如果在 predicate 過(guò)程中沒(méi)有合適的節(jié)點(diǎn),pod 會(huì)一直在 Pending 狀態(tài)`,不斷重試調(diào)度,直到有節(jié)點(diǎn)滿足條件。
2.3 優(yōu)選策略(priorities)
**優(yōu)選策略:**對(duì)通過(guò)的節(jié)點(diǎn)按照優(yōu)先級(jí)排序。
優(yōu)先級(jí)由一系列鍵值對(duì)組成,鍵是該優(yōu)先級(jí)項(xiàng)的名稱,值是它的權(quán)重(該項(xiàng)的重要性)。
常見(jiàn)的優(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é)果。
三、標(biāo)簽管理
#基本語(yǔ)法
kubectl label <資源類型> <資源名稱> <標(biāo)簽鍵>=<標(biāo)簽值> [options]
字段 | 功能 | |
---|---|---|
<資源類型> | 要添加或修改標(biāo)簽的資源類型 | 如 pod、deployment、service 等 |
<資源名稱> | 要添加或修改標(biāo)簽的資源對(duì)象的名稱 | |
<標(biāo)簽鍵>=<標(biāo)簽值> | 要添加或修改的標(biāo)簽及其對(duì)應(yīng)的值 |
3.1 查看標(biāo)簽的幫助信息
kubectl label --help
3.2 查看標(biāo)簽信息
--show-labels
選項(xiàng)
#基本語(yǔ)法
kubectl get <資源類型> [<資源名稱>] [-n namespace] --show-labels
舉個(gè)例子
#查看指定命名空間中所有pod的標(biāo)簽
kubectl get pods -n my-ns --show-labels
3.3 添加標(biāo)簽
使用 kubectl label 命令
可以為資源對(duì)象添加標(biāo)簽,在命令中指定資源類型、名稱和要添加的標(biāo)簽及其值。
kubectl label <資源類型> <資源名稱> [-n namespce] key=value
key=value
表示要添加或修改的標(biāo)簽鍵值對(duì)。
鍵(key)是一個(gè)字符串,可以是任何你指定的名字;
值(value)是一個(gè)字符串,可以是任何你指定的值。
鍵和值之間使用等號(hào)(=)連接。
舉個(gè)例子
#為名為 nginx-test1 的 Pod 添加app=backend 和 version=1.15 兩個(gè)標(biāo)簽
kubectl label pod nginx-test1 -n my-ns app=backend version=1.15
3.4 修改標(biāo)簽
使用--overwrite
選項(xiàng) 可以修改已存在的標(biāo)簽值。
如果不使用該選項(xiàng),則只會(huì)添加新標(biāo)簽或更新值不同的標(biāo)簽。
#基本格式
kubectl label <資源類型> <資源名稱> <標(biāo)簽鍵>=<新標(biāo)簽值> --overwrite
舉個(gè)例子
kubectl label pod nginx-test1 -n my-ns app=1234 version=1222 --overwrite
3.5 刪除標(biāo)簽
要?jiǎng)h除 Kubernetes 資源對(duì)象的標(biāo)簽,可以使用 kubectl label
命令,將標(biāo)簽值設(shè)置為空。
#基本格式
kubectl label <資源類型> <資源名稱> <標(biāo)簽鍵>-
使用 -
(減號(hào))指示要?jiǎng)h除標(biāo)簽。
刪除標(biāo)簽不會(huì)刪除整個(gè)資源對(duì)象,只會(huì)刪除指定的標(biāo)簽鍵和值。
舉個(gè)例子
#刪除app標(biāo)簽
kubectl label pod nginx-test1 -n my-ns app-
3.6 根據(jù)標(biāo)簽值查找資源對(duì)象
-l選項(xiàng)
,根據(jù)標(biāo)簽值查找 Kubernetes 資源對(duì)象。
標(biāo)簽選擇器支持邏輯操作符(例如逗號(hào)表示邏輯與)和等價(jià)性操作符(=
表示等于)。
#基本格式
kubectl get/describe <資源類型> -l key[=value]
使用 kubectl get
命令和自定義選擇器查詢語(yǔ)句來(lái)進(jìn)行更復(fù)雜的標(biāo)簽篩選。
使用 kubectl describe
命令查找具有指定標(biāo)簽的資源對(duì)象的詳細(xì)信息。
舉個(gè)例子
kubectl get pod -n my-ns -l app
kubectl get pod -n my-ns -l version
kubectl describe pod -n my-ns -l name=test1
四、kubernetes對(duì)Pod的調(diào)度策略
在 Kubernetes 中,調(diào)度 是指將 Pod 放置到合適的節(jié)點(diǎn)上,以便對(duì)應(yīng)節(jié)點(diǎn)上的 Kubelet 能夠運(yùn)行這些 Pod。
1)定向調(diào)度: 使用 nodeName 字段
指定node節(jié)點(diǎn)名稱;使用 nodeSelector 字段
指定node節(jié)點(diǎn)的標(biāo)簽;
2)親和性調(diào)度: 使用 節(jié)點(diǎn)/Pod 親和性(NodeAffinity、PodAffinity、PodAntiAffinity);
3)污點(diǎn)與容忍: 使用 節(jié)點(diǎn)設(shè)置污點(diǎn),結(jié)合 Pod設(shè)置容忍。
4)全自動(dòng)調(diào)度:運(yùn)行在哪個(gè)節(jié)點(diǎn)上完全由Scheduler經(jīng)過(guò)一系列的算法計(jì)算得出;
#補(bǔ)充,Pod和node的關(guān)系
Node 是 Kubernetes 集群中的工作節(jié)點(diǎn)
一個(gè) Node 可以運(yùn)行多個(gè) Pod,而一個(gè) Pod 只能運(yùn)行在一個(gè) Node 上
使用標(biāo)簽和選擇器可以管理 Node 和 Pod 之間的關(guān)系,從而實(shí)現(xiàn)靈活的調(diào)度和管理。
五、定向調(diào)度
5.1 調(diào)度策略簡(jiǎn)介
nodeName
:指定節(jié)點(diǎn)名稱,用于將Pod調(diào)度到指定的Node上,不經(jīng)過(guò)調(diào)度器。
nodeSelector
:在 Pod 定義文件的 spec
下的 nodeSelector
字段中設(shè)置一個(gè)標(biāo)簽選擇器,在 Pod 調(diào)度的時(shí)候,只有具有這些標(biāo)簽的 Node 才會(huì)被考慮用來(lái)運(yùn)行這個(gè) Pod。
5.2 調(diào)度實(shí)例
5.2.1 通過(guò)nodeName字段
配置清單文件
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:nodeName: node02containers:- name: my-containerimage: nginx
創(chuàng)建與測(cè)試
kubectl apply -f test2.yamlkubectl get pods
5.2.2 通過(guò)nodeSelector字段
配置
1.為在 Kubernetes 集群的節(jié)點(diǎn)設(shè)置標(biāo)簽
kubectl label nodes node01 mylabel=backend
kubectl label nodes node02 mylabel=frontend
2.創(chuàng)建一個(gè) Deployment
定義 Pod 調(diào)度策略為使用 NodeSelector
,在創(chuàng)建時(shí)選擇具有 mylabel=backend
的節(jié)點(diǎn)上運(yùn)行。
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:nodeSelector:mylabel: backendcontainers:- name: myapp-containerimage: nginx
kubectl apply -f test1.yaml
測(cè)試
kubectl get pods -o wide
所有的 Pod 都運(yùn)行在具有 mylabel=backend
的節(jié)點(diǎn)上。
六、親和性調(diào)度
官方文檔:將 Pod 指派給節(jié)點(diǎn) | Kubernetes
kubectl explain pod.spec.affinity
鍵值運(yùn)算關(guān)系 | 描述 |
---|---|
In | label 的值在某個(gè)列表中 |
NotIn | label 的值不在某個(gè)列表中 |
Gt | label 的值大于某個(gè)值 |
Lt | label 的值小于某個(gè)值 |
Exists | 某個(gè) label 存在 |
DoesNotExist | 某個(gè) label 不存在 |
6.1 Node親和性
節(jié)點(diǎn)親和性(nodeAffinity):匹配指定node節(jié)點(diǎn)的標(biāo)簽,將要部署的Pod調(diào)度到滿足條件的node節(jié)點(diǎn)上
6.2 Pod親和性
Pod親和性(podAffinity):匹配指定的Pod的標(biāo)簽,將要部署的Pod調(diào)度到與指定Pod所在的node節(jié)點(diǎn)處于同一個(gè)拓?fù)溆虻膎ode節(jié)點(diǎn)上。
如果有多個(gè)node節(jié)點(diǎn)屬于同一個(gè)拓?fù)溆?#xff0c;通過(guò)Pod親和性部署多個(gè)Pod時(shí)則調(diào)度器會(huì)試圖將Pod均衡的調(diào)度到處于同一個(gè)拓?fù)溆虻膎ode節(jié)點(diǎn)上
6.3 Pod反親和性
Pod反親和性(podAntiAffinity):匹配指定的Pod的標(biāo)簽,將要部署的Pod調(diào)度到與指定Pod所在的node節(jié)點(diǎn)處于不同的拓?fù)溆虻膎ode節(jié)點(diǎn)上
如果有多個(gè)node節(jié)點(diǎn)不在同一個(gè)拓?fù)溆?#xff0c;通過(guò)Pod反親和性部署多個(gè)Pod時(shí)則調(diào)度器會(huì)試圖將Pod均衡的調(diào)度到不在同一個(gè)拓?fù)溆虻膎ode節(jié)點(diǎn)上
6.4 拓?fù)溆?/h3>
6.4.1 拓?fù)溆虻亩x
拓?fù)溆?/strong>(Topology Domain)是用于描述和控制Pod調(diào)度和部署的一種機(jī)制,它基于節(jié)點(diǎn)的拓?fù)湫畔?lái)限制Pod的調(diào)度位置,以滿足用戶定義的性能和資源需求。
使用拓?fù)溆蛱匦?#xff0c;可以在Pod的調(diào)度過(guò)程中指定節(jié)點(diǎn)的拓?fù)浼s束,這意味著可以定義一個(gè)Pod只能被調(diào)度到帶有某些特定標(biāo)簽的節(jié)點(diǎn)上,或者避免被調(diào)度到具有某些標(biāo)簽的節(jié)點(diǎn)上。
例如,可以指定要求一個(gè)Pod只能調(diào)度到同一個(gè)機(jī)架或同一個(gè)區(qū)域中的節(jié)點(diǎn)上,以滿足高可用性或數(shù)據(jù)局部性的需求。
6.4.2 如何判斷是否在同一個(gè)拓?fù)溆?#xff1f;
通過(guò)拓?fù)溆騥ey(topologyKey)判斷。
如果有其它node節(jié)點(diǎn)擁有,和指定Pod所在的node節(jié)點(diǎn),相同的拓?fù)溆騥ey的標(biāo)簽key和值,那么它們就屬于同一個(gè)拓?fù)溆颉?/p>
6.5 親和性的策略
#查看字段信息
kubectl explain pod.spec.affinity.xxAffinity
字段 | 字段名 | 描述 |
---|---|---|
required… | 硬策略 | 強(qiáng)制性的滿足條件 如果沒(méi)有滿足條件的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)進(jìn)行調(diào)度 即使沒(méi)有滿足條件的node節(jié)點(diǎn),Pod依然會(huì)完成調(diào)度 |
如果有多個(gè)軟策略選項(xiàng)的話,權(quán)重越大,優(yōu)先級(jí)越高。
如果把硬策略和軟策略合在一起使用,則要先滿足硬策略之后才會(huì)滿足軟策略。
6.6 親和性調(diào)度實(shí)例
6.6.1 node親和性
1.添加標(biāo)簽
kubectl label nodes node01 disk=ssd
kubectl label nodes node02 disk=dds
配置清單文件
使用節(jié)點(diǎn)親和性調(diào)度規(guī)則,要求將 Pod 調(diào)度到標(biāo)簽為 “disk=ssd” 的節(jié)點(diǎn)。
vim pod1.yamlapiVersion: v1
kind: Pod
metadata:name: frontend-pod
spec:containers:- name: frontendimage: nginxaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: diskoperator: Invalues:- ssd
創(chuàng)建并測(cè)試
kubectl apply -f pod1.yaml -n my-ns
kubectl get pods -n my-ns -o wide
6.6.2 Pod親和性
多個(gè)pod在一個(gè)節(jié)點(diǎn)
添加標(biāo)簽
kubectl label nodes node01 app=backend
kubectl label nodes node02 app=frontend
配置清單文件
apiVersion: v1
kind: Pod
metadata:name: frontend-pod
spec:containers:- name: frontendimage: nginxaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: NotInvalues:- frontendtopologyKey: "kubernetes.io/hostname"
---
apiVersion: v1
kind: Pod
metadata:name: backend-pod
spec:containers:- name: backendimage: mysqlaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: NotInvalues:- backendtopologyKey: "kubernetes.io/hostname"
創(chuàng)建并測(cè)試
kubectl apply -f pod2.yaml -n my-ns
kubectl get pods -n my-ns -o wide
Kubernetes 將會(huì)創(chuàng)建一個(gè)具有 Pod Anti-Affinity 配置的 Deployment,確保這三個(gè) Pod 盡量運(yùn)行在不同的節(jié)點(diǎn)上。
6.6.3 Pod反親和性
多個(gè)pod不在同一個(gè)節(jié)點(diǎn)
配置清單文件
apiVersion: apps/v1
kind: Deployment
metadata:name: my-app-deployment
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-app-containerimage: my-app-imageaffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- my-apptopologyKey: "kubernetes.io/hostname"
創(chuàng)建并測(cè)試
kubectl apply -f pod3.yaml -n my-ns
kubectl get pods -n my-ns -o wide
六、污點(diǎn)和容忍
通過(guò)使用污點(diǎn)和容忍機(jī)制,可以更精確地控制Pod的調(diào)度行為,確保Pod被調(diào)度到滿足特定條件的節(jié)點(diǎn)上。
7.1 節(jié)點(diǎn)設(shè)置污點(diǎn)
基本概念
在 Kubernetes 中,Node(節(jié)點(diǎn))上的污點(diǎn)(Taint)是用于標(biāo)記節(jié)點(diǎn)的屬性,以控制 Pod(容器)在節(jié)點(diǎn)上的調(diào)度行為。
通過(guò)給節(jié)點(diǎn)打上污點(diǎn),可以限制節(jié)點(diǎn)上可以調(diào)度的 Pod,從而實(shí)現(xiàn)更精細(xì)的調(diào)度策略。
污點(diǎn)由三個(gè)部分組成:
- Key(鍵):標(biāo)記的名稱。
- Value(值):標(biāo)記的值,可選。
- Effect(作用):標(biāo)記的作用。
污點(diǎn)的組成格式如下:
key=value:effect
taint effect 支持的選項(xiàng) | 描述 | |
---|---|---|
NoSchedule | 一定不會(huì)被調(diào)度 | 表示 k8s 將不會(huì)將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上 |
PreferNoSchedule | 盡量不被調(diào)度 | 表示 k8s 將盡量避免將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上 |
NoExecute | 不會(huì)被調(diào)度,并驅(qū)逐Pod | 表示 k8s 將不會(huì)將 Pod 調(diào)度到具有該污點(diǎn) |
相關(guān)命令
#給節(jié)點(diǎn)打上污點(diǎn)
kubectl taint node <node名稱> key=[value]:effect#覆蓋現(xiàn)有的污點(diǎn)
kubectl taint node <node名稱> key=[value]:effect --overwrite#刪除
kubectl taint node <node名稱> key[=value:effect]-kubectl describe nodes <node名稱> | grep Taints
##舉個(gè)例子##
#給名為 `node-1` 的節(jié)點(diǎn)打上鍵為 `special`,值為 `true` 的污點(diǎn),并設(shè)置作用為 `NoSchedule`:
kubectl taint node node-1 special=true:NoSchedule這將導(dǎo)致 Pod 除非聲明容忍該污點(diǎn),否則不會(huì)被調(diào)度到 `node-1` 節(jié)點(diǎn)上。
7.2 Pod設(shè)置容忍
Pod 可以使用容忍(Toleration)來(lái)聲明對(duì)污點(diǎn)的容忍,以允許在具有相應(yīng)污點(diǎn)的節(jié)點(diǎn)上調(diào)度。
配置清單格式
#Pod設(shè)置容忍 toleration
spec:tolerations:- key: 污點(diǎn)鍵名operator: Equal|Existsvalue: 污點(diǎn)鍵值effect: NoSchedule|PreferNoSchedule|NoExecute
相關(guān)命令
設(shè)置node節(jié)點(diǎn)不可調(diào)用
kubectl cordon <node名稱>
kubectl uncordon <node名稱>設(shè)置node節(jié)點(diǎn)不可調(diào)用并驅(qū)逐Pod
kubectl drain <node名稱> --ignore-daemonsets --force --delete-emptydir-data
7.3 調(diào)度實(shí)例
1.打上污點(diǎn)
kubectl taint node node01 key1=value1:NoSchedule
2.編寫(xiě)測(cè)試清單文件
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-appimage: my-app-imagetolerations:- key: "key1"operator: "Equal"value: "value1"effect: "NoSchedule"
3.測(cè)試
kubectl apply -f pod4.yaml -n my-nskubectl get pod -o wide -n my-ns
八、Pod啟動(dòng)階段
8.1 Pod啟動(dòng)過(guò)程
0)控制器創(chuàng)建Pod副本;
1)調(diào)度器scheduler根據(jù)調(diào)度算法選擇一臺(tái)最適合的node節(jié)點(diǎn)調(diào)度Pod;
2)kubelet
拉取鏡像;
3)kubelet
掛載存儲(chǔ)卷等;
4)kubelet
創(chuàng)建并運(yùn)行容器;
5)kubelet
根據(jù)容器的探針探測(cè)結(jié)果設(shè)置Pod狀態(tài)。
8.2 Pod生命周期的5種狀態(tài)
狀態(tài) | 描述 |
---|---|
Pending | Pod已經(jīng)創(chuàng)建,但是Pod還處于包括未完成調(diào)度到node節(jié)點(diǎn)的過(guò)程或者還處于在鏡像拉取過(guò)程中、存儲(chǔ)卷掛載失敗的情況 |
Running | Pod所有容器已被創(chuàng)建,且至少有一個(gè)容器正在運(yùn)行 |
Succeeded | Pod所有容器都已經(jīng)成功退出,且不再重啟。(completed) |
Failed | Pod所有容器都退出,且至少有一個(gè)容器是異常退出的。(error) |
Unknown | master節(jié)點(diǎn)的controller manager無(wú)法獲取到Pod狀態(tài) 通常是因?yàn)閙aster節(jié)點(diǎn)的apiserver與Pod所在node節(jié)點(diǎn)的kubelet通信失聯(lián)導(dǎo)致的 |
?
?
九、小結(jié)
9.1 理論部分
K8S是通過(guò) List-Watch 機(jī)制實(shí)現(xiàn)每個(gè)組件的協(xié)作
controller manager、scheduler、kubelet 通過(guò) List-Watch 機(jī)制監(jiān)聽(tīng) apiserver 發(fā)出的事件,apiserver 通過(guò) List-Watch 機(jī)制監(jiān)聽(tīng) etcd 發(fā)出的事件scheduler的調(diào)度策略:
預(yù)選策略/預(yù)算策略:通過(guò)調(diào)度算法過(guò)濾掉不滿足條件的node節(jié)點(diǎn);如果沒(méi)有滿足條件的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)來(lái)調(diào)度Pod
LeastRequestedPriority、BalancedResourceAllocation、ImageLocalityPriority標(biāo)簽的管理操作:
kubectl label <資源類型> <資源名稱> 標(biāo)簽key=標(biāo)簽value
kubectl label <資源類型> <資源名稱> 標(biāo)簽key=標(biāo)簽value --overwrite
kubectl label <資源類型> <資源名稱> 標(biāo)簽key-kubectl get <資源類型> [資源名稱] --show-labels
kubectl get <資源類型> -l 標(biāo)簽key[=標(biāo)簽value]指定node節(jié)點(diǎn)調(diào)度Pod的方式:
1)使用 nodeName 字段指定node節(jié)點(diǎn)名稱
2)使用 nodeSelector 字段指定node節(jié)點(diǎn)的標(biāo)簽
3)使用 節(jié)點(diǎn)/Pod 親和性
4)使用 節(jié)點(diǎn)設(shè)置污點(diǎn) + Pod設(shè)置容忍親和性:
節(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ù)溆虻膎ode節(jié)點(diǎn)上如果有多個(gè)node節(jié)點(diǎn)屬于同一個(gè)拓?fù)溆?#xff0c;通過(guò)Pod親和性部署多個(gè)Pod時(shí)則調(diào)度器會(huì)試圖將Pod均衡的調(diào)度到處于同一個(gè)拓?fù)溆虻膎ode節(jié)點(diǎn)上Pod反親和性(podAntiAffinity):匹配指定的Pod的標(biāo)簽,將要部署的Pod調(diào)度到與指定Pod所在的node節(jié)點(diǎn)處于不同的拓?fù)溆虻膎ode節(jié)點(diǎn)上如果有多個(gè)node節(jié)點(diǎn)不在同一個(gè)拓?fù)溆?#xff0c;通過(guò)Pod反親和性部署多個(gè)Pod時(shí)則調(diào)度器會(huì)試圖將Pod均衡的調(diào)度到不在同一個(gè)拓?fù)溆虻膎ode節(jié)點(diǎn)上如何判斷是否在同一個(gè)拓?fù)溆?#xff1f;
通過(guò)拓?fù)溆騥ey(topologyKey)判斷,如果有其它node節(jié)點(diǎn)擁有與指定Pod所在的node節(jié)點(diǎn)相同的拓?fù)溆騥ey的標(biāo)簽key和值,那么它們就屬于同一個(gè)拓?fù)溆蛴H和性的策略:
硬策略(required....):要強(qiáng)制性的滿足條件,如果沒(méi)有滿足條件的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)進(jìn)行調(diào)度,即使沒(méi)有滿足條件的node節(jié)點(diǎn),Pod依然會(huì)完成調(diào)度節(jié)點(diǎn)設(shè)置污點(diǎn) taint
kubectl taint node <node名稱> key=[value]:effectNoSchedule(一定不會(huì)被調(diào)度) PreferNoSchedule(盡量不被調(diào)度) NoExecute(不會(huì)被調(diào)度,并驅(qū)逐Pod)kubectl taint node <node名稱> key=[value]:effect --overwritekubectl taint node <node名稱> key[=value:effect]-kubectl describe nodes <node名稱> | grep TaintsPod設(shè)置容忍 toleration
spec:tolerations:- key: 污點(diǎn)鍵名operator: Equal|Existsvalue: 污點(diǎn)鍵值effect: NoSchedule|PreferNoSchedule|NoExecute設(shè)置node節(jié)點(diǎn)不可調(diào)用
kubectl cordon <node名稱>
kubectl uncordon <node名稱>設(shè)置node節(jié)點(diǎn)不可調(diào)用并驅(qū)逐Pod
kubectl drain <node名稱> --ignore-daemonsets --force --delete-emptydir-dataPod的啟動(dòng)過(guò)程:
0)控制器創(chuàng)建Pod副本
1)調(diào)度器scheduler根據(jù)調(diào)度算法選擇一臺(tái)最適合的node節(jié)點(diǎn)調(diào)度Pod
2)kubelet拉取鏡像
3)kubelet掛載存儲(chǔ)卷等
4)kubelet創(chuàng)建并運(yùn)行容器
5)kubelet根據(jù)容器的探針探測(cè)結(jié)果設(shè)置Pod狀態(tài)Pod生命周期的5種狀態(tài)
Pending Pod已經(jīng)創(chuàng)建,但是Pod還處于包括未完成調(diào)度到node節(jié)點(diǎn)的過(guò)程或者還處于在鏡像拉取過(guò)程中、存儲(chǔ)卷掛載失敗的情況
Running Pod所有容器已被創(chuàng)建,且至少有一個(gè)容器正在運(yùn)行
Succeeded Pod所有容器都已經(jīng)成功退出,且不再重啟。(completed)
Failed Pod所有容器都退出,且至少有一個(gè)容器是異常退出的。(error)
Unknown master節(jié)點(diǎn)的controller manager無(wú)法獲取到Pod狀態(tài),通常是因?yàn)閙aster節(jié)點(diǎn)的apiserver與Pod所在node節(jié)點(diǎn)的kubelet通信失聯(lián)導(dǎo)致的(比如kubelet本身出故障)
總結(jié):Pod遵循預(yù)定義的生命周期,起始于Pending階段,如果至少其中有一個(gè)主容器正常運(yùn)行,則進(jìn)入Running階段,之后取決于Pod是否有容器以失敗狀態(tài)退出而進(jìn)入Succeeded或者Failed階段。
9.2 K8s常用故障排錯(cuò)流程/手段
kubectl get pods 查看Pod的運(yùn)行狀態(tài)和就緒狀態(tài)
kubectl describe <資源類型|pods> <資源名稱> 查看資源的詳細(xì)信息和事件描述,主要是針對(duì)沒(méi)有進(jìn)入Running階段的排查手段
kubectl logs <pod名稱> -c <容器名稱> [-p] 查看Pod容器的進(jìn)程日志,主要是針對(duì)進(jìn)入Running階段后的排查手段
kubectl exec -it <pod名稱> -c <容器名稱> sh|bash 進(jìn)入Pod容器查看容器內(nèi)部相關(guān)的(進(jìn)程、端口、文件等)狀態(tài)信息
kubectl debug -it <pod名稱> --image=<臨時(shí)容器的鏡像名> --target=<目標(biāo)容器> 在Pod中創(chuàng)建臨時(shí)容器進(jìn)入目標(biāo)容器進(jìn)行調(diào)試,主要是針對(duì)沒(méi)有調(diào)試工具的容器使用
nsenter -n --target <容器pid> 在Pod容器的宿主機(jī)使用nsenter轉(zhuǎn)換網(wǎng)絡(luò)命名空間,直接在宿主機(jī)進(jìn)入目標(biāo)容器的網(wǎng)絡(luò)命名空間進(jìn)行抓包等調(diào)試kubectl get nodes 查看node節(jié)點(diǎn)運(yùn)行狀態(tài)
kubectl describe nodes 查看node節(jié)點(diǎn)詳細(xì)信息和資源描述
kubectl get cs 查看master組件的健康狀態(tài)
kubectl cluster-info 查看集群信息journalctl -u kubelet -f 跟蹤查看kubelet進(jìn)程日志