九、K8s污點和容忍

九、K8s污點和容忍

文章目錄

  • 九、K8s污點和容忍
    • 1、污點(Taint)和容忍(Toleration)
      • 1.1 什么是污點(Taint)?
      • 1.2 什么是容忍(Toleration)?
      • 1.3 污點的影響效果(Effect)
      • 1.4 污點配置解析
      • 1.5 常見內置污點
    • 2、污點的增刪改查
      • 2.1 添加污點
      • 2.2 修改污點
      • 2.3 查詢污點
      • 2.4 刪除污點
    • 3、污點和容忍使用場景實戰
      • 3.1 K8s 主節點禁止調度
      • 3.2 K8s 新節點禁止調度
      • 3.3 K8s 節點維護流程
      • 3.4 K8s 節點特殊資源保留
      • 3.5 使用容忍調度到具有污點的節點
      • 3.6 K8s 專用節點隔離
      • 3.7 節點宕機快速恢復服務
    • 4、常見問題
      • 4.1 什么是污點和容忍?它們的作用是什么?
      • 4.2 在K8s集群中如何劃分不同的租戶?
      • 4.3 污點和容忍有哪些使用的場景?

1、污點(Taint)和容忍(Toleration)

污點和容忍是K8s提供的一種強大的調度控制機制,可以實現資源的精細化管理和調度優化。

污點用于標記節點,容忍用于控制Pod的調度行為。常用于節點維護、資源隔離、故障恢復、故障隔離等場景。

1.1 什么是污點(Taint)?

污點作用于節點,主要用于標記節點的屬性或者狀態,實現在默認情況下可以讓Pod無法調度到這些標記了污點到節點上。


使用場景:

  • 節點維護
  • 資源隔離
  • 故障恢復
  • 故障隔離

1.2 什么是容忍(Toleration)?

容忍作用于Pod,主要用來讓Pod可以接受某個污點的限制,也就是讓某些Pod容忍節點上配置的污點,可以讓一些需要特殊配置的Pod能夠調用到具有污點和特殊資源的節點上。

污點和容忍相互配合,可以用來避免Pod被分配到不合適到節點上。

1.3 污點的影響效果(Effect)

  • NoSchedule:禁止調度Pod到該節點上,但是已經運行在該節點到服務不受影響。適用于資源隔離和節點維護的場景。
  • NoExecute:禁止調度Pod到該節點上,同時已經運行在該節點上的Pod也會被驅逐(終止并重新調度)。適用于節點故障、緊急維護和故障快速恢復的場景。
  • PreferNoSchedule:類似于NoSchedule。但不是一個硬性限制,調度器會盡量避免將新的Pod調度到這個節點上,但如果其他節點都不滿足條件,Pod仍然會被調度到這個節點上。適用于軟性資源隔離的場景。

1.4 污點配置解析

可以使用kubectl給指定的節點添加污點,添加污點需要使用kubectl的taint指令。

命令格式:kubectl taint node NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT

1、比如給GPU機器添加一個特殊資源的污點(一個節點可以有多個污點):

kubectl taint node gpu-node01 gpu=true:NoSchedule

2、查看一個節點的污點:

kubectl get node k8s-node01 -o go-template --template {{.spec.taints}}
kubectl describe node k8s-node01 | grep Taints -A 10

3、刪除污點(和label類似):

基于Key刪除:kubectl taint nodes k8s-node01 ssd-
基于Key+Effect刪除:kubectl taint nodes k8s-node01 ssd:PreferNoSchedule-
機遇完整格式刪除:kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule-

4、修改污點(Key和Effect相同):

kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule --overwrite

1.5 常見內置污點

  • node.kubernetes.io/not-ready:節點未準備好,相當于節點狀態Ready的值為False
  • node.kubernetes.io/unreachable:Node Controller訪問不到節點,相當于節點狀態Ready的值為UnKnown
  • node.kubernetes.io/out-of-disk:節點磁盤耗盡
  • node.kubernetes.io/memory-pressure:節點存在內存壓力
  • node.kubernetes.io/disk-pressure:節點存在磁盤壓力
  • node.kubernetes.io/pid-pressure:節點存在PID壓力
  • node.kubernetes.io/network-unavailable:節點網絡不可達
  • node.kubernetes.io/unschedulable:節點不可調度

2、污點的增刪改查

