Category: 入門編
2024.02.05
目次
Kubernetes を利用する際、特に運用上で重要となる要素とは?DaemonSetについて分かりやすく解説
クラウド環境への移行は、現代の企業にとって不可欠なステップです。DaemonSetは、クラウド環境におけるアプリケーションの運用を効率化し、高い可用性とスケーラビリティを実現するための核となる技術として注目されています。
本記事では Kubernetes DaemonSet (以下、 DaemonSet )について、その概要や役割、設定と運用の注意点などについて解説します。
1. Kubernetes DaemonSet とは?
Kubernetesは、多数のコンテナの調整と管理の自動化によって、コンテナの統合的な管理を容易にするコンテナオーケストレーションソフトウェアです。
DaemonSetは、Kubernetesクラスタ内の各ノード( Node )で特定の Pod が常に実行されるように保証する役割を果たすワークロードリソースです。
図版出典:Qiita
DaemonSet は、Node がクラスタに追加されるとき、その Node 上に特定の Pod を作成します。また、Node がクラスタから削除されると、 DaemonSet が作成した Pod はガベージコレクタにより削除されます。
これにより、ログ収集やモニタリングなどの機能をクラスタ内のすべてのノードで一貫して実行することが可能になります。
ReplicaSetとStatefulSet
Kubernetesにおいて、DaemonSet と似たワークロードリソースに ReplicaSet と StatefulSet があります。
ReplicaSet はクラスタ上に、特定数の Pod を配置し、スケール管理を行いますが、各 Node 上の Pod の数は均等ではなく、必ずしも各 Node 上に Pod が配置されるわけではありません。一方で、DaemonSet は各 Node に確実に 1Pod ずつが配置されます。
StatefulSet は、Web アプリケーションやデータベースのように状態を保持する必要があるアプリケーション用に設計されています。ReplicaSet が一般的な用途に適しているのに対して、StatefulSet は可用性を高めたい場合や状態の維持する必要があるアプリケーションに特化している点が異なります。
2. DaemonSet の用途
DaemonSet は各 Node で単一の Pod のコピーを稼働させるという特性から、以下のような用途に特に適しています。
ログ収集
各 Node 上でログ収集デーモン(例えば、FluentdやLogstash)を稼働させ、ログ情報の収集と保存を行います。
モニタリング
各 Node のパフォーマンス情報の監視、収集と保存を行います。モニタリング用ソフトウェアには Prometheus Node Exporter 、 collectd 、 Datadog Agent などがあります。
分散ストレージ
分散ストレージソフトウェア(例えば、Ceph、Gluster、Longhorn)を運用する際にも利用されます。ここで言うストレージは、 Kubernetes を用いて構築されるストレージを指します。
3. DaemonSet の設定
DaemonSet の設定は YAML ファイルの編集によって行います。他の Kubernetes オブジェクトと同様に、下記フィールドは必須です。
- apiVersion : 使用する Kubernetes API バージョン
- kind : オブジェクト種類として “DaemonSet” をセット
- metadata : 識別のための情報
- spec : DaemonSet の仕様情報
また、spec 以下の下記フィールドも必須となります。
- spec.template : Pod のテンプレート
- spec.selector : Pod のセレクタ
spec.selector は spec.template 中のラベルと一致する必要があります。この値を DaemonSet 作成後に変更すると、意図しない Pod の孤立が起こり得るので注意が必要です。
設定ファイルの変更は、Git 等のバージョン管理システムで管理し、予期せぬ動作時のロールバックやクラスタの再作成を可能にしておくことをおすすめします。
選択した Node 上で Pod を稼働させる設定
nodeSelector 、または nodeAffinity の指定により、選択した Node 上だけで Pod を稼働させる設定が可能です。逆に nodeSelector と nodeAffinity のどちらも指定しなければ、全ての Node 上に Pod が作成されます。
スケジューリング
Kubernetes におけるスケジューリングとは、 Pod を Node 上に割り当てて稼働させることを指します。
不適切な Node 上に Pod がスケジューリングされることを防ぐ仕組みとして Taint と Toleration があり、 DaemonSet では下記の node.kubernetes.io 以下の Toleration が自動的に設定され、全ての利用可能 Node が Pod のコピーを稼働させることを保証しています。
- disk-pressure
- memory-pressure
- network-unavailable
- not-ready
- pid-pressure
- unreachable
- unschedulable
独自に他の Toleration を追加することも可能です。
DaemonSet の代替案
特定の Node 上で Pod が稼働させる設定を、 DaemonSet を使用せずに行う方法もあります。しかし、 Node 障害時やメンテナンス時の停止や、削除された Pod を再配置するDaemonSetの利点を活用することができません。
代わりに、systemd や Upstart などを使用して、 デーモンプロセスを直接起動する方法もありますが、DaemonSetを利用することで、これらのデーモンプロセスの設定や監視をアプリケーションと共通のツールや方法で行うことができます。これにより、運用上の負担を軽減することが可能です。
4. DaemonSet の運用とセキュリティにおける留意点
DaemonSetの運用とセキュリティの留意点に関して、いくつか重要なポイントを紹介します。
ローリングアップデートに関する注意点
DaemonSet テンプレートを更新すると、古いテンプレートで作成された Pod は削除され、新しいテンプレートでの Pod が自動的に作成されます。
このローリングアップデートは 1Pod ずつ行われますが、以下のような場合に処理が途中で停止してしまうことがあります。
- Node がメモリなどのリソース不足に陥る:この場合は、スケジュールされていない Node を特定し、その Node 上の DaemonSet 以外で起動されている Pod を削除してリソースを空ける必要があります。
- 更新したテンプレートに誤りがある:この場合は、テンプレートを正しく修正しましょう。正しく修正されれば、前回の停止に関わりなくローリングアップデートが実行されます。
DaemonSet で管理する Pod の動作に起因する障害の例
ログ収集デーモン Fluentdが、Nodeのスケールダウン時に未転送のログデータを残してしまうことがあります。
この問題を防ぐためには、Nodeの停止前にバッファ内のデータを処理する工夫が必要です。この処理によりPodの終了が遅れる場合、terminationGracePeriodSeconds(デフォルトは30秒)の変更が必要となる場合もあるでしょう。
セキュリティに関する留意点
セキュリティ面では、例えばMoneroマイニングを行うkube-controllerというDaemonSetが不正にデプロイされた事例があります。
このような不正なDaemonSetを発見した場合、そのワークロードを削除することで関連する全てのPodを削除できます。
5. まとめ
本記事では、Kubernetes DaemonSetの重要性とその適切な設定および管理方法について解説しました。DaemonSetは、Kubernetesを使ったアプリケーション運用において不可欠な要素であり、高い可用性と拡張性を実現します。
しかし、その効果的な設定と管理には専門的な知識が必要です。専門知識が不足している場合は、ベンダーやシステムインテグレーターに相談することも有効な手段となるでしょう。
Kubernetes の運用をサポートしてほしい
Contactお問い合わせ
お見積もり・ご相談など、お気軽にお問い合わせください。