容器技术
ubuntu使用APT安装docker并指定版本
Helm部署与使用
Helm常用命令
从Helm仓库创建应用流程示例
Helm部署与使用
K8S中部署mysql-ha高可用集群
helm启动mysql-ha
helm几个常用仓库
Kubernetes使用helm部署Mysql-Ha
k8s入门:Helm 构建 MySQL
docker批量修改tag(批量push)
k8s之yaml文件详解
将 MySQL 通过 bitpoke/mysql-operator 部署到 k8s 内部
k8s pvc扩容:pvc创建后扩容
K8S性能分析
部署Metrics Server
Kubernetes集群搭建
kubespray 部署常见问题和优化汇总
kubernetes-sigs/kubespray at release-2.15
K8S-pod配置文件详解
KubeSphere知识库
在 Kubernetes 上最小化安装 KubeSphere
卸载 KubeSphere 和 Kubernetes
KubeSphere 应用商店
修改pod中容器的时区
k8s之Pod安全策略
Harbor 登陆失败,用户名或者密码不正确。405 Not Allowed
Docker-leanote_n1
kubesphere/kubekey
Kubernetes Static Pod (静态Pod)
kubernets kube-proxy的代理 iptables和ipvs - 30岁再次出发 - 博客园
k8s生产实践之获取客户端真实IP - SSgeek - 博客园
kube-proxy ip-tables故障解决
k8s入门:Helm 构建 MySQL
docker批量修改tag(批量push)
prometheus operator 监控redis-exporter
Helm3 安装 ElasticSearch & Kibana 7.x 版本
kubernete强力删除namespace_redis删除namespace命令
EFK (Elasticsearch + Fluentd + Kibana) 日志分析系统
k8s日志收集实战(无坑)
fluentd收集k8s集群pod日志
Elasticsearch+Fluentd+Kibana 日志收集系统的搭建
TKE/EKS之configmap,secret只读挂载
K8s基于Reloader的ConfigMap/Secret热更新
使用 Reloader 实现热部署_k8s reloader
k8s使用Reloader实现更新configmap后自动重启pod
在 Kubernetes 上对 gRPC 服务器进行健康检查 | Kubernetes
Kubernetes ( k8s ) gRPC服务 健康检查 ( livenessProbe ) 与 就绪检查 ( readinessProbe )
排查kubernetes中高磁盘占用pod
helm 安装 MongoDB 集群
helm 安装 Redis 1 主 2 从 3哨兵
【k8s】使用 Reloader 实现热部署
k8s证书过期,更新后kubelet启动失败
kubeadm证书/etcd证书过期处理
三种监控 Kubernetes 集群证书过期方案
K8s 集群(kubeadm) CA 证书过期解决方案
k8s调度、污点、容忍、不可调度、排水、数据卷挂载
5分钟搞懂K8S的污点和容忍度(理论+实战)
Kubernetes进阶-8基于Istio实现微服务治理
macvlan案例配置
快速解决Dockerhub镜像站无法访问问题
info_scan开源漏洞扫描主系统部署
本文档使用 MrDoc 发布
-
+
首页
5分钟搞懂K8S的污点和容忍度(理论+实战)
> 本文主要快速讲解Kubernetes的污点和容忍度,一句话总结:如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。 在K8S中,如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。如果不能容忍,那就无法调度到该节点。污点和容忍度就像谈恋爱的小情侣,你情我愿,女生知道男生的缺点,却依然选择容忍,这样他们可以生活在一起。如果女生容忍不了男生的缺点,那就没法生活在一起。 ## 1、理论 ### 1.1、污点和容忍度的概念 - 污点(Taints):定义在节点上,用于拒绝Pod调度到此节点,除非该Pod具有该节点上的污点容忍度。被标记有Taints的节点并不是故障节点。 - 容忍度(Tolerations):定义在Pod上,用于配置Pod可容忍的节点污点,K8S调度器只能将Pod调度到该Pod能够容忍的污点的节点上。 - 调度示例图:  ### 1.2、排斥等级 Node对Pod对象的排斥等级有3种: - NoSchedule:没有配置此污点容忍度的新Pod不能调度到此节点,节点上现存的Pod不受影响。 - PreferNoSchedule:没有配置此污点容忍度的新Pod尽量不要调度到此节点,如果找不到合适的节点,依然会调度到此节点。 - NoExecute:没有配置此污点容忍度的新Pod对象不能调度到此节点,节点上现存的Pod会被驱逐。 ### 1.3、容忍度操作符 在Pod上定义容忍度时,它支持两种操作符:Equal和Exists。 - Equal:容忍度与污点必须在key、value和effect三者完全匹配。 - Exists:容忍度与污点必须在key和effect二者完全匹配,容忍度中的value字段要使用空值。 ### 1.4、用法 污点定义在节点的nodeSpec中,容忍度定义在Pod的podSpec中。 污点和容忍度都是键值对的数据格式,但是要增加一个排斥等级(effect)标记。 语法格式为:"key=value:effect"。 ### 1.5、使用场景 **1、独占节点** - 如果想拿出部分节点给特定的Pod使用,可以通过给节点添加污点,然后特定的Pod加入对应的容忍度。 - 在集群中有些机器设备可能比较特殊,比如CPU性能很好、内存很大等等,不希望普通Pod占用这部分特殊节点,可以通过污点和容忍度来解决。 **2、驱逐Pod** 上文中定义了Node对Pod的排斥等级有3种。Node如果定义的排斥等级是NoExecute,那么没有配置该污点容忍度的Pod会被驱逐。 K8S 也会使用污点自动标识有问题的节点,比如节点在内存不足的情况下,节点控制器会自动为该节点打上污点信息,并且使用 NoExecute作为排斥等级,此时没有设置此类污点容忍度的Pod 会被驱逐。 DaemonSet控制器会无视此类污点,以便能在节点上部署重要的Pod。 目前,内置的污点也比较多,比如以下几个: ## 2、实战 ### 2.1、管理节点污点 给节点添加污点: ```Bash kubectl taint nodes node01 key=value:effect ``` 给节点删除污点,此处的effect可以没有 ```Bash kubectl taint nodes node01 key[:effect]- ``` ### 2.2、管理Pod的容忍度 上文中提到了,容忍度的操作符有2种:Equal和Exists,同时把排斥等级也要加上。 使用Equal的场景: ```YAML tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoExecute" ``` 使用Exists的场景: ```YAML tolerations: - key: "key" operator: "Exists" effect: "NoExecute" ``` 如果Node上污点的排斥等级是NoExecute时,该Node上正在运行的Pod如果没有该污点的容忍度,就会被立刻驱逐。不过系统增加了`tolerationSeconds`字段,用来延迟驱逐Pod。 `tolerationSeconds`字段的意思是:如果 Pod 的容忍度配置里**存在**排斥等级为 `NoExecute` ,并且指定了属性 `tolerationSeconds` 的值,那么Pod 还能继续在该节点上运行的时间(单位为秒): ```YAML tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoExecute" tolerationSeconds: 3600 ``` ### 2.3、具体操作 #### 2.3.1、前置小知识 - 查看看节点label,label是key-value的数据格式 ```Bash kubectl get nodes --show-labels ``` - 增加节点label,比如设置一个key是`special-app`,value是`specialwebapp`的label ```Bash kubectl label node k8s-worker-2 special-app=specialwebapp ```  查看某节点的污点情况,可以看到Taints这一栏是none,也可以看到label情况。 ```Bash kubectl describe node k8s-worker-2 ```  #### 2.3.2、实战示例过程 **步骤**: 1. 给定某个K8S节点,比如`k8s-worker-2`,节点的有一个`label`,Pod根据`label`选择调度到`k8s-worker-2`,此时调度成功。 2. 给`k8s-worker-2`增加污点,此时Pod调度失败。 3. 给Pod配置此污点的容忍度,调度成功。 4. 删除节点的污点,删除容忍度,部署成功。 **操作过程**: ```Bash kubectl taint nodes k8s-worker-2 question-node=broken-disk:NoSchedule ```  - 部署Pod,可以看到没有配置容忍度的Pod一直处于Pending状态,查看Pod的描述,也给出了原因:调度失败,node有污点,Pod没有容忍度。   ```Bash kubectl taint nodes k8s-worker-2 question-node- ```  **完整的yaml文件**: ```YAML apiVersion: v1 kind: Pod metadata: name: webapp namespace: demo labels: app: webapp spec: nodeSelector: # 选择调度到具有这个label的节点 "special-app": "specialwebapp" # kubernetes.io/hostname: k8s-worker-2 tolerations: - key: "question-node" operator: "Equal" value: "broken-disk" effect: "NoSchedule" containers: - name: webapp image: nginx ports: - containerPort: 80 ``` ## 总结 在K8S中,如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。如果不能容忍,那就无法调度到该节点。
adouk
2024年11月19日 14:18
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码