×

污点和容忍度允许节点控制哪些 Pod 应该(或不应该)在其上调度。

理解污点和容忍度

污点允许节点拒绝调度 Pod,除非该 Pod 具有匹配的容忍度

您可以通过Node规范 (NodeSpec) 将污点应用于节点,并通过Pod规范 (PodSpec) 将容忍度应用于 Pod。当您将污点应用于节点时,除非 Pod 可以容忍该污点,否则调度程序无法将 Pod 放置在该节点上。

节点规范中的污点示例
apiVersion: v1
kind: Node
metadata:
  name: my-node
#...
spec:
  taints:
  - effect: NoExecute
    key: key1
    value: value1
#...
Pod规范中的容忍度示例
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoExecute"
    tolerationSeconds: 3600
#...

污点和容忍度由键、值和效果组成。

表 1. 污点和容忍度组件
参数 描述

是任何字符串,最多 253 个字符。键必须以字母或数字开头,可以包含字母、数字、连字符、点和下划线。

是任何字符串,最多 63 个字符。值必须以字母或数字开头,可以包含字母、数字、连字符、点和下划线。

效果

效果是以下之一

NoSchedule [1]

  • 不匹配污点的新的 Pod 不会调度到该节点上。

  • 节点上现有的 Pod 保持不变。

PreferNoSchedule

  • 不匹配污点的新的 Pod 可能被调度到该节点上,但调度程序会尽量避免。

  • 节点上现有的 Pod 保持不变。

NoExecute

  • 不匹配污点的新的 Pod 无法调度到该节点上。

  • 节点上没有匹配容忍度的现有 Pod 将被移除。

运算符

等于

//效果参数必须匹配。这是默认值。

存在

/效果参数必须匹配。您必须保留一个空白参数,它与任何值匹配。

  1. 如果您向控制平面节点添加NoSchedule污点,则该节点必须具有node-role.kubernetes.io/master=:NoSchedule污点,该污点默认添加。

    例如

    apiVersion: v1
    kind: Node
    metadata:
      annotations:
        machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0
        machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c
      name: my-node
    #...
    spec:
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    #...

容忍度与污点匹配

  • 如果运算符参数设置为等于

    • 参数相同;

    • 参数相同;

    • 效果参数相同。

  • 如果运算符参数设置为存在

    • 参数相同;

    • 效果参数相同。

以下污点内置于 Red Hat OpenShift Service on AWS 中

  • node.kubernetes.io/not-ready:节点未准备好。这对应于节点状态Ready=False

  • node.kubernetes.io/unreachable:节点控制器无法访问该节点。这对应于节点状态Ready=Unknown

  • node.kubernetes.io/memory-pressure:节点存在内存压力问题。这对应于节点状态MemoryPressure=True

  • node.kubernetes.io/disk-pressure:节点存在磁盘压力问题。这对应于节点状态DiskPressure=True

  • node.kubernetes.io/network-unavailable:节点网络不可用。

  • node.kubernetes.io/unschedulable:节点不可调度。

  • node.cloudprovider.kubernetes.io/uninitialized:当节点控制器启动带有外部云提供程序时,此污点将设置在节点上以将其标记为不可用。云控制器管理器中的控制器初始化此节点后,kubelet 将删除此污点。

  • node.kubernetes.io/pid-pressure:节点存在 PID 压力。这对应于节点状态PIDPressure=True

    Red Hat OpenShift Service on AWS 不设置默认的 pid.available evictionHard

Loki Pod 放置

您可以使用 Pod 上的容忍度或节点选择器来控制 Loki Pod 在哪些节点上运行,并阻止其他工作负载使用这些节点。

您可以使用 LokiStack 自定义资源 (CR) 将容忍度应用于日志存储 Pod,并使用节点规范将污点应用于节点。节点上的污点是键:值对,指示节点排斥所有不允许该污点的 Pod。使用其他 Pod 上不存在的特定键:值对可确保只有日志存储 Pod 才能在该节点上运行。

带有节点选择器的 LokiStack 示例
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
  name: logging-loki
  namespace: openshift-logging
spec:
# ...
  template:
    compactor: (1)
      nodeSelector:
        node-role.kubernetes.io/infra: "" (2)
    distributor:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    gateway:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    indexGateway:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    ingester:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    querier:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    queryFrontend:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    ruler:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
# ...
1 指定应用于节点选择器的组件 Pod 类型。
2 指定移动到包含已定义标签的节点的 Pod。

在上一个示例配置中,所有 Loki Pod 都被移动到包含node-role.kubernetes.io/infra: ""标签的节点。

带有节点选择器和容忍度的 LokiStack CR 示例
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
  name: logging-loki
  namespace: openshift-logging
spec:
# ...
  template:
    compactor:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    distributor:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    indexGateway:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    ingester:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    querier:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    queryFrontend:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    ruler:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    gateway:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
# ...

要配置 LokiStack (CR) 的nodeSelectortolerations字段,您可以使用oc explain命令查看特定资源的描述和字段

$ oc explain lokistack.spec.template
示例输出
KIND:     LokiStack
VERSION:  loki.grafana.com/v1

RESOURCE: template <Object>

DESCRIPTION:
     Template defines the resource/limits/tolerations/nodeselectors per
     component

FIELDS:
   compactor	<Object>
     Compactor defines the compaction component spec.

   distributor	<Object>
     Distributor defines the distributor component spec.
