K8S自己动手系列 - 1.3 - Taint & Affinity

简介: 本文主要描述节点污点及亲和性相关操作

Taint

please refer https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
三种taint:

  • NoSchedule
  • PreferNoSchedule
  • NoExecute

为节点打Taint

  ~ kubectl taint node worker02 role=nginx:NoSchedule
node/worker02 tainted
  ~ kubectl describe node worker02
Name:               worker02
...
Taints:             role=nginx:NoSchedule

  ~ kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
nginx-7cffb9df96-748j6   1/1     Running   0          5m21s   10.244.0.23   worker01   <none>           <none>
nginx-7cffb9df96-d2rt5   1/1     Running   0          5m22s   10.244.1.35   worker02   <none>           <none>

通过查看pod,发现已经运行的pod并未受影响
扩容pod,看下效果

  ~ kubectl scale --replicas=5 deployment/nginx
deployment.extensions/nginx scaled
  ~ kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE    IP            NODE       NOMINATED NODE   READINESS GATES
nginx-7cffb9df96-4rjhf   0/1     ContainerCreating   0          1s     <none>        worker01   <none>           <none>
nginx-7cffb9df96-748j6   1/1     Running             0          6m8s   10.244.0.23   worker01   <none>           <none>
nginx-7cffb9df96-89ngr   0/1     ContainerCreating   0          1s     <none>        worker01   <none>           <none>
nginx-7cffb9df96-d2rt5   1/1     Running             0          6m9s   10.244.1.35   worker02   <none>           <none>
nginx-7cffb9df96-zsgmd   0/1     ContainerCreating   0          1s     <none>        worker01   <none>           <none>

通过实验发现由于taint NoSchedule的影响,新pod不会调度到含有污点的节点上

移除节点Taint

  ~ kubectl taint node worker02 role:NoSchedule-
node/worker02 untainted

再次扩容,查看效果

  ~ kubectl scale --replicas=10 deployment/nginx
deployment.extensions/nginx scaled
  ~ kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
nginx-7cffb9df96-2wlln   1/1     Running   0          4s      10.244.1.38   worker02   <none>           <none>
nginx-7cffb9df96-4rjhf   1/1     Running   0          3m10s   10.244.0.26   worker01   <none>           <none>
nginx-7cffb9df96-748j6   1/1     Running   0          9m17s   10.244.0.23   worker01   <none>           <none>
nginx-7cffb9df96-89ngr   1/1     Running   0          3m10s   10.244.0.24   worker01   <none>           <none>
nginx-7cffb9df96-9vbdt   1/1     Running   0          4s      10.244.1.36   worker02   <none>           <none>
nginx-7cffb9df96-d2rt5   1/1     Running   0          9m18s   10.244.1.35   worker02   <none>           <none>
nginx-7cffb9df96-hqvfh   1/1     Running   0          4s      10.244.1.37   worker02   <none>           <none>
nginx-7cffb9df96-mhxmn   1/1     Running   0          4s      10.244.1.40   worker02   <none>           <none>
nginx-7cffb9df96-xdnzc   1/1     Running   0          4s      10.244.1.39   worker02   <none>           <none>
nginx-7cffb9df96-zsgmd   1/1     Running   0          3m10s   10.244.0.25   worker01   <none>           <none>

发现新增加的pod已经可以调度到worker02上了

容忍节点Taint

重新为节点增加污点

  ~ kubectl taint node worker02 role=nginx:NoSchedule
node/worker02 tainted

然后在deploy定义中增加:

tolerations:
- key: "role"
  operator: "Equal"
  value: "nginx"
  effect: "NoSchedule"

通过kubectl diff -f xxx.yaml可以查看变化情况

  lab02 kubectl diff -f nginx-deploy.yaml 
diff -u -N /tmp/LIVE-021075426/extensions.v1beta1.Deployment.default.nginx /tmp/MERGED-503027673/extensions.v1beta1.Deployment.default.nginx
--- /tmp/LIVE-021075426/extensions.v1beta1.Deployment.default.nginx    2019-06-09 15:53:54.120907334 +0800
+++ /tmp/MERGED-503027673/extensions.v1beta1.Deployment.default.nginx    2019-06-09 15:53:54.128907426 +0800
@@ -4,7 +4,7 @@
   annotations:
     deployment.kubernetes.io/revision: "8"
   creationTimestamp: "2019-06-08T04:27:19Z"
