DaemonSet

このページでは、Kubernetes DaemonSet オブジェクトと、Google Kubernetes Engine でのその使い方について説明します。

DaemonSet とは何か

他のワークロード オブジェクトと同様に、DaemonSet は複製された Pod のグループを管理します。ただし、DaemonSet は、クラスタ全体またはノードのサブセットに渡って、ノードあたり 1 つの Pod のモデルを維持しようとします。ノードプールにノードが追加されると、DaemonSet は必要に応じて自動的に新しいノードに Pod を追加します。

DaemonSet は、Pod テンプレートを使用します。これには、その Pod の仕様が含まれています。Pod 仕様によって、各 Pod の外観(コンテナ内で実行するアプリケーション、マウントするボリューム、ラベルとセレクタなど)が決定されます。

DaemonSet Pod には、他の Pod と同じ優先順位のルールが適用されます。DaemonSet Pod は taint と許容値を考慮しますが、DaemonSet Pod には暗黙的な許容値があります。

使用パターン

DaemonSet は、すべてのノードまたは特定のノードで実行する必要があり、ユーザーの介入を必要としない、進行中のバックグラウンド タスクのデプロイに便利です。このようなタスクの例としては、ceph などのストレージ デーモン、fluentd などのログ収集デーモン、collectd などのノード モニタリング デーモンがあります。

たとえば、すべてのノードでデーモンのタイプごとに DaemonSet を実行できます。または、1 つのタイプのデーモンに対して複数の DaemonSet を実行することもできますが、ハードウェア タイプやリソースニーズによって異なる設定を使用することもできます。

DaemonSet の作成

DaemonSet を作成するには、kubectl apply または kubectl create を使用します。

DaemonSet マニフェスト ファイルの例を以下に示します。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
  selector:
      matchLabels:
        name: fluentd # Label selector that determines which Pods belong to the DaemonSet
  template:
    metadata:
      labels:
        name: fluentd # Pod template's label selector
    spec:
      nodeSelector:
        type: prod # Node label selector that determines on which nodes Pod should be scheduled
                   # In this case, Pods are only scheduled to nodes bearing the label "type: prod"
      containers:
      - name: fluentd
        image: gcr.io/google-containers/fluentd-elasticsearch:1.20
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi

この例では、

  • metadata: name フィールドで指定された fluentd という名前の DaemonSet が作成されます。
  • DaemonSet の Pod には fluentd というラベルが付けられます。
  • ノードラベル セレクタ(type: prod)は、DaemonSet がその Pod をスケジュールするラベル付きノードで宣言します。
  • Pod のコンテナは、バージョン 1.20fluentd-elasticsearch イメージを pull します。コンテナ イメージは Container Registry によってホストされます。
  • コンテナは 100 m の CPU と 200 Mi のメモリをリクエストします。コンテナは自身のメモリ使用量の合計を 200 Mi 以内に制限します。

要約すると、Pod 仕様には次の手順が含まれています。

  • Pod に fluentd というラベルを付けます。
  • ノードラベル セレクタ type: prod を使用して、一致するノードに合わせて Pod をスケジュールします。ラベルセレクタに対応していないノードに対してスケジュールしないでください(または、すべてのノードに対してスケジュールする場合は、nodeSelector フィールドを省略します)。
  • バージョン 1.20fluentd-elasticsearch を実行します。
  • メモリリソースと CPU リソースをリクエストします。

DaemonSet 構成の詳細については、DaemonSet API リファレンスをご覧ください。

DaemonSet の更新

DaemonSet を更新するには、ポッド仕様、リソースの要求と制限、ラベル、および注釈を変更します。

更新の処理方法を決定するために、DaemonSet により spec: updateStrategy で定義された更新戦略が使用されます。OnDeleteRollingUpdate という 2 つの戦略があります

  • OnDelete は、オブジェクトの構成が変更されたときに DaemonSet Pod を自動的に削除して再作成しません。代わりに、ポッドを手動で削除することにより、変更が反映された新しいポッドをコントローラに作成させる必要があります。
  • RollingUpdate は、DaemonSet Pod を自動的に削除して再作成します。この戦略では、有効な変更によって自動的にロールアウトがトリガーされます。これは DaemonSet のデフォルトの更新戦略です。

更新ロールアウトは、次のコマンドを実行して監視できます。

kubectl rollout status ds daemonset-name

DaemonSet の更新の詳細については、Kubernetes ドキュメントの DaemonSet でローリング更新を実行するをご覧ください。

次のステップ