九、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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…