您的位置:首页 > 其它

k8s-Pod污点与容忍

2021-11-25 18:44 274 查看

目录
  • 为什么要用污点和容忍?
  • 官方解释
  • Taints参数
  • 标记污点
  • 容忍污点
  • 取消所有节点污点
  • Pod污点与容忍

    大白话先解释一下污点与容忍

    污点:被打上污点Taints的节点,不会被调度器部署pod应用。
    容忍:允许调度器部署pod应用到打上污点Taints的节点。

    为什么要用污点和容忍?

    为什么用污点?
    因为k8s集群每一个请求都需要走master节点kube-apiserver,因此master节点非常重要,所以pod应用一般不部署master节点。那么给master节点打上污点Taints,这样调度的时候就不会部署到带有污点的机器了
    
    为什么用容忍?
    比如被打上污点Taints的master节点需要部署某个pod应用,那么就需要容忍声明,这样就可以调度到带有污点的机器了

    官方解释

    对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taints ,除非 pod 也被标识为可以容忍污点节点,否则该 Taints 节点不会被调度 pod。
    
    比如用户希望把 Master 节点保留给 Kubernetes 系统组件使用,或者把一组具有特殊资源预留给某些 pod,则污点就很有用了,pod 不会再被调度到 taint 标记过的节点。我们使用kubeadm搭建的集群默认就给 master 节点添加了一个污点标记,所以我们看到我们平时的 pod 都没有被调度到 master 上去:
    $ kubectl describe node master
    Name:               master
    Roles:              master
    Labels:             beta.kubernetes.io/arch=amd64
    beta.kubernetes.io/os=linux
    kubernetes.io/hostnam
    ad8
    e=master
    node-role.kubernetes.io/master=
    ......
    Taints:             node-role.kubernetes.io/master:NoSchedule
    Unschedulable:      false
    我们可以使用上面的命令查看 master 节点的信息,其中有一条关于 Taints 的信息:node-role.kubernetes.io/master:NoSchedule,就表示给 master 节点打了一个污点的标记,其中影响的参数是NoSchedule,表示 pod 不会被调度到标记为 taints 的节点

    Taints参数

    node-role.kubernetes.io/master:NoSchedule
    
    NoSchedule: 不调度到污点节点上去
    PreferNoSchedule:NoSchedule 的软策略版本,表示尽量不调度到污点节点上去
    NoExecute:该选项意味着一旦Taint生效,如该节点内正在运行的pod没有对应Tolerate设置,会直接被逐出

    标记污点

    # kubectl taint node sg-14 test=sg14:PreferNoSchedule
    
    node/sg-14 tainted

    上面的命名将 sg-14 节点标记为了污点,影响策略是 PreferNoSchedule,只会影响新的 pod 调度,如果仍然希望某个 pod 调度到 taint 节点上,则必须在 Spec 中做出Toleration定义,才能调度到该节点,

    由于 master 节点被标记为了污点节点,所以我们这里要想 pod 能够调度到 master 节点去,就需要增加容忍的声明:

    容忍污点

    tolerations:
    - key: "node-role.kubernetes.io/master"
    operator: "Exists"
    effect: "NoSchedule"

    eg:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: deployment
    spec:
    replicas: 1  		# pod数量
    selector:  			# 选择器
    matchLabels:  # 标签
    release: stable # 选择标签
    template:  				# 模版
    metadata:
    name: test-tag  # 控制器名字
    labels:
    release: stable # 设置控制器标签
    spec:
    containers:
    - name: nginx  # 镜像名称
    image: nginx # 镜像
    tolerations:
    - key: "node-role.kubernetes.io/master"
    operator: "Exists"
    effect: "NoSchedule"

    然后创建上面的资源,我们可以看到有一个 pod 副本被调度到了 master 节点,这就是容忍的使用方法。

    对于 tolerations 属性的写法,其中pod的 key、value、effect 与 Node 的 Taint 设置需保持一致, 还有以下几点说明:

    如果 operator 的值是 Exists,则
    ad8
    value 属性可省略
    如果 operator 的值是 Equal,则表示其 key 与 value 之间的关系是 equal(等于)
    如果不指定 operator 属性,则默认值为 Equal
    另外,还有两个特殊值:
    tolerations:
    - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoScheduale"

    取消所有节点污点

    [root@sg-14 deployment]# kubectl taint node sg-14 test-
    
    node/sg-14 untainted
    就删除了节点污点
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: