美文网首页
k8s中污点(taint),容忍(tolerations)入门

k8s中污点(taint),容忍(tolerations)入门

作者: 国服最坑开发 | 来源:发表于2023-07-08 16:27 被阅读0次

0x00 需求

公有云K8s部署,如果是采用手动维护node的方式进行部署。肯定会面临一个问题:
如何把特定的pod 调度到指定的node上运行,而且希望这个node 只运行指定的pod。

0x01 关于node的配置

1. node 的label操作基础

创建node时,指定label,也可以在创建后手动维护 label:

# 给node k8s-node02 添加一个label:  ns=sit
kubectl label nodes  k8s-node02 ns=sit
# 查看
kubectl describe node k8s-node02
# 删除
kubectl label nodes k8s-node02 ns-

2.如何禁止其他Pod调度到当前node ?

给node 打上一个污点,可以解决上述需求。
例:

# 设置污点
kubectl taint nodes k8s-node02 app=test:NoSchedule
#查看污点
kubectl describe node k8s-node02 | grep Taints
#删除污点
kubectl taint nodes k8s-node2 app=test:NoSchedule-

这里,打上一个 NoSchedule 污点,表示这个node对后续pod不提供调度能力。
也可以理解为:有污点的node,无法随意执行pod了。
注意:如果打污点之前node上已经有pod了,这些pod不受影响。

0x02.如何把Pod 调度到上述 node

这里有两个问题:

1、如何选择node

使用nodeSelector, 后面加一个 node 的 label.
表示pod会选择指定 label的node进行调度。

2、如何解除node上污点的限制

问题1解决了,但是node有污点,一般是无法调度成功的。
这里就需要用到容忍度了:

来看一个完整的deployment 样例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  labels:
    app: "nginx-test"
spec:
  replicas: 1
  template:
    metadata:
      name: nginx
      labels:
        app: "nginx-test"
    spec:
      containers:
        - name: "nginx-test"
          image: nginx:latest
          imagePullPolicy: IfNotPresent
      tolerations:
        - key: "app"
          operator: "Equal"
          value: "test"
          effect: NoSchedule
      restartPolicy: Always
      nodeSelector:
        ns: sit
  selector:
    matchLabels:
      app: "nginx-test"
  • nodeSelector 比较好理解。
  • tolerations 在配置时,需要和node 的污点信息保持一致。
    这样就可以实现开篇的需求了。

0x03 小结

  • 操作对象
    node: 污点
    pod: 容忍度、nodeSelector

  • 应用场景
    aws eks 中跨az 会产生流量费用和性能影响。
    我们就可以考虑结合使用上述能力,让pod 都部署在同一个az中。

相关文章

网友评论

      本文标题:k8s中污点(taint),容忍(tolerations)入门

      本文链接:https://www.haomeiwen.com/subject/fmkjudtx.html