当前位置: 首页 > news >正文

九、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.xdnf.cn/news/1082017.html

相关文章:

  • web前端面试-- MVC、MVP、MVVM 架构模式对比
  • 递归与循环
  • 高频交易服务器篇
  • A/B测试实战:页面微小改动如何带来30%转化率提升?
  • ABC413 : E Reverse 2^i
  • Vue前端项目接收webSocket信息
  • Linux网络配置与故障排除完全指南
  • 介绍electron
  • 【ES6】Latex总结笔记生成器(网页版)
  • TailWind CSS Intellisense 插件在VSCode 上不生效
  • LESS/SCSS 高效主题换肤方案
  • 基于 LangChain 实现通义千问 + Tavily 搜索 Agent 的简单实践
  • 在VMware虚拟机中安装Windows 98时,Explorer提示“该程序执行了非法操作,即将关闭”的解决办法
  • 虚拟机与容器技术详解:VM、LXC、LXD与Docker
  • php协程
  • MySQL 数据库传统方式部署主从架构的实现很详细
  • React Native 亲切的组件们(函数式组件/class组件)和陌生的样式
  • 若 VSCode 添加到文件夹内右键菜单中显示(通过reg文件方式)
  • 盘式制动器的设计+说明书和CAD)【6张】+绛重
  • Redis性能优化
  • 权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记
  • 前端捕获异常的全面场景及方法
  • Linux操作系统之文件(三):缓冲区
  • 每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
  • 【每天一个知识点】动态知识库
  • JxBrowser 8.9.0 版本发布啦!
  • chrome插件合集
  • vue/微信小程序/h5 实现react的boundary
  • 智能电动汽车系列 --- 车载软件开发思想与已有OEM现状碰撞
  • vue-39(为复杂 Vue 组件编写单元测试)