最近在鼓捣自建k8s服务器上部署EFK来收集容器中的日志,但是发现有些日志能收集到日志,而有些不行,查看pod部署分布的服务器,有些调度到了master节点,而fluentd只运行在worker节点,不能收集master节点上的容器日志,因此就需要给master节点打污点。

    • #查看集群中各节点信息

      1. kubectl get nodes
    • #查看master节点是否允许被调度

      $ kubectl describe nodes k8s-master-node1 |grep Taints
      Taints:             <none>
      

      none表示是允许被调度的

    • #给master节点打污点,不允许调度

      $ kubectl taint nodes k8s-master-node1 node-role.kubernetes.io/master=:NoSchedule
      node/k8s-master-node1 tainted
      

      kubectl taint node [node] key=value[effect]
      其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
      NoSchedule: 一定不能被调度
      PreferNoSchedule: 尽量不要调度
      NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod

    再次查看master节点是否被允许调度

    $ kubectl describe nodes k8s-master-node1 |grep Taints
    Taints:             node-role.kubernetes.io/master:NoSchedule
    
    • #删除taint
      kubectl taint node k8s-master-node1 node-role.kubernetes.io/master:NoSchedule-
      
    • #容忍tolerations主节点的taints

    以上面为 master1 设置的 taints 为例, 你需要为你的 yaml 文件中添加如下配置, 才能容忍 master 节点的污点

    在 pod 的 spec 中设置 tolerations 字段

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Equal"
        value: ""
        effect: "NoSchedule"