第3章 ジョブと DeamonSet の使用

3.1. DeamonSet によるノード上でのバックグラウンドタスクの自動的な実行

管理者は、DeamonSet を作成して OpenShift Container Platform クラスター内の特定の、またはすべてのノードで Pod のレプリカを実行するために使用できます。

DeamonSet は、すべて (または一部) のノードで Pod のコピーが確実に実行されるようにします。ノードがクラスターに追加されると、Pod がクラスターに追加されます。ノードがクラスターから削除されると、Pod はガベージコレクションによって削除されます。DeamonSet を削除すると、DeamonSet によって作成された Pod がクリーンアップされます。

DeamonSet を使用して共有ストレージを作成し、クラスター内のすべてのノードでロギング Pod を実行するか、またはすべてのノードでモニターエージェントをデプロイできます。

セキュリティー上の理由から、 クラスター管理者のみが DeamonSet を作成できます。

daemonset についての詳細は、Kubernetes ドキュメントを参照してください。

重要

Daemonset のスケジューリングにはプロジェクトのデフォルトノードセレクターとの互換性がありません。これを無効にしない場合、daemonset はデフォルトのノードセレクターとのマージによって制限されます。これにより、マージされたノードセレクターで選択解除されたノードで Pod が頻繁に再作成されるようになり、クラスターに不要な負荷が加わります。

3.1.1. デフォルトスケジューラーによるスケジュール

DeamonSet は、適格なすべてのノードで Pod のコピーが確実に実行されるようにします。通常は、Pod が実行されるノードは Kubernetes のスケジューラーが選択します。ただし、これまで DeamonSet Pod は DeamonSet コントローラーが作成し、スケジュールしていました。その結果、以下のような問題が生じています。

  • Pod の動作に一貫性がない。スケジューリングを待機している通常の Pod は、作成されると Pending 状態になりますが、DeamonSet Pod は作成されても Pending 状態になりません。これによりユーザーに混乱が生じます。
  • Pod のプリエンプションがデフォルトのスケジューラーで処理される。プリエンプションが有効にされると、DeamonSet コントローラーは Pod の優先順位とプリエンプションを考慮することなくスケジューリングの決定を行います。

ScheduleDaemonSetPods は、OpenShift Container Platform ではデフォルトで有効にされています。これにより、.spec.nodeName の term ではなく NodeAffinity の term を DeamonSet Pod に追加することで、DeamonSet コントローラーではなくデフォルトのスケジューラーを使って DeamonSet をスケジュールすることができます。その後、デフォルトのスケジューラーは、Pod をターゲットホストにバインドさせるために使用されます。DeamonSet Pod のノードアフィニティーがすでに存在する場合、これは置き換えられます。DeamonSet コントローラーは、DeamonSet Pod を作成または変更する場合にのみこれらの操作を実行し、DeamonSet の spec.template は一切変更されません。

nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchFields: - key: metadata.name operator: In values: - target-host-name

さらに、node.kubernetes.io/unschedulable:NoSchedule の容認が DeamonSet Pod に自動的に追加されます。デフォルトのスケジューラーは、DeamonSet Pod をスケジュールするときに、スケジュールできないノードを無視します。

3.1.2. DeamonSet の作成

daemonset の作成時に、nodeSelector フィールドは daemonset がレプリカをデプロイする必要のあるノードを指定するために使用されます。

前提条件

  • DeamonSet の使用を開始する前に、namespace のアノテーション openshift.io/node-selector を空の文字列に設定することで、namespace のプロジェクト全体のデフォルトのノードセレクターを無効にします。

    $ oc patch namespace myproject -p \
        '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'
  • 新規プロジェクトを作成している場合、oc adm new-project <name> --node-selector="" を使用してデフォルトのノードセレクターを上書きします。

手順

DeamonSet を作成するには、以下を実行します。

  1. daemonset yaml ファイルを定義します。

    apiVersion: extensions/v1beta1
    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
    daemonset に属する Pod を判別するラベルセレクターです。
    2
    Pod テンプレートのラベルセレクターです。上記のラベルセレクターに一致している必要があります。
    3
    Pod レプリカをデプロイする必要があるノードを判別するノードセレクターです。一致するラベルがこのノードに存在する必要があります。
  2. daemonset オブジェクトを作成します。

    $ oc create -f daemonset.yaml
  3. Pod が作成されていることを確認し、各 Pod に Pod レプリカがあることを確認するには、以下を実行します。

    1. daemonset 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
重要
  • DeamonSet Pod テンプレートを更新しても、既存の Pod レプリカには影響はありません。
  • DeamonSet を削除してから、異なるテンプレートと同じラベルセレクターを使用して新規の DeamonSet を作成する場合に、既存の Pod レプリカについてラベルが一致していると認識するため、既存の Pod レプリカは更新されず、Pod テンプレートで一致しない場合でも新しいレプリカが作成されます。
  • ノードのラベルを変更する場合には、DeamonSet は新しいラベルと一致するノードに Pod を追加し、新しいラベルと一致しないノードから Pod を削除します。

daemonset を更新するには、古いレプリカまたはノードを削除して新規の pod レプリカの作成を強制的に実行します。