Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Part-93: 🚀 To Implement the K8s DaemonSets in Google Kubernetes Engine (GCP)

2025年09月27日に「Dev.to」が公開したITニュース「Part-93: 🚀 To Implement the K8s DaemonSets in Google Kubernetes Engine (GCP)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

KubernetesのDaemonSetは、クラスター内の全ノードに特定のPodを確実に1つずつ配置する機能だ。ログ収集や監視といったシステムレベルの共通処理に利用され、ノードの増減に自動で対応する。

ITニュース解説

Kubernetes(クーバネティス)というシステムを使ってアプリケーションを運用する際、複数のアプリケーションのコピー(Pod)を効率的に動かす方法の一つにDeployment(デプロイメント)がある。Deploymentは、指定した数のPodをクラスター全体に分散して配置し、常にその数を維持する役割を持つ。しかし、もしクラスター内のすべてのサーバー(Node)で、特定のPodを必ず一つずつ実行したい、という特別な要件があったらどうすればよいだろうか。そのような場合に利用するのがDaemonSet(デーモンセット)という機能である。

DaemonSetは、「各Nodeに特定のPodのコピーを一つずつ、常に実行し続ける」ことを保証するKubernetesのリソースである。この特性は、Deploymentとは大きく異なる。Deploymentがアプリケーションの負荷分散や高可用性を目的とするのに対し、DaemonSetはクラスター全体の運用に必要なシステムレベルのサービスを実行するために設計されている。DaemonSetが管理するPodは、クラスター内でNodeが追加されると自動的にそのNodeにもPodが配置され、Nodeが削除されるとそのNode上のPodも自動的に削除される。また、DaemonSet自体を削除すると、それによって作成されたすべてのPodもクリーンアップされる。このように、DaemonSetはクラスターの構成変更に柔軟に対応しながら、Podの「各Nodeに一つ」という状態を維持し続ける。

DaemonSetが活用される具体的な場面は、一般的なユーザーアプリケーションの実行ではなく、クラスター全体のインフラストラクチャを支える役割を担うサービスが多い。例えば、ストレージ管理を行うためのエージェントが挙げられる。CephやGlusterFSのような分散ストレージシステムでは、各Nodeに専用のエージェントを配置して、ストレージのリソースを管理する必要がある。このような用途にDaemonSetは最適である。次に、ログ収集のデーモンもよくある例だ。アプリケーションやシステムの動作状況を記録するログは、各Nodeで発生するため、Fluentd(フルーエントディー)やLogstash(ログスタッシュ)、Filebeat(ファイルビート)といったログ収集ツールを各Nodeに配置し、集約サーバーへ転送する際にDaemonSetが利用される。さらに、クラスター内の各Nodeの状態を監視するエージェントもDaemonSetの重要な利用例である。Prometheus Node Exporter(プロメテウス・ノード・エクスポーター)やDatadog Agent(データドッグ・エージェント)のような監視ツールは、各NodeのCPU使用率、メモリ使用量、ディスクI/Oなどのメトリクス(性能指標)を収集するために、各Node上で実行される必要がある。これらのシステムレベルのタスクは、DaemonSetの特性と非常に相性が良い。

実際にDaemonSetをKubernetesクラスターにデプロイするには、設定ファイルを作成し、kubectlコマンドで適用する手順を踏む。まず、daemonset.yamlという名前でYAML形式の設定ファイルを作成する。

このファイルは以下の内容で構成される。 apiVersion: apps/v1:Kubernetes APIのバージョンを指定する。apps/v1はアプリケーション関連のリソースを扱うためのバージョンである。 kind: DaemonSet:作成するKubernetesリソースの種類がDaemonSetであることを明示する。 metadata::リソースに関するメタデータ(付加情報)を定義する部分である。 name: myapp1-daemonset:このDaemonSetに与える名前を指定する。 namespace: default:Podが配置される名前空間を指定する。defaultは特に指定しない場合の標準の名前空間である。 labels::リソースを識別するためのラベルを設定する。app: myappというラベルは、このDaemonSetを他のリソースと区別するために使われる。 spec::DaemonSetの具体的な動作に関する仕様を定義する部分である。 selector::DaemonSetがどのPodを管理するかを識別するためのセレクターを定義する。 matchLabels:metadata.labelsと一致するPodを探すように指定する。 app: myappapp: myappというラベルを持つPodを管理対象とする。 template::DaemonSetによって作成されるPodのテンプレートを定義する。このテンプレートに従って各NodeにPodが作成される。 metadata::Podのメタデータを定義する。 labels::Podにもapp: myappというラベルを設定する。これにより、selectorでこのPodが選択される。 spec::Podの仕様を定義する。 containers::Pod内で実行されるコンテナのリストを定義する。 - name: myapp-container:コンテナの名前を指定する。 image: ghcr.io/stacksimplify/kubenginx:1.0.0:コンテナが使用するDockerイメージのパスとバージョンを指定する。このイメージが各Nodeで実行される。

このdaemonset.yamlファイルが準備できたら、kubectl apply -f kube-manifests/daemonset.yamlというコマンドを実行して、KubernetesクラスターにDaemonSetをデプロイする。kube-manifests/daemonset.yamlは、設定ファイルが置かれているパスを指す。デプロイが完了したら、kubectl get daemonsetまたはkubectl get dsコマンドでDaemonSetが正しく作成されたかを確認できる。さらに、kubectl get pods -o wideコマンドを実行すると、DaemonSetによって作成されたPodが、クラスター内のどのNodeに配置されているかを一覧で確認できる。ここで、指定したNodePool(Nodeのグループ)にPodが一つずつスケジュールされていることが確認できれば、DaemonSetは正常に動作していると言える。

運用が終わり、不要になったDaemonSetや関連リソースはクリーンアップする必要がある。kubectl delete -f kube-manifests/daemonset.yamlコマンドでDaemonSetとそのPodを削除する。さらに、もしNodePoolも手動で作成していた場合は、gcloud container node-pools delete "linuxapps-nodepool" --cluster "standard-public-cluster-1" --location "us-central1"のようなコマンドでNodePoolも削除し、リソースを完全に解放する。

まとめると、DaemonSetはKubernetesクラスター内で、各Nodeに特定のPodを一つずつ確実に実行させたい場合に利用する重要なリソースである。ログ収集、監視、ストレージ管理といったシステムレベルのサービスに特に適しており、クラスターのNodeの増減に合わせてPodの配置も自動的に調整されるため、運用が非常に効率的になる。Deploymentとは異なる目的で使われるDaemonSetの特性を理解することで、Kubernetesをより効果的に活用できるようになるだろう。

関連コンテンツ

関連IT用語