×

节点选择器指定一个键值对映射,这些键值对是使用节点上的自定义标签和Pod中指定的选择器定义的。

为了使 Pod 能够在节点上运行,Pod 必须与节点上的标签具有相同的键/值节点选择器。

关于节点选择器

您可以使用 Pod 上的节点选择器和节点上的标签来控制 Pod 的调度位置。使用节点选择器,Red Hat OpenShift Service on AWS 会将 Pod 调度到包含匹配标签的节点上。

您可以使用节点选择器将特定的 Pod 放置到特定的节点上,使用集群范围的节点选择器将新的 Pod 放置到集群中任何位置的特定节点上,以及使用项目节点选择器将项目中的新 Pod 放置到特定的节点上。

例如,作为集群管理员,您可以创建一个基础设施,让应用程序开发人员只能将 Pod 部署到与其地理位置最近的节点上,方法是在他们创建的每个 Pod 中包含一个节点选择器。在此示例中,集群由分布在两个区域的五个数据中心组成。在美国,将节点标记为us-eastus-centralus-west。在亚太地区 (APAC),将节点标记为apac-eastapac-west。开发人员可以向他们创建的 Pod 添加节点选择器,以确保 Pod 被调度到这些节点上。

如果Pod对象包含节点选择器,但没有任何节点具有匹配的标签,则不会调度 Pod。

如果您在同一个 Pod 配置中同时使用节点选择器和节点亲和性,则以下规则控制 Pod 在节点上的放置。

  • 如果您同时配置了nodeSelectornodeAffinity,则必须满足这两个条件才能将 Pod 调度到候选节点上。

  • 如果您指定了与nodeAffinity类型关联的多个nodeSelectorTerms,则如果满足其中一个nodeSelectorTerms,则可以将 Pod 调度到节点上。

  • 如果您指定了与nodeSelectorTerms关联的多个matchExpressions,则只有在满足所有matchExpressions时,才能将 Pod 调度到节点上。

特定 Pod 和节点上的节点选择器

您可以使用节点选择器和标签来控制特定 Pod 调度的节点。

要使用节点选择器和标签,首先标记节点以避免 Pod 被取消调度,然后将节点选择器添加到 Pod。

您不能直接将节点选择器添加到现有的已调度 Pod。您必须标记控制 Pod 的对象,例如部署配置。

例如,以下Node对象具有region: east标签

带有标签的示例Node对象
kind: Node
apiVersion: v1
metadata:
  name: ip-10-0-131-14.ec2.internal
  selfLink: /api/v1/nodes/ip-10-0-131-14.ec2.internal
  uid: 7bc2580a-8b8e-11e9-8e01-021ab4174c74
  resourceVersion: '478704'
  creationTimestamp: '2019-06-10T14:46:08Z'
  labels:
    kubernetes.io/os: linux
    topology.kubernetes.io/zone: us-east-1a
    node.openshift.io/os_version: '4.5'
    node-role.kubernetes.io/worker: ''
    topology.kubernetes.io/region: us-east-1
    node.openshift.io/os_id: rhcos
    node.kubernetes.io/instance-type: m4.large
    kubernetes.io/hostname: ip-10-0-131-14
    kubernetes.io/arch: amd64
    region: east (1)
    type: user-node
#...
1 与 Pod 节点选择器匹配的标签。

一个 Pod 具有type: user-node,region: east节点选择器

带有节点选择器的示例Pod对象
apiVersion: v1
kind: Pod
metadata:
  name: s1
#...
spec:
  nodeSelector: (1)
    region: east
    type: user-node
#...
1 与节点标签匹配的节点选择器。节点必须为每个节点选择器都有一个标签。

当您使用示例 Pod 规范创建 Pod 时,它可以在示例节点上调度。

默认集群范围的节点选择器

使用默认集群范围的节点选择器时,当您在该集群中创建 Pod 时,Red Hat OpenShift Service on AWS 会将默认节点选择器添加到 Pod 并将 Pod 调度到具有匹配标签的节点上。

例如,以下Scheduler对象具有默认集群范围的region=easttype=user-node节点选择器

Scheduler 运算符自定义资源示例
apiVersion: config.openshift.io/v1
kind: Scheduler
metadata:
  name: cluster
#...
spec:
  defaultNodeSelector: type=user-node,region=east
#...

该集群中的一个节点具有type=user-node,region=east标签

示例Node对象
apiVersion: v1
kind: Node
metadata:
  name: ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4
#...
  labels:
    region: east
    type: user-node
#...
带有节点选择器的示例Pod对象
apiVersion: v1
kind: Pod
metadata:
  name: s1
#...
spec:
  nodeSelector:
    region: east
#...

当您在示例集群中使用示例 Pod 规范创建 Pod 时,Pod 将使用集群范围的节点选择器创建,并调度到标记的节点上

带有标记节点上 Pod 的示例 Pod 列表
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE                                       NOMINATED NODE   READINESS GATES
pod-s1   1/1     Running   0          20s   10.131.2.6   ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4   <none>           <none>

如果您创建 Pod 的项目具有项目节点选择器,则该选择器优先于集群范围的节点选择器。如果 Pod 不具有项目节点选择器,则不会创建或调度您的 Pod。

项目节点选择器

使用项目节点选择器时,当您在此项目中创建 Pod 时,Red Hat OpenShift Service on AWS 会将节点选择器添加到 Pod 并将 Pod 调度到具有匹配标签的节点上。如果存在集群范围的默认节点选择器,则项目节点选择器优先。

例如,以下项目具有region=east节点选择器

示例Namespace对象
apiVersion: v1
kind: Namespace
metadata:
  name: east-region
  annotations:
    openshift.io/node-selector: "region=east"
#...

以下节点具有type=user-node,region=east标签

示例Node对象
apiVersion: v1
kind: Node
metadata:
  name: ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4
#...
  labels:
    region: east
    type: user-node
#...

当您在此示例项目中使用示例 Pod 规范创建 Pod 时,Pod 将使用项目节点选择器创建,并调度到标记的节点上

示例Pod对象
apiVersion: v1
kind: Pod
metadata:
  namespace: east-region
#...
spec:
  nodeSelector:
    region: east
    type: user-node
#...
带有标记节点上 Pod 的示例 Pod 列表
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE                                       NOMINATED NODE   READINESS GATES
pod-s1   1/1     Running   0          20s   10.131.2.6   ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4   <none>           <none>

如果项目中的 Pod 包含不同的节点选择器,则不会创建或调度该 Pod。例如,如果您将以下 Pod 部署到示例项目中,则不会创建它

带有无效节点选择器的示例Pod对象
apiVersion: v1
kind: Pod
metadata:
  name: west-region
#...
spec:
  nodeSelector:
    region: west
#...

Loki Pod 部署

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

您可以使用 LokiStack 自定义资源 (CR) 将容忍度应用于日志存储 Pod,并使用节点规范将污点应用于节点。节点上的污点是key:value对,它指示节点排斥所有不允许该污点的 Pod。使用其他 Pod 上没有的特定key:value对可确保只有日志存储 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.
...

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

管理员可以通过创建与它支持的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>