×

作为管理员,您可以创建和使用守护进程集,以便在AWS集群上的Red Hat OpenShift Service中的特定节点或所有节点上运行Pod的副本。

守护进程集确保所有(或某些)节点运行Pod的副本。当节点添加到集群时,Pod也会添加到集群。当节点从集群中移除时,这些Pod将通过垃圾回收移除。删除守护进程集将清除它创建的Pod。

您可以使用守护进程集创建共享存储、在集群中的每个节点上运行日志记录Pod或在每个节点上部署监控代理。

出于安全原因,集群管理员和项目管理员可以创建守护进程集。

有关守护进程集的更多信息,请参阅Kubernetes文档

守护进程集调度与项目的默认节点选择器不兼容。如果您未能禁用它,守护进程集将通过与默认节点选择器合并而受到限制。这会导致在被合并的节点选择器取消选择的节点上频繁重新创建Pod,进而给集群带来不必要的负载。

由默认调度器调度

守护进程集确保所有符合条件的节点都运行Pod的副本。通常,Pod运行的节点由Kubernetes调度器选择。但是,守护进程集Pod是由守护进程集控制器创建和调度的。这会带来以下问题

  • 不一致的Pod行为:等待调度的普通Pod处于创建状态并处于Pending状态,但守护进程集Pod并非处于Pending状态。这会让用户感到困惑。

  • Pod抢占由默认调度器处理。启用抢占时,守护进程集控制器将进行调度决策,而不考虑Pod优先级和抢占。

ScheduleDaemonSetPods功能(在AWS上的Red Hat OpenShift Service中默认启用)允许您通过向守护进程集Pod添加NodeAffinity项(而不是spec.nodeName项)来使用默认调度器而不是守护进程集控制器来调度守护进程集。然后使用默认调度器将Pod绑定到目标主机。如果守护进程集Pod的节点亲和性已存在,则将其替换。守护进程集控制器仅在创建或修改守护进程集Pod时执行这些操作,并且不会对守护进程集的spec.template进行任何更改。

kind: Pod
apiVersion: v1
metadata:
  name: hello-node-6fbccf8d9-9tmzr
#...
spec:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchFields:
        - key: metadata.name
          operator: In
          values:
          - target-host-name
#...

此外,node.kubernetes.io/unschedulable:NoSchedule容忍度会自动添加到守护进程集Pod中。默认调度器在调度守护进程集Pod时会忽略不可调度的节点。

创建守护进程集

创建守护进程集时,nodeSelector字段用于指示守护进程集应在其上部署副本的节点。

先决条件
  • 在开始使用守护进程集之前,请通过将命名空间注释openshift.io/node-selector设置为空字符串来禁用命名空间中的默认项目范围节点选择器

    $ oc patch namespace myproject -p \
        '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'

    或者,您可以应用以下YAML以禁用命名空间的默认项目范围节点选择器

    apiVersion: v1
    kind: Namespace
    metadata:
      name: <namespace>
      annotations:
        openshift.io/node-selector: ''
    #...
步骤

创建守护进程集

  1. 定义守护进程集yaml文件

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: hello-daemonset
    spec:
      selector:
          matchLabels:
            name: hello-daemonset (1)
      template:
        metadata:
          labels:
            name: hello-daemonset (2)
        spec:
          nodeSelector: (3)
            role: worker
          containers:
          - image: openshift/hello-openshift
            imagePullPolicy: Always
            name: registry
            ports:
            - containerPort: 80
              protocol: TCP
            resources: {}
            terminationMessagePath: /dev/termination-log
          serviceAccount: default
          terminationGracePeriodSeconds: 10
    #...
    1 确定哪些Pod属于守护进程集的标签选择器。
    2 Pod模板的标签选择器。必须与上面的标签选择器匹配。
    3 确定应在哪些节点上部署Pod副本的节点选择器。节点上必须存在匹配的标签。
  2. 创建守护进程集对象

    $ oc create -f daemonset.yaml
  3. 要验证Pod是否已创建以及每个节点是否都有Pod副本

    1. 查找守护进程集Pod

      $ oc get pods
      示例输出
      hello-daemonset-cx6md   1/1       Running   0          2m
      hello-daemonset-e3md9   1/1       Running   0          2m
    2. 查看Pod以验证Pod是否已放置到节点上

      $ oc describe pod/hello-daemonset-cx6md|grep Node
      示例输出
      Node:        openshift-node01.hostname.com/10.14.20.134
      $ oc describe pod/hello-daemonset-e3md9|grep Node
      示例输出
      Node:        openshift-node02.hostname.com/10.14.20.137
  • 如果您更新守护进程集 Pod 模板,则现有 Pod 副本不受影响。

  • 如果您删除一个守护进程集,然后创建一个具有不同模板但相同标签选择器的新守护进程集,它会识别任何现有 Pod 副本具有匹配的标签,因此尽管 Pod 模板不匹配,也不会更新它们或创建新的副本。

  • 如果您更改节点标签,守护进程集会将 Pod 添加到与新标签匹配的节点,并从与新标签不匹配的节点中删除 Pod。

要更新守护进程集,请通过删除旧副本或节点来强制创建新的 Pod 副本。