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