-  generation: 23
+  generation: 24
   labels:
     app: nginx
   name: nginx
@@ -14,7 +14,7 @@
   uid: b43106be-89a5-11e9-8ec2-080027a62701
 spec:
   progressDeadlineSeconds: 2147483647
-  replicas: 1
+  replicas: 2
   revisionHistoryLimit: 2147483647
   selector:
     matchLabels:
@@ -42,6 +42,11 @@
       schedulerName: default-scheduler
       securityContext: {}
       terminationGracePeriodSeconds: 30
+      tolerations:
+      - effect: NoSchedule
+        key: role
+        operator: Equal
+        value: nginx
 status:
   availableReplicas: 1
   conditions:
exit status 1

再次扩容,查看效果

  lab02 kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
nginx-859959cc7f-7sx2p   1/1     Running   0          4s    10.244.0.38   worker01   <none>           <none>
nginx-859959cc7f-8tpw7   1/1     Running   0          4s    10.244.0.39   worker01   <none>           <none>
nginx-859959cc7f-ffh7v   1/1     Running   0          4s    10.244.1.49   worker02   <none>           <none>
nginx-859959cc7f-j2xp7   1/1     Running   0          4s    10.244.0.37   worker01   <none>           <none>
nginx-859959cc7f-lht8b   1/1     Running   0          4s    10.244.1.47   worker02   <none>           <none>
nginx-859959cc7f-mcth6   1/1     Running   0          17s   10.244.0.36   worker01   <none>           <none>
nginx-859959cc7f-sx5ln   1/1     Running   0          4s    10.244.1.48   worker02   <none>           <none>
nginx-859959cc7f-tlxk5   1/1     Running   0          4s    10.244.1.46   worker02   <none>           <none>
nginx-859959cc7f-xkjtq   1/1     Running   0          4s    10.244.1.45   worker02   <none>           <none>
nginx-859959cc7f-xltkz   1/1     Running   0          17s   10.244.1.44   worker02   <none>           <none>

Affinity

上面通过节点污点的方式,我们可以避免pod被调度到含有污点的节点,同时也可以使某些pod容忍节点的污点,配合下面要说的affinity,可以实现特定节点为特定pod专用的目的

NodeSelector

在pod定义中增加如下:

      nodeSelector:
        kubernetes.io/hostname: worker02

执行查看效果

  lab02 kubectl apply -f nginx-deploy-toleration-nodeselector.yaml
deployment.extensions/nginx configured
  lab02 kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
nginx-564c745dcd-6dtz7   1/1     Running   0          25s   10.244.1.56   worker02   <none>           <none>
nginx-564c745dcd-fw8kt   1/1     Running   0          25s   10.244.1.55   worker02   <none>           <none>
nginx-564c745dcd-l8k7m   1/1     Running   0          22s   10.244.1.58   worker02   <none>           <none>
nginx-564c745dcd-mvqjd   1/1     Running   0          28s   10.244.1.53   worker02   <none>           <none>
nginx-564c745dcd-qn6r9   1/1     Running   0          29s   10.244.1.52   worker02   <none>           <none>
nginx-564c745dcd-rbl57   1/1     Running   0          27s   10.244.1.54   worker02   <none>           <none>
nginx-564c745dcd-s2jbm   1/1     Running   0          19s   10.244.1.59   worker02   <none>           <none>
nginx-564c745dcd-wnd45   1/1     Running   0          30s   10.244.1.50   worker02   <none>           <none>
nginx-564c745dcd-zlnfg   1/1     Running   0          30s   10.244.1.51   worker02   <none>           <none>
nginx-564c745dcd-zm7qx   1/1     Running   0          22s   10.244.1.57   worker02   <none>           <none>

NodeAffinity

