目錄
親和性
鍵值運算關(guān)系
硬策略
軟策略
Pod親和性與反親和性
污點(Taint) 和 容忍(Tolerations)
污點(Taint)?
容忍(Tolerations)
維護(hù)操作
故障排除步驟
親和性
官方介紹:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/
(1)節(jié)點親和性
pod.spec.nodeAffinity
●preferredDuringSchedulingIgnoredDuringExecution:軟策略
●requiredDuringSchedulingIgnoredDuringExecution:硬策略
(2)Pod 親和性
pod.spec.affinity.podAffinity/podAntiAffinity
●preferredDuringSchedulingIgnoredDuringExecution:軟策略
●requiredDuringSchedulingIgnoredDuringExecution:硬策略
可以把自己理解成一個Pod,當(dāng)你報名來學(xué)云計算,如果你更傾向去zhangsan老師帶的班級,把不同老師帶的班級當(dāng)作一個node的話,這個就是節(jié)點親和性。如果你是必須要去zhangsan老師帶的班級,這就是硬策略;而你說你想去并且最好能去zhangsan老師帶的班級,這就是軟策略。
如果你有一個很好的朋友叫l(wèi)isi,你傾向和lisi同學(xué)在同一個班級,這個就是Pod親和性。如果你一定要去lisi同學(xué)在的班級,這就是硬策略;而你說你想去并且最好能去lisi同學(xué)在的班級,這就是軟策略。軟策略是不去也可以,硬策略則是不去就不行。
鍵值運算關(guān)系
●In:label 的值在某個列表中 ?pending
●NotIn:label 的值不在某個列表中
●Gt:label 的值大于某個值
●Lt:label 的值小于某個值
●Exists:某個 label 存在
●DoesNotExist:某個 label 不存在
kubectl get nodes --show-labels
硬策略
requiredDuringSchedulingIgnoredDuringExecution? ? ? ?硬策略
mkdir /opt/affinity
cd /opt/affinity
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
? name: affinity
? labels:
? ? app: node-affinity-pod
spec:
? containers:
? - name: with-node-affinity
? ? image: soscscs/myapp:v1
? affinity:
? ? nodeAffinity:
? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? ? nodeSelectorTerms:
? ? ? ? - matchExpressions:
? ? ? ? ? - key: kubernetes.io/hostname ? ?#指定node的標(biāo)簽
? ? ? ? ? ? operator: NotIn ? ? #設(shè)置Pod安裝到kubernetes.io/hostname的標(biāo)簽值不在values列表中的node上
? ? ? ? ? ? values:
? ? ? ? ? ? - node02
kubectl apply -f pod1.yaml
kubectl get pods -o wide
NAME ? ? ? 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)一直會處于 Pending 狀態(tài)。
軟策略
preferredDuringSchedulingIgnoredDuringExecution? 軟策略
vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:
? name: affinity
? labels:
? ? app: node-affinity-pod
spec:
? containers:
? - name: with-node-affinity
? ? image: soscscs/myapp:v1
? affinity:
? ? nodeAffinity:
? ? ? preferredDuringSchedulingIgnoredDuringExecution:
? ? ? - weight: 1 ? #如果有多個軟策略選項的話,權(quán)重越大,優(yōu)先級越高
? ? ? ? preference:
? ? ? ? ? matchExpressions:
? ? ? ? ? - key: kubernetes.io/hostname
? ? ? ? ? ? operator: In
? ? ? ? ? ? values:
? ? ? ? ? ? - node03
kubectl apply -f pod2.yaml
kubectl get pods -o wide
NAME ? ? ? 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,則會優(yōu)先在node01上創(chuàng)建Pod
kubectl delete pod --all && kubectl apply -f pod2.yaml && kubectl get pods -o wide
//如果把硬策略和軟策略合在一起使用,則要先滿足硬策略之后才會滿足軟策略
//示例:
apiVersion: v1
kind: Pod
metadata:
? name: affinity
? labels:
? ? app: node-affinity-pod
spec:
? containers:
? - name: with-node-affinity
? ? image: soscscs/myapp:v1
? affinity:
? ? nodeAffinity:
? ? ? requiredDuringSchedulingIgnoredDuringExecution: ? #先滿足硬策略,排除有kubernetes.io/hostname=node02標(biāo)簽的節(jié)點
? ? ? ? nodeSelectorTerms:
? ? ? ? - matchExpressions:
? ? ? ? ? - key: kubernetes.io/hostname
? ? ? ? ? ? operator: NotIn
? ? ? ? ? ? values:
? ? ? ? ? ? - node02
? ? ? preferredDuringSchedulingIgnoredDuringExecution: ?#再滿足軟策略,優(yōu)先選擇有kgc=a標(biāo)簽的節(jié)點
?? ? ?- weight: 1
? ? ? ? preference:
? ? ? ? ? matchExpressions:
? ? ? ? ? - key: kgc
? ? ? ? ? ? operator: In
? ? ? ? ? ? values:
? ? ? ? ? ? - a
Pod親和性與反親和性
調(diào)度策略 | ?匹配標(biāo)簽 | 操作符? | 拓?fù)溆蛑С?/td> | ?調(diào)度目標(biāo) |
nodeAffinity | ?主機? | In, NotIn, Exists,DoesNotExist, Gt, Lt? | 否 | 指定主機 |
podAffinity | Pod? | In, NotIn, Exists,DoesNotExist | 是 | Pod與指定Pod同一拓?fù)溆?/td> |
podAntiAffinity | Pod | In, NotIn, Exists,DoesNotExist | 是 | Pod與指定Pod不在同一拓?fù)溆?/td> |
kubectl label nodes node01 kgc=a
kubectl label nodes node02 kgc=a
//創(chuàng)建一個標(biāo)簽為 app=myapp01 的 Pod
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
? name: myapp01
? labels:
? ? app: myapp01
spec:
? containers:
? - name: with-node-affinity
? ? image: soscscs/myapp:v1
?? ?
kubectl apply -f pod3.yaml
kubectl get pods --show-labels -o wide
NAME ? ? ?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)建多個 Pod 資源
vim pod4.yaml
apiVersion: v1
kind: Pod
metadata:
? name: myapp02
? labels:
? ? app: myapp02
spec:
? containers:
? - name: myapp02
? ? image: soscscs/myapp:v1
? affinity:
? ? podAffinity:
? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? - labelSelector:
? ? ? ? ? matchExpressions:
? ? ? ? ? - key: app
? ? ? ? ? ? operator: In
? ? ? ? ? ? values:
? ? ? ? ? ? - myapp01
? ? ? ? topologyKey: kgc
?? ??? ?
#僅當(dāng)節(jié)點和至少一個已運行且有鍵為“app”且值為“myapp01”的標(biāo)簽 的 Pod 處于同一拓?fù)溆驎r,才可以將該 Pod 調(diào)度到節(jié)點上。 (更確切的說,如果節(jié)點 N 具有帶有鍵 kgc 和某個值 V 的標(biāo)簽,則 Pod 有資格在節(jié)點 N 上運行,以便集群中至少有一個具有鍵 kgc 和值為 V 的節(jié)點正在運行具有鍵“app”和值 “myapp01”的標(biāo)簽的 pod。)
#topologyKey 是節(jié)點標(biāo)簽的鍵。如果兩個節(jié)點使用此鍵標(biāo)記并且具有相同的標(biāo)簽值,則調(diào)度器會將這兩個節(jié)點視為處于同一拓?fù)溆蛑小?調(diào)度器試圖在每個拓?fù)溆蛑蟹胖脭?shù)量均衡的 Pod。
#如果?kgc?對應(yīng)的值不一樣就是不同的拓?fù)溆?。比?Pod1 在?kgc=a?的 Node 上,Pod2 在?kgc=b?的 Node 上,Pod3 在?kgc=a?的 Node 上,則 Pod2 和 Pod1、Pod3 不在同一個拓?fù)溆颍鳳od1 和 Pod3在同一個拓?fù)溆颉?/p>
kubectl apply -f pod4.yaml
kubectl get pods --show-labels -o wide
NAME ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES ? LABELS
myapp01 ? 1/1 ? ? Running ? 0 ? ? ? ? ?15m ? 10.244.1.3 ? node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp01
myapp02 ? 1/1 ? ? Running ? 0 ? ? ? ? ?8s ? ?10.244.1.4 ? node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp02
myapp03 ? 1/1 ? ? Running ? 0 ? ? ? ? ?52s ? 10.244.2.53 ?node02 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03
myapp04 ? 1/1 ? ? Running ? 0 ? ? ? ? ?44s ? 10.244.1.51 ?node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03
myapp05 ? 1/1 ? ? Running ? 0 ? ? ? ? ?38s ? 10.244.2.54 ?node02 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03
myapp06 ? 1/1 ? ? Running ? 0 ? ? ? ? ?30s ? 10.244.1.52 ?node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03
myapp07 ? 1/1 ? ? Running ? 0 ? ? ? ? ?24s ? 10.244.2.55 ?node02 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03
//使用 Pod 反親和性調(diào)度
示例1:
vim pod5.yaml
apiVersion: v1
kind: Pod
metadata:
? name: myapp10
? labels:
? ? app: myapp10
spec:
? containers:
? - name: myapp10
? ? image: soscscs/myapp:v1
? affinity:
? ? podAntiAffinity:
? ? ? preferredDuringSchedulingIgnoredDuringExecution:
? ? ? - weight: 100
? ? ? ? podAffinityTerm:
? ? ? ? ? labelSelector:
? ? ? ? ? ? matchExpressions:
? ? ? ? ? ? - key: app
? ? ? ? ? ? ? operator: In
? ? ? ? ? ? ? values:
? ? ? ? ? ? ? - myapp01
? ? ? ? ? topologyKey: kubernetes.io/hostname
#如果節(jié)點處于 Pod 所在的同一拓?fù)溆蚯揖哂墟I“app”和值“myapp01”的標(biāo)簽, 則該 pod 不應(yīng)將其調(diào)度到該節(jié)點上。 (如果 topologyKey 為 kubernetes.io/hostname,則意味著當(dāng)節(jié)點和具有鍵 “app”和值“myapp01”的 Pod 處于相同的拓?fù)溆颍琍od 不能被調(diào)度到該節(jié)點上。)
kubectl apply -f pod5.yaml
kubectl get pods --show-labels -o wide
NAME ? ? ?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
myapp02 ? 1/1 ? ? Running ? 0 ? ? ? ? ?29m ? 10.244.1.4 ? node01 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp02
myapp10 ? 1/1 ? ? Running ? 0 ? ? ? ? ?75s ? 10.244.2.4 ? node02 ? <none> ? ? ? ? ? <none> ? ? ? ? ? ?app=myapp03
示例2:
vim pod6.yaml
apiVersion: v1
kind: Pod
metadata:
? name: myapp20
? labels:
? ? app: myapp20
spec:
? containers:
? - name: myapp20
? ? image: soscscs/myapp:v1
? affinity:
? ? podAntiAffinity:
? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? - labelSelector:
? ? ? ? ? matchExpressions:
? ? ? ? ? - key: app
? ? ? ? ? ? operator: In
? ? ? ? ? ? values:
? ? ? ? ? ? - myapp01
? ? ? ? topologyKey: kgc
?? ??? ?
//由于指定 Pod 所在的 node01 節(jié)點上具有帶有鍵 kgc 和標(biāo)簽值 a 的標(biāo)簽,node02 也有這個kgc=a的標(biāo)簽,所以 node01 和 node02 是在一個拓?fù)溆蛑?,反親和要求新 Pod 與指定 Pod 不在同一拓?fù)溆颍孕?Pod 沒有可用的 node 節(jié)點,即為 Pending 狀態(tài)。
kubectl get pod --show-labels -owide
NAME ? ? ? ? ?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
kubectl label nodes node02 kgc=b --overwrite
kubectl get pod --show-labels -o wide
NAME ? ? ? ? ?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
污點(Taint) 和 容忍(Tolerations)
污點(Taint)?
節(jié)點親和性,是Pod的一種屬性(偏好或硬性要求),它使Pod被吸引到一類特定的節(jié)點。Taint 則相反,它使節(jié)點能夠排斥一類特定的 Pod。
Taint 和 Toleration 相互配合,可以用來避免 Pod 被分配到不合適的節(jié)點上。每個節(jié)點上都可以應(yīng)用一個或多個 taint ,這表示對于那些不能容忍這些 taint 的 Pod,是不會被該節(jié)點接受的。如果將 toleration 應(yīng)用于 Pod 上,則表示這些 Pod 可以(但不一定)被調(diào)度到具有匹配 taint 的節(jié)點上。
使用 kubectl taint 命令可以給某個 Node 節(jié)點設(shè)置污點,Node 被設(shè)置上污點之后就和 Pod 之間存在了一種相斥的關(guān)系,可以讓 Node 拒絕 Pod 的調(diào)度執(zhí)行,甚至將 Node 已經(jīng)存在的 Pod 驅(qū)逐出去。
污點的組成格式如下:
key=value:effect
每個污點有一個 key 和 value 作為污點的標(biāo)簽,其中 value 可以為空,effect 描述污點的作用。
當(dāng)前 taint effect 支持如下三個選項:
●NoSchedule:表示 k8s 將不會將 Pod 調(diào)度到具有該污點的 Node 上
●PreferNoSchedule:表示 k8s 將盡量避免將 Pod 調(diào)度到具有該污點的 Node 上
●NoExecute:表示 k8s 將不會將 Pod 調(diào)度到具有該污點的 Node 上,同時會將 Node 上已經(jīng)存在的 Pod 驅(qū)逐出去
kubectl get nodes
NAME ? ? 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
//master 就是因為有 NoSchedule 污點,k8s 才不會將 Pod 調(diào)度到 master 節(jié)點上
kubectl describe node master
......
Taints: ? ? ? ? ? ? node-role.kubernetes.io/master:NoSchedule
#設(shè)置污點
kubectl taint node node01 key1=value1:NoSchedule
#節(jié)點說明中,查找 Taints 字段
kubectl describe node node-name ?
#去除污點
kubectl taint node node01 key1:NoSchedule-
kubectl get pods -o wide
NAME ? ? ?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),會發(fā)現(xiàn) node02 上的 Pod 已經(jīng)被全部驅(qū)逐(注:如果是 Deployment 或者 StatefulSet 資源類型,為了維持副本數(shù)量則會在別的 Node 上再創(chuàng)建新的 Pod)
kubectl get pods -o wide
NAME ? ? ?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è)置了污點的 Node 將根據(jù) taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之間產(chǎn)生互斥的關(guān)系,Pod 將在一定程度上不會被調(diào)度到 Node 上。但我們可以在 Pod 上設(shè)置容忍(Tolerations),意思是設(shè)置了容忍的 Pod 將可以容忍污點的存在,可以被調(diào)度到存在污點的 Node 上。
kubectl taint node node01 check=mycheck:NoExecute
vim pod3.yaml
?
?? ?
kubectl apply -f pod3.yaml
//在兩個 Node 上都設(shè)置了污點后,此時 Pod 將無法創(chuàng)建成功
kubectl 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>
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
? name: myapp01
? labels:
? ? app: myapp01
spec:
? containers:
? - name: with-node-affinity
? ? image: soscscs/myapp:v1
? tolerations:
? - key: "check"
? ? operator: "Equal"
? ? value: "mycheck"
? ? effect: "NoExecute"
? ? tolerationSeconds: 3600
?? ?#其中的 key、vaule、effect 都要與 Node 上設(shè)置的 taint 保持一致
#operator 的值為 Exists 將會忽略 value 值,即存在即可
#tolerationSeconds 用于描述當(dāng) Pod 需要被驅(qū)逐時可以在 Node 上繼續(xù)保留運行的時間
kubectl apply -f pod3.yaml
//在設(shè)置了容忍之后,Pod 創(chuàng)建成功
kubectl get pods -o wide
NAME ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? NOMINATED NODE ? READINESS GATES
myapp01 ? 1/1 ? ? Running ? 0 ? ? ? ? ?10m ? 10.244.1.5 ? node01 ? <none> ? ? ? ? ? <none>
//其它注意事項
(1)當(dāng)不指定 key 值時,表示容忍所有的污點 key
? tolerations:
? - operator: "Exists"
??
(2)當(dāng)不指定 effect 值時,表示容忍所有的污點作用
? tolerations:
? - key: "key"
? ? operator: "Exists"
(3)有多個 Master 存在時,防止資源浪費,可以如下設(shè)置
kubectl taint node Master-Name node-role.kubernetes.io/master=:PreferNoSchedule
//如果某個 Node 更新升級系統(tǒng)組件,為了防止業(yè)務(wù)長時間中斷,可以先在該 Node 設(shè)置 NoExecute 污點,把該 Node 上的 Pod 都驅(qū)逐出去
kubectl taint node node01 check=mycheck:NoExecute
//此時如果別的 Node 資源不夠用,可臨時給 Master 設(shè)置 PreferNoSchedule 污點,讓 Pod 可在 Master 上臨時創(chuàng)建
kubectl taint node master node-role.kubernetes.io/master=:PreferNoSchedule
//待所有 Node 的更新操作都完成后,再去除污點
kubectl taint node node01 check=mycheck:NoExecute-
維護(hù)操作
//cordon 和 drain
##對節(jié)點執(zhí)行維護(hù)操作:
kubectl get nodes
//將 Node 標(biāo)記為不可調(diào)度的狀態(tài),這樣就不會讓新創(chuàng)建的 Pod 在此 Node 上運行
kubectl cordon <NODE_NAME> ?? ??? ? #該node將會變?yōu)镾chedulingDisabled狀態(tài)
//kubectl drain 可以讓 Node 節(jié)點開始釋放所有 pod,并且不接收新的 pod 進(jìn)程。drain 本意排水,意思是將出問題的 Node 下的 Pod 轉(zhuǎn)移到其它 Node 下運行
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-local-data --force
--ignore-daemonsets:無視 DaemonSet 管理下的 Pod。
--delete-local-data:如果有 mount local volume 的 pod,會強制殺掉該 pod。
--force:強制釋放不是控制器管理的 Pod,例如 kube-proxy。
注:執(zhí)行 drain 命令,會自動做了兩件事情:
(1)設(shè)定此 node 為不可調(diào)度狀態(tài)(cordon)
(2)evict(驅(qū)逐)了 Pod
//kubectl uncordon 將 Node 標(biāo)記為可調(diào)度的狀態(tài)
kubectl uncordon <NODE_NAME>
//Pod啟動階段(相位 phase)
Pod 創(chuàng)建完之后,一直到持久運行起來,中間有很多步驟,也就有很多出錯的可能,因此會有很多不同的狀態(tài)。
一般來說,pod 這個過程包含以下幾個步驟:
(1)調(diào)度到某臺 node 上。kubernetes 根據(jù)一定的優(yōu)先級算法選擇一臺 node 節(jié)點將其作為 Pod 運行的 node
(2)拉取鏡像
(3)掛載存儲配置等
(4)運行起來。如果有健康檢查,會根據(jù)檢查的結(jié)果來設(shè)置其狀態(tài)。
phase 的可能狀態(tài)有:
●Pending:表示APIServer創(chuàng)建了Pod資源對象并已經(jīng)存入了etcd中,但是它并未被調(diào)度完成(比如還沒有調(diào)度到某臺node上),或者仍然處于從倉庫下載鏡像的過程中。
●Running:Pod已經(jīng)被調(diào)度到某節(jié)點之上,并且Pod中所有容器都已經(jīng)被kubelet創(chuàng)建。至少有一個容器正在運行,或者正處于啟動或者重啟狀態(tài)(也就是說Running狀態(tài)下的Pod不一定能被正常訪問)。
●Succeeded:有些pod不是長久運行的,比如job、cronjob,一段時間后Pod中的所有容器都被成功終止,并且不會再重啟。需要反饋任務(wù)執(zhí)行的結(jié)果。
●Failed:Pod中的所有容器都已終止了,并且至少有一個容器是因為失敗終止。也就是說,容器以非0狀態(tài)退出或者被系統(tǒng)終止,比如 command 寫的有問題。
●Unknown:表示無法讀取 Pod 狀態(tài),通常是 kube-controller-manager 無法與 Pod 通信。
故障排除步驟
//查看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.zghlxwxcb.cn/news/detail-741553.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-741553.html
到了這里,關(guān)于k8s之親和性、污點的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!