第24章 Daemonset の使用

24.1. 概要

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

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

セキュリティー上の理由により、クラスター管理者のみが daemonset を作成できます。 (ユーザーへの Daemonset パーミッションの付与)

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

重要

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

そのため、以下に留意してください。

  • DeamonSet の使用を開始する前に、namespace のアノテーション openshift.io/node-selector を空の文字列に設定することで、namespace のプロジェクト全体のデフォルトのノードセレクターを無効にします。
# oc patch namespace myproject -p \
    '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'
  • 新規プロジェクトを作成している場合、oc adm new-project --node-selector="" を使用してデフォルトのノードセレクターを上書きします。

24.2. Daemonset の作成

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

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

DaemonSet を更新するには、以前のレプリカまたはノードを削除して新規の pod レプリカを強制的に作成します。