NodeAffinity与NodeSelector有相似的作用,但是相比之下有更加灵活的表达语义
please refer: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
9天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
2056 2
|
4月前
|
人工智能 文字识别 JavaScript
AI 写代码越来越快,为什么 Code Review 反而更慢了?
Molio团队实践Open Code Review(OCR):通过深度定制rule.json(禁用规范类检查、强化语义问题引导)、关闭系统规则合并、精准上下文补全与事实核查,将AI代码评审从30条低价值噪音压缩至12条高价值语义缺陷,真正释放LLM在race condition、路径穿越等深层问题上的发现能力。
332 1
|
9月前
|
人工智能 文字识别 数据可视化
开发了个自动发票整理报销系统(大模型版)
本文介绍了基于JBoltAI开发的“自动发票整理报销系统”的落地实践。针对传统报销流程中员工贴票繁琐、财务核票低效、易出错、合规风险高等痛点,项目通过多模态解析、OCR识别、Text2Struct、规则引擎和函数调用等AI能力,实现了多格式发票自动采集、信息结构化提取、真伪与合规智能核验、报销单自动生成及流程联动。系统采用低侵入式架构,无缝对接现有财务系统与OA,显著提升效率:员工报销耗时从1-2小时降至1-2分钟,财务核票效率提升70%,错误率降至1%以下,并实现费用数据沉淀与可视化管控。文章还分享了开发中的关键问题及解决方案,并规划了语音交互、智能预警、移动端优化
1132 1
|
3月前
|
弹性计算 监控 安全
阿里云VPC网络ACL与安全防护完全指南:从子网隔离到纵深防御
本文系统阐述阿里云VPC网络访问控制体系,重点剖析网络ACL作为子网级无状态防火墙的配置方法、核心优势与最佳实践。文章从网络ACL与安全组的本质区别入手,深入讲解五元组规则配置、入出方向流量管理、与安全组协同使用的纵深防御策略,并进一步扩展至云防火墙、流量镜像、DDoS防护、WAF接入等高级安全能力。通过典型场景示例和代码实操,帮助读者构建从子网边界到实例粒度的多层防护体系,实现云上资产的安全隔离与合规管控。
|
5月前
|
存储 缓存 安全
避开“玩具陷阱”:办公Agent在权限管理、审计日志上的工程实践
本文以真实事故切入,详解办公AI Agent安全落地的“刹车”(最小权限、角色隔离、临时提权)与“黑匣子”(全链路、不可篡改、可追溯审计日志)两大核心机制,直击权限滥用与日志缺失痛点,提供可复用的工程实践方案。(239字)
589 1
|
5月前
|
存储 JSON 前端开发
【前端实战】基于 Vue 3 + Tone.js 构建在线钢琴学习平台
本文介绍基于Vue 3与Tone.js打造的零门槛在线钢琴学习平台,支持键盘演奏、曲目播放/高亮、本地存储与JSON导入导出,纯前端实现、跨平台响应式,星空主题界面美观易用。开源免费,即开即练。
776 2
|
7月前
|
机器学习/深度学习 人工智能 算法
求最大公约数(gcd)与最小公倍数(lcm)【C/C++】
本博客详解最大公约数(GCD)的核心思想与多种解法:从基础概念出发,系统讲解辗转相除法(欧几里得算法)、更相减损术、质因数分解、穷举法及递归法,并配以图示、数学原理与可运行代码。最后通过“等差数列”实战题,展示GCD在算法题中的巧妙应用,强调数学本质理解对编程实现的关键作用。
1618 0
|
机器学习/深度学习 并行计算 PyTorch
英伟达新一代GPU架构(50系列显卡)PyTorch兼容性解决方案
本文记录了在RTX 5070 Ti上运行PyTorch时遇到的CUDA兼容性问题,分析其根源为预编译二进制文件不支持sm_120架构,并提出解决方案:使用PyTorch Nightly版本、更新CUDA工具包至12.8。通过清理环境并安装支持新架构的组件,成功解决兼容性问题。文章总结了深度学习环境中硬件与框架兼容性的关键策略,强调Nightly构建版本和环境一致性的重要性,为开发者提供参考。
10280 64
英伟达新一代GPU架构(50系列显卡)PyTorch兼容性解决方案

热门文章

最新文章