...

有关更详细的信息,您可以添加特定字段

$ oc explain lokistack.spec.template.compactor
示例输出
KIND:     LokiStack
VERSION:  loki.grafana.com/v1

RESOURCE: compactor <Object>

DESCRIPTION:
     Compactor defines the compaction component spec.

FIELDS:
   nodeSelector	<map[string]string>
     NodeSelector defines the labels required by a node to schedule the
     component onto it.
...

使用容忍度控制日志收集器 Pod 的放置

默认情况下,日志收集器 Pod 具有以下tolerations配置

apiVersion: v1
kind: Pod
metadata:
  name: collector-example
  namespace: openshift-logging
spec:
# ...
  collection:
    type: vector
    tolerations:
    - effect: NoSchedule
      key: node-role.kubernetes.io/master
      operator: Exists
    - effect: NoSchedule
      key: node.kubernetes.io/disk-pressure
      operator: Exists
    - effect: NoExecute
      key: node.kubernetes.io/not-ready
      operator: Exists
    - effect: NoExecute
      key: node.kubernetes.io/unreachable
      operator: Exists
    - effect: NoSchedule
      key: node.kubernetes.io/memory-pressure
      operator: Exists
    - effect: NoSchedule
      key: node.kubernetes.io/pid-pressure
      operator: Exists
    - effect: NoSchedule
      key: node.kubernetes.io/unschedulable
      operator: Exists
# ...
先决条件
  • 您已安装 Red Hat OpenShift Logging Operator 和 OpenShift CLI (oc)。

流程
  1. 通过运行以下命令,在您希望日志收集器 Pod 调度的节点上添加污点。

    $ oc adm taint nodes <node_name> <key>=<value>:<effect>
    命令示例
    $ oc adm taint nodes node1 collector=node:NoExecute

    此示例在名为node1的节点上添加一个污点,该污点的键为collector,值为node,污点效果为NoExecute。您必须使用NoExecute污点效果。NoExecute仅调度与污点匹配的 Pod,并删除不匹配的现有 Pod。

  2. 编辑ClusterLogging自定义资源 (CR) 的collection部分,为日志收集器 Pod 配置容忍。

    apiVersion: logging.openshift.io/v1
    kind: ClusterLogging
    metadata:
    # ...
    spec:
    # ...
      collection:
        type: vector
        tolerations:
        - key: collector (1)
          operator: Exists (2)
          effect: NoExecute (3)
          tolerationSeconds: 6000 (4)
        resources:
          limits:
            memory: 2Gi
          requests:
            cpu: 100m
            memory: 1Gi
    # ...
    1 指定您添加到节点的键。
    2 指定Exists运算符,要求key/value/effect参数匹配。
    3 指定NoExecute效果。
    4 可选:指定tolerationSeconds参数来设置 Pod 在被驱逐之前可以绑定到节点的时间长度。

此容忍与oc adm taint命令创建的污点匹配。具有此容忍的 Pod 可以调度到node1

配置日志收集器的资源和调度

管理员可以通过创建与支持它的ClusterLogForwarder CR 位于相同命名空间并具有相同名称的ClusterLogging自定义资源 (CR) 来修改收集器的资源或调度。

在部署中使用多个日志转发器时,ClusterLogging CR 的适用部分是managementStatecollection。所有其他部分都将被忽略。

先决条件
  • 您拥有管理员权限。

  • 您已安装 Red Hat OpenShift Logging Operator 5.8 或更高版本。

  • 您已创建ClusterLogForwarder CR。

流程
  1. 创建一个支持您现有ClusterLogForwarder CR 的ClusterLogging CR

    ClusterLogging CR YAML 示例
    apiVersion: logging.openshift.io/v1
    kind: ClusterLogging
    metadata:
      name:  <name> (1)
      namespace: <namespace> (2)
    spec:
      managementState: "Managed"
      collection:
        type: "vector"
        tolerations:
        - key: "logging"
          operator: "Exists"
          effect: "NoExecute"
          tolerationSeconds: 6000
        resources:
          limits:
            memory: 1Gi
          requests:
            cpu: 100m
            memory: 1Gi
        nodeSelector:
          collector: needed
    # ...
    1 名称必须与ClusterLogForwarder CR 的名称相同。
    2 命名空间必须与ClusterLogForwarder CR 的命名空间相同。
  2. 通过运行以下命令来应用ClusterLogging CR

    $ oc apply -f <filename>.yaml

查看日志收集器 Pod

您可以查看日志收集器 Pod 及其正在运行的相应节点。

流程
  • 在一个项目中运行以下命令以查看日志收集器 Pod 及其详细信息

    $ oc get pods --selector component=collector -o wide -n <project_name>
    示例输出
    NAME           READY  STATUS    RESTARTS   AGE     IP            NODE                  NOMINATED NODE   READINESS GATES
    collector-8d69v  1/1    Running   0          134m    10.130.2.30   master1.example.com   <none>           <none>
    collector-bd225  1/1    Running   0          134m    10.131.1.11   master2.example.com   <none>           <none>
    collector-cvrzs  1/1    Running   0          134m    10.130.0.21   master3.example.com   <none>           <none>
    collector-gpqg2  1/1    Running   0          134m    10.128.2.27   worker1.example.com   <none>           <none>
    collector-l9j7j  1/1    Running   0          134m    10.129.2.31   worker2.example.com   <none>           <none>

其他资源