# 查看目前pod安裝情況
[root@k8s-master01 ~]# kubectl get pod -owide
NAME                     READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
nginx-67bfb68c7d-9b6jb   1/1     Running   0          57s   172.16.32.130   k8s-master01   <none>           <none>
nginx-67bfb68c7d-9t2k9   1/1     Running   0          57s   172.16.85.202   k8s-node01     <none>           <none>
nginx-67bfb68c7d-k4d8k   1/1     Running   0          57s   172.16.32.129   k8s-master01   <none>           <none>
nginx-67bfb68c7d-m7lh8   1/1     Running   0          57s   172.16.85.203   k8s-node01     <none>           <none>
nginx-67bfb68c7d-q7jhj   1/1     Running   0          57s   172.16.58.229   k8s-node02     <none>           <none>

2.1 添加污點

# 添加一個污點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint01=taintvalue01:NoSchedule# 添加NoSchedule,實際上pod部署情況未受到任何影響
[root@k8s-master01 ~]# kubectl get pod -owide
NAME                     READY   STATUS    RESTARTS   AGE    IP              NODE           NOMINATED NODE   READINESS GATES
nginx-67bfb68c7d-9b6jb   1/1     Running   0          2m6s   172.16.32.130   k8s-master01   <none>           <none>
nginx-67bfb68c7d-9t2k9   1/1     Running   0          2m6s   172.16.85.202   k8s-node01     <none>           <none>
nginx-67bfb68c7d-k4d8k   1/1     Running   0          2m6s   172.16.32.129   k8s-master01   <none>           <none>
nginx-67bfb68c7d-m7lh8   1/1     Running   0          2m6s   172.16.85.203   k8s-node01     <none>           <none>
nginx-67bfb68c7d-q7jhj   1/1     Running   0          2m6s   172.16.58.229   k8s-node02     <none>           <none>
# 添加一個同名不同影響度的污點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint01=taintvalue01:NoExecute# 添加NoExecute,k8s-node01上面的pod受到了驅逐
[root@k8s-master01 ~]# kubectl get pod -owide
NAME                     READY   STATUS    RESTARTS   AGE     IP              NODE           NOMINATED NODE   READINESS GATES
nginx-67bfb68c7d-9b6jb   1/1     Running   0          3m15s   172.16.32.130   k8s-master01   <none>           <none>
nginx-67bfb68c7d-k4d8k   1/1     Running   0          3m15s   172.16.32.129   k8s-master01   <none>           <none>
nginx-67bfb68c7d-pqt9f   1/1     Running   0          17s     172.16.58.230   k8s-node02     <none>           <none>
nginx-67bfb68c7d-q7jhj   1/1     Running   0          3m15s   172.16.58.229   k8s-node02     <none>           <none>
nginx-67bfb68c7d-xbnnh   1/1     Running   0          17s     172.16.32.131   k8s-master01   <none>           <none>
# 添加一個不包含 value 的污點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint02:NoSchedule# 同時添加多個污點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint03=taint03:NoSchedule taint04=taint04:PreferNoSchedule# 同時添加多個節點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint03=taintvalue03:NoSchedule --overwrite# 同時添加所有節點(也可以基于 Label):
[root@k8s-master01 ~]# kubectl taint node taint06=taint06:NoSchedule --all

2.2 修改污點

修改 value:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint03=taintvalue03:NoSchedule --overwrite修改 effect:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint03=taintvalue03:PreferNoSchedule --overwrite

2.3 查詢污點

# 查詢 k8s-node01 的污點(推薦):
# 首先查看某個節點的污點列表:
[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10
Taints:             taint01=taintvalue01:NoExecutetaint01=taintvalue01:NoScheduletaint02:NoScheduletaint03=taintvalue03:NoScheduletaint05=taint05:NoScheduletaint06=taint06:NoScheduletaint03=taintvalue03:PreferNoScheduletaint04=taint04:PreferNoSchedule
Unschedulable:      false
Lease:HolderIdentity:  k8s-node01
# 查詢所有節點的污點:
# kubectl get nodes -o json | jq '.items[].spec.taints'# 也可以用如下命令:
[root@k8s-master01 ~]# kubectl describe node | grep Taints
Taints:             taint06=taint06:NoSchedule
Taints:             taint01=taintvalue01:NoExecute
Taints:             taint05=taint05:NoSchedule

2.4 刪除污點

# 基于 Key 刪除
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint01-# 會刪除所有同名的污點
[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10
Taints:             taint02:NoScheduletaint03=taintvalue03:NoScheduletaint05=taint05:NoScheduletaint06=taint06:NoScheduletaint03=taintvalue03:PreferNoScheduletaint04=taint04:PreferNoSchedule
Unschedulable:      false
Lease:HolderIdentity:  k8s-node01AcquireTime:     <unset>RenewTime:       Mon, 23 Jun 2025 23:16:27 +0800
# 基于 Key 和 Effect 刪除:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint05:NoSchedule-[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10
Taints:             taint02:NoScheduletaint03=taintvalue03:NoScheduletaint06=taint06:NoScheduletaint03=taintvalue03:PreferNoScheduletaint04=taint04:PreferNoSchedule
Unschedulable:      false
Lease:HolderIdentity:  k8s-node01AcquireTime:     <unset>RenewTime:       Mon, 23 Jun 2025 23:22:14 +0800
Conditions:
# 基于完整格式刪除:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint06=taint06:NoSchedule-[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10
Taints:             taint02:NoScheduletaint03=taintvalue03:NoScheduletaint03=taintvalue03:PreferNoScheduletaint04=taint04:PreferNoSchedule
Unschedulable:      false
Lease:HolderIdentity:  k8s-node01AcquireTime:     <unset>RenewTime:       Mon, 23 Jun 2025 23:22:45 +0800
Conditions:Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message

3、污點和容忍使用場景實戰

# 查看目前pod安裝情況
[root@k8s-master01 ~]# kubectl get po -owide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
nginx-67bfb68c7d-4gr4l   1/1     Running   0          21s   192.168.58.218   k8s-node02   <none>           <none>
nginx-67bfb68c7d-52m46   1/1     Running   0          21s   192.168.85.197   k8s-node01   <none>           <none>
nginx-67bfb68c7d-94bzk   1/1     Running   0          21s   192.168.85.198   k8s-node01   <none>           <none>
nginx-67bfb68c7d-fvhvl   1/1     Running   0          21s   192.168.58.217   k8s-node02   <none>           <none>
nginx-67bfb68c7d-kz95c   1/1     Running   0          21s   192.168.85.196   k8s-node01   <none>           <none>

3.1 K8s 主節點禁止調度

# 在生產環境中,Kubernetes 的主節點除了部署系統組件外,不推薦再部署任何服務,此時可以通過添加污點來禁止調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 node-role.kubernetes.io/control-plane:NoSchedule# 也可以添加 NoExecute 類型的污點,此時不容忍該污點的 Pod 會被驅逐重建:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 node-role.kubernetes.io/control-plane:NoExecute# 使用如下命令可以查看正在被驅逐重建的 Pod:
# [root@k8s-master01 ~]# kubectl get po -A -owide | grep k8s-node01 | grep -v Running
NAME                     READY   STATUS              RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
nginx-67bfb68c7d-52m46   0/1     Completed           0          2m39s   192.168.85.197   k8s-node01   <none>           <none>
nginx-67bfb68c7d-94bzk   0/1     Completed           0          2m39s   192.168.85.198   k8s-node01   <none>           <none>
nginx-67bfb68c7d-kz95c   0/1     Completed           0          2m39s   192.168.85.196   k8s-node01   <none>           <none>

3.2 K8s 新節點禁止調度

# 當 Kubernetes 集群添加新節點時,通常情況下不會立即調度 Pod 到該節點,需要經過完整的可用性測試之后才可以調度 Pod,此時也可以使用污點先臨時禁止該節點的調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 new-node=true:NoSchedule# 同樣的道理,比如在禁止調度之前已經有 Pod 部署在該節點,可以進行驅逐:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 new-node=true:NoExecute# 待新節點測試完畢后,在允許該節點可以進行調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 new-node-

3.3 K8s 節點維護流程

當 Kubernetes 的節點需要進行下線維護時,此時需要先把該節點的服務進行驅逐和重新調度。

此時需要根據實際情況判斷是直接驅逐還是選擇重新調度,比如某個 Pod 只有一個副本,或者某個服務比較重要,就不能直接進行驅逐,而是需要先把節點關閉調度,然后在進行服務的重新部署。

# 已知 counter 是個比較重要的服務
[root@k8s-master01 ~]# kubectl get po -owide
NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
counter-6c77464d64-pgv52   1/1     Running   0          6s    192.168.85.202   k8s-node01   <none>           <none>
nginx-7f69b557bf-4z6rx     1/1     Running   0          44s   192.168.58.223   k8s-node02   <none>           <none>
nginx-7f69b557bf-j99hg     1/1     Running   0          44s   192.168.85.201   k8s-node01   <none>           <none>
nginx-7f69b557bf-vvc66     1/1     Running   0          47s   192.168.85.199   k8s-node01   <none>           <none>
nginx-7f69b557bf-wkgwz     1/1     Running   0          47s   192.168.58.222   k8s-node02   <none>           <none>
nginx-7f69b557bf-wwglg     1/1     Running   0          46s   192.168.85.200   k8s-node01   <none>           <none>
# 關閉維護節點的調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 maintain:NoSchedule# 重新觸發某個服務的部署:
[root@k8s-master01 ~]# kubectl rollout restart deploy counter# 再次查看該服務:
[root@k8s-master01 ~]# kubectl get po -owide
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
counter-5657b64789-d5f27   1/1     Running   0          5s      192.168.58.224   k8s-node02   <none>           <none>
....
# 接下來沒有重要服務,即可對該節點的 Pod 進行驅逐:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 maintain:NoExecute[root@k8s-master01 ~]# kubectl get po -owide
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
counter-5657b64789-d5f27   1/1     Running   0          4m54s   192.168.58.224   k8s-node02   <none>           <none>
nginx-7f69b557bf-4z6rx     1/1     Running   0          7m59s   192.168.58.223   k8s-node02   <none>           <none>
nginx-7f69b557bf-8qmdj     1/1     Running   0          3s      192.168.58.227   k8s-node02   <none>           <none>
nginx-7f69b557bf-ds2gx     1/1     Running   0          3s      192.168.58.226   k8s-node02   <none>           <none>
nginx-7f69b557bf-lkssx     1/1     Running   0          3s      192.168.58.225   k8s-node02   <none>           <none>
nginx-7f69b557bf-wkgwz     1/1     Running   0          8m2s    192.168.58.222   k8s-node02   <none>           <none># 驅逐后,即可按照預期進行對節點進行維護,維護完成以后,可以刪除污點,恢復調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 maintain-
# 除了自定義污點,也可以使用 kubectl 快捷指令將節點設置為維護狀態:
# 將節點標記為不可調度狀態
[root@k8s-master01 ~]# kubectl cordon k8s-node02# 此時節點會被標記一個 SchedulingDisabled 狀態,但是已經運行在該節點的 Pod 不收影響:
[root@k8s-master01 ~]# kubectl get node
NAME           STATUS                     ROLES           AGE   VERSION
k8s-master01   Ready                      control-plane   14d   v1.32.5
k8s-node01     Ready                      <none>          14d   v1.32.5
k8s-node02     Ready,SchedulingDisabled   <none>          14d   v1.32.5# 驅逐 k8s-node02 上面的服務:
[root@k8s-master01 ~]# kubectl drain k8s-node02 --ignore-daemonsets --delete-emptydir-data
node/k8s-node02 already cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-f29nz, kube-system/kube-proxy-29d22
evicting pod kubernetes-dashboard/kubernetes-dashboard-778584b9dd-wnt2n
evicting pod krm/krm-backend-6ff5c5f58c-vsnb2
evicting pod default/counter-5657b64789-d5f27
evicting pod default/nginx-7f69b557bf-4z6rx
evicting pod default/nginx-7f69b557bf-8qmdj
evicting pod default/nginx-7f69b557bf-ds2gx
evicting pod default/nginx-7f69b557bf-lkssx
evicting pod default/nginx-7f69b557bf-wkgwz
evicting pod kube-system/coredns-76fccbbb6b-jkhb2
evicting pod krm/krm-frontend-588ffd677b-h96qv
evicting pod kube-system/calico-kube-controllers-6f497d8478-5qs7t
evicting pod kube-system/metrics-server-57954884df-g67bw
evicting pod kube-system/coredns-76fccbbb6b-t97mm
evicting pod kubernetes-dashboard/dashboard-metrics-scraper-69b4796d9b-n5jvb
I0624 17:35:21.743891   11434 request.go:729] Waited for 1.057860177s due to client-side throttling, not priority and fairness, request: GET:https://172.16.20.10:6443/api/v1/namespaces/default/pods/nginx-7f69b557bf-lkssx
pod/krm-frontend-588ffd677b-h96qv evicted
pod/nginx-7f69b557bf-ds2gx evicted
pod/nginx-7f69b557bf-4z6rx evicted
pod/nginx-7f69b557bf-lkssx evicted
pod/nginx-7f69b557bf-wkgwz evicted
pod/counter-5657b64789-d5f27 evicted
pod/nginx-7f69b557bf-8qmdj evicted
pod/krm-backend-6ff5c5f58c-vsnb2 evicted
pod/metrics-server-57954884df-g67bw evicted
pod/coredns-76fccbbb6b-t97mm evicted
pod/coredns-76fccbbb6b-jkhb2 evicted
pod/kubernetes-dashboard-778584b9dd-wnt2n evicted
pod/dashboard-metrics-scraper-69b4796d9b-n5jvb evicted
pod/calico-kube-controllers-6f497d8478-5qs7t evicted
node/k8s-node02 drained# 恢復節點:
[root@k8s-master01 ~]# kubectl uncordon k8s-node02

3.4 K8s 節點特殊資源保留

# 當 Kubernetes 中存儲特殊節點時,應該盡量保持不要特殊資源的 Pod 不要調度到這些節點上,此時可以通過污點進行控制。
# 比如包含了 GPU 的節點不能被任意調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 gpu=true:NoSchedule# 具有其它特殊資源,盡量不要調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 ssd=true:PreferNoSchedule

3.5 使用容忍調度到具有污點的節點

在生產環境中,經常根據實際情況給節點打上污點,比如特殊資源節點不能隨意調度、主節點不能隨意調度,但是需要特殊資源的服務還是需要調度到該節點,一些監控和收集的服務還是需要調度到主節點,此時需要給這些服務添加合適的容忍才能部署到這些節點

比如上述添加的 GPU 污點:kubectl taint node k8s-node01 gpu=true:NoSchedule

# 創建幾個pod測試一下調度
[root@k8s-master01 ~]# kubectl create deploy nginx --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stable --replicas=5# 沒有一個pod在k8s-node01上面
[root@k8s-master01 ~]# kubectl get po -owide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
nginx-67bfb68c7d-5ghm5   1/1     Running   0          25s   192.168.58.223   k8s-node02   <none>           <none>
nginx-67bfb68c7d-6p5l5   1/1     Running   0          25s   192.168.58.222   k8s-node02   <none>           <none>
nginx-67bfb68c7d-k5fg6   1/1     Running   0          25s   192.168.58.225   k8s-node02   <none>           <none>
nginx-67bfb68c7d-rvlp8   1/1     Running   0          25s   192.168.58.224   k8s-node02   <none>           <none>
nginx-67bfb68c7d-s48vx   1/1     Running   0          25s   192.168.58.226   k8s-node02   <none>           <none>
# 如果某個服務需要 GPU 資源,就需要添加容忍才能部署至該節點。此時可以添加如下的容忍配置至 Pod 上:
[root@k8s-master01 ~]# vim gpu-example.yaml 
[root@k8s-master01 ~]# cat gpu-example.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: gpu-examplename: gpu-example
spec:replicas: 1selector:matchLabels:app: gpu-exampletemplate:metadata:labels:app: gpu-examplespec:nodeSelector:     # 加一個標簽,強制落在這個標簽上gpu: "true"tolerations:      # 如果某個服務需要 GPU 資源,就需要添加容忍才能部署至該節點。此時可以添加如下的容忍配置至 Pod 上- key: "gpu"operator: "Exists"effect: "NoSchedule"containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stablename: nginx# 給k8s-node01加一個標簽
[root@k8s-master01 ~]# kubectl label node k8s-node01 gpu=true# 啟動 
[root@k8s-master01 ~]# kubectl create -f gpu-example.yaml # 節點調度到了k8s-node01
[root@k8s-master01 ~]# kubectl get po -owide
NAME                         READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
gpu-example-d87d7969-4tmx5   1/1     Running   0          2m11s   192.168.85.196   k8s-node01   <none>           <none>

3.6 K8s 專用節點隔離

一個 Kubernetes 集群,很常見會有一些專用的節點,比如 ingress、gateway、storage 或者多租戶環境等。這些節點通常不建議和其他服務交叉使用,所以需要利用污點和容忍將這些節點隔離起來。

# 已知pod部署情況
[root@k8s-master01 ~]# kubectl get pod -owide
NAME                             READY   STATUS    RESTARTS   AGE     IP              NODE         NOMINATED NODE   READINESS GATES
ingress-nginx-78c5595744-6qw5s   1/1     Running   0          2m14s   172.16.85.196   k8s-node01   <none>           <none>
ingress-nginx-78c5595744-78qc9   1/1     Running   0          2m14s   172.16.58.219   k8s-node02   <none>           <none>
ingress-nginx-78c5595744-8mgjk   1/1     Running   0          2m14s   172.16.85.197   k8s-node01   <none>           <none>
# 比如選擇一批節點作為 ingress 入口的節點
[root@k8s-master01 ~]# kubectl label node k8s-node02 ingress=true# 添加一個污點,不讓其他服務部署
[root@k8s-master01 ~]# kubectl taint node k8s-node02 ingress=true:NoSchedule# 更改 Ingress 的部署資源,添加容忍和節點選擇器:
# kubectl edit ds -n ingress-nginx
....spec:nodeSelector:ingress: "true"kubernetes.io/os: linuxtolerations:- key: ingressoperator: Existseffect: NoSchedulecontainers:
....# pod全落在了K8s-node02上面
[root@k8s-master01 ~]# kubectl get pod -owideNAME                             READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
ingress-nginx-69fbf8f7d9-2xmbs   1/1     Running   0          5s    172.16.58.228   k8s-node02   <none>           <none>
ingress-nginx-69fbf8f7d9-4c229   1/1     Running   0          12s   172.16.58.226   k8s-node02   <none>           <none>
ingress-nginx-69fbf8f7d9-68m2l   1/1     Running   0          8s    172.16.58.227   k8s-node02   <none>  

3.7 節點宕機快速恢復服務

當 Kubernetes 集群中有節點故障時,Kubernetes 會自動恢復故障節點上的服務,但是默認情況下,節點故障時五分鐘才會重新調度服務,此時可以利用污點的 tolerationSeconds 快速恢復服務。

[root@k8s-master01 ~]# vim ingress-nginx.yaml 
[root@k8s-master01 ~]# cat ingress-nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: ingress-nginxname: ingress-nginx
spec:replicas: 1selector:matchLabels:app: ingress-nginxtemplate:metadata:labels:app: ingress-nginxspec:tolerations:- key: node.kubernetes.io/unreachableoperator: Existseffect: NoExecutetolerationSeconds: 10- key: node.kubernetes.io/not-readyoperator: Existseffect: NoExecutetolerationSeconds: 10containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stablename: nginx[root@k8s-master01 ~]# kubectl create -f ingress-nginx.yaml 
[root@k8s-master01 ~]# kubectl get pod -owide
NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
ingress-nginx-587f84dccd-bkhbp   1/1     Running   0          6s    172.16.85.199   k8s-node01   <none>           <none>
ingress-nginx-587f84dccd-g7zcr   1/1     Running   0          6s    172.16.58.230   k8s-node02   <none>           <none>
ingress-nginx-587f84dccd-k7m2b   1/1     Running   0          6s    172.16.85.200   k8s-node01   <none>           <none>
ingress-nginx-587f84dccd-wgd46   1/1     Running   0          6s    172.16.58.229   k8s-node02   <none>           <none>
ingress-nginx-587f84dccd-wl28v   1/1     Running   0          42s   172.16.85.198   k8s-node01   <none>           <none>
模擬K8s-node01宕機
[root@k8s-node01 ~]# shutdown -h 0[root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS     ROLES           AGE   VERSION
k8s-master01   Ready      control-plane   22d   v1.32.5
k8s-node01     NotReady   <none>          22d   v1.32.5
k8s-node02     Ready      <none>          22d   v1.32.5# 10s后K8s-node01上的機器被驅逐走
[root@k8s-master01 ~]# kubectl get pod -owide
NAME                             READY   STATUS        RESTARTS   AGE     IP              NODE         NOMINATED NODE   READINESS GATES
ingress-nginx-587f84dccd-bhzwr   1/1     Running       0          62s     172.16.58.231   k8s-node02   <none>           <none>
ingress-nginx-587f84dccd-bkhbp   1/1     Terminating   0          3m6s    172.16.85.199   k8s-node01   <none>           <none>
ingress-nginx-587f84dccd-dndbn   1/1     Running       0          62s     172.16.58.233   k8s-node02   <none>           <none>
ingress-nginx-587f84dccd-g7zcr   1/1     Running       0          3m6s    172.16.58.230   k8s-node02   <none>           <none>
ingress-nginx-587f84dccd-k7m2b   1/1     Terminating   0          3m6s    172.16.85.200   k8s-node01   <none>           <none>
ingress-nginx-587f84dccd-ns9b7   1/1     Running       0          62s     172.16.58.232   k8s-node02   <none>           <none>
ingress-nginx-587f84dccd-wgd46   1/1     Running       0          3m6s    172.16.58.229   k8s-node02   <none>           <none>
ingress-nginx-587f84dccd-wl28v   1/1     Terminating   0          3m42s   172.16.85.198   k8s-node01   <none>           <none>

4、常見問題

4.1 什么是污點和容忍?它們的作用是什么?

污點是應用與節點的一種屬性,用于排斥某些Pod。節點上的污點會阻止任何沒有相應容忍的Pod調度到該節點上。容忍是應用與Pod的一種屬性,允許Pod被調度到具有特定污點的節點上,通過在Pod的規范中添加容忍,Pod可以忽略節點上的污點。

4.2 在K8s集群中如何劃分不同的租戶?

首先根據節點劃分標簽組,之后根據標簽配置污點,最后給不同租戶添加不同的節點選擇器和容忍。

4.3 污點和容忍有哪些使用的場景?

故障隔離、故障恢復、資源隔離、專用節點隔離、多租戶多環境隔離、節點平滑維護與下線等。


此博客來源于:https://edu.51cto.com/lecturer/11062970.html

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

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

相關文章

基于開源AI智能名片鏈動2+1模式S2B2C商城小程序的超級文化符號構建路徑研究

摘要&#xff1a;在數字技術重構文化傳播生態的背景下&#xff0c;超級文化符號的塑造已突破傳統IP運營框架。本文以開源AI智能名片鏈動21模式與S2B2C商城小程序的融合創新為切入點&#xff0c;結合"嶼光生活"體驗館、快手燒烤攤主等典型案例&#xff0c;提出"技…

QT 日志 - qInstallMessageHandler將qDebug()打印內容輸出到文件

在編程開發中&#xff0c;日志功能至關重要&#xff0c;對于在開發期間或者是程序上線后&#xff0c;都有助于排查問題&#xff1b; 對于C/C和QT方向&#xff0c;日志庫有log4cpp、plog、log4qt等&#xff0c;本篇文章將使用qt自帶的日志方式去實現。 定義日志函數&#xff1a…

記錄一下seata啟動403問題

1.現象&#xff1a;啟動報錯可能是403&#xff0c;或是是密碼錯誤一般是nacos加了認證&#xff0c;seata配置nacos賬號密碼的時候就啟動不了。可能是密碼錯誤&#xff0c;最有可能是seata版本太低導致的。1.4.2以及一下的版本應該都有這個問題2.問題密碼不能有特殊符號如&#…

【STM32實踐篇】:GPIO 詳解

文章目錄GPIO 基本結構GPIO 工作模式GPIO 基本結構 右邊的紅框是I/O引腳&#xff0c;這個I/O引腳就是我們可以看到的芯片實物的引腳&#xff0c;其他部分都是GPIO的內部結構。 保護二極管 上方二極管用于防過壓保護&#xff0c;當I/O引腳電壓高于 V_DD 二極管導通壓降?時&…

#include

關于 C 中的 include <>和 include “” 這兩種形式&#xff0c;區別其實是關于“搜索路徑”和“優先級”的。讓我詳細為你講解。 1. 簡單區別總結 #include <header>&#xff1a;告訴編譯器去“系統標準目錄”或“預定義的標準路徑”中查找頭文件&#xff08;比如…

永磁同步電機參數辨識算法--帶遺忘因子的遞推最小二乘法辨識

一、原理介紹之前已經介紹了遞推最小二乘法進行電氣參數辨識&#xff0c;在實時參數辨識中&#xff0c;協方差矩陣P和增益矩陣K是用于更新參數估計的重要工具&#xff0c;而系統參數變化時&#xff0c;P、K矩陣會逐漸減小&#xff0c;導致數據飽和。數據飽和與參數遲滯是實時參…

JVM 知識點

一、JVM 概述JVM&#xff08;Java Virtual Machine&#xff09;即 Java 虛擬機&#xff0c;它是 Java 編程語言的核心組件之一&#xff0c;負責執行 Java 程序。JVM 使得 Java 程序可以實現“一次編寫&#xff0c;到處運行”的特性&#xff0c;因為它提供了一個抽象的運行環境&…

windows裝機

1、制作啟動盤 2、制作啟動盤 啟動盤中含有WinPE系統和ISO 3、從U盤啟動&#xff0c;加載ISO 4、執行ISO中的setup安裝win10 5、之后從C盤啟動進入win10系統 6、安裝“華為電腦管家”,安裝驅動 華為電腦管家官方下載-筆記本驅動更新 | 華為官網 7、下載安裝必要軟件 https://…

提示技術系列(13)——ReAct

什么是提示技術&#xff1f; 提示技術是實現提示工程目標的具體技術手段&#xff0c;是提示工程中的“工具庫”。 什么又是提示工程&#xff1f; 提示工程是指通過設計、優化和迭代輸入到大語言模型&#xff08;LLM&#xff09;的提示&#xff08;Prompt&#xff09;&#xff…

【SVO】klt與極限搜索塊匹配findEpipolarMatchDirect

Matcher::findEpipolarMatchDirect 函數邏輯與原理分析 核心目標&#xff1a; 在極線上搜索參考幀特征點 ref_ftr 在當前幀 cur_frame 中的最佳匹配點&#xff0c;并通過三角化計算深度。 關鍵步驟解析&#xff1a; 1. 極線端點計算&#xff1a; const BearingVector A T_…

C 語言基礎入門:基本數據類型與運算符詳解

一、基本數據類型C 語言提供了豐富的基本數據類型&#xff0c;用于存儲不同類型的數據&#xff0c;主要包括整數類型、浮點類型和布爾類型。1. 整數類型整數類型用于存儲整數&#xff0c;根據是否帶符號以及占用存儲空間的不同&#xff0c;可進一步細分&#xff1a;類型名占用存…

應用在核電行業的虛擬現實解決方案

核能領域正處于創新與責任的交匯點。盡管核反應堆提供了高效且可持續的能源&#xff0c;但由于放射性物質的危險性&#xff0c;其也帶來了獨特挑戰。虛擬現實&#xff08;VR&#xff09;技術正通過為遠程操作、應急響應和放射性物質處理提供先進解決方案&#xff0c;徹底革新這…

CTF Web的數組巧用

PHP數組繞過intval和preg_match的CTF技巧 原題目 <?php include("flag.php"); // 引入flag文件&#xff0c;flag變量在這里定義 show_source("index.php"); // 顯示index.php文件的源碼&#xff08;方便選手查看&#xff09;// 判斷是否通過GET方式傳入…

vue2+elementui使用compressorjs壓縮上傳的圖片

首先是npm install compressorjs 然后新建一個compressorjs.js的文件 import Compressor from "compressorjs";// 默認壓縮配置 const DEFAULT_COMPRESS_OPTIONS {quality: 0.6, // 默認壓縮質量 (0-1)maxWidth: 1920, // 最大寬度maxHeight: 1080, // 最大高度con…

GPIO詳解:不僅僅是輸入輸出那么簡單

GPIO詳解&#xff1a;不僅僅是輸入輸出那么簡單 “別小看一個小小的引腳&#xff0c;它可是 MCU 世界的社交之門。” &#x1f44b; 先打個招呼&#xff1a;什么是 GPIO&#xff1f; GPIO&#xff0c;全稱是 General Purpose Input/Output —— 通用輸入輸出口。 簡單說&…

深度學習5(深層神經網絡 + 參數和超參數)

深層神經網絡簡介 深層神經網絡是機器學習中一種重要的模型&#xff0c;它通過增加網絡的“深度”&#xff08;即隱藏層的數量&#xff09;來提升模型對復雜數據的表示和學習能力。同淺層類似&#xff0c;也分為三個部分&#xff1a; 輸入層&#xff1a;接收原始數據&#xff…

時間復雜度與空間復雜度分析

一、什么是復雜度&#xff1f; 1.1 為什么需要復雜度分析&#xff1f; 假設你寫了兩個程序來解決同一個問題&#xff0c;如何判斷哪個程序更好&#xff1f;我們不能只看運行時間&#xff0c;因為&#xff1a; 不同電腦性能不同同一電腦在不同時刻狀態也不同數據規模不同&#x…

上下文工程:從提示詞到自動化流程的AI應用新范式

上下文工程&#xff1a;從提示詞到自動化流程的 AI 應用新范式 一、背景與概述&#xff1a;從提示詞工程到上下文工程的演進 隨著大語言模型 (LLM) 技術的飛速發展&#xff0c;AI 應用開發正經歷從 “提示詞工程”(Prompt Engineering) 到 “上下文工程”(Context Engineerin…

HTML網頁應用打包Android App 完整實踐指南

技術準備與工具下載 必需工具清單 在開始之前&#xff0c;需要準備以下開發工具&#xff1a; Android Studio官網&#xff1a;https://developer.android.com/studio HBuilderX官網&#xff1a;https://www.dcloud.io/hbuilderx.html 離線SDK下載&#xff1a;https://nati…

簡單 Python 爬蟲程序設計

爬蟲是獲取網頁數據的常用工具&#xff0c;我們一起來設計一個基于 requests 和 BeautifulSoup 的簡單爬蟲&#xff0c;它可以獲取網頁內容并提取文本信息。 所需庫安裝 首先需要安裝兩個必要的庫&#xff1a; pip install requests beautifulsoup4 完整代碼 import reques…