DaemonSetの設定

DaemonSetは全ノード(物理マシン)にPodを配置していくコントローラーです。たとえば、2ノード構成時、DeploymentでPod数2を指定した場合、片方のマシンで2Pod起動することがありますが、DaemonSetは両ノードで起動します( 公式リファレンス参照)。

Deploymentの設定が完了している場合、YAML設定のうちkindの指定を変更すればDaemonSetとして動作します(非互換のオプションを指定しているとエラーになる可能性はあり)。

Deployment設定の冒頭箇所が以下のようなケースでは、

apiVersion: apps/v1
kind: Deployment

kindにDaemonSetを指定します。

apiVersion: apps/v1
kind: DaemonSet

apiVersionはkubernetes 1.9以降の環境でapps/v1を利用できます。 apiVersionについてはバージョン間で挙動が異なる点があり、旧版は時間をかけて廃止されていくため、k8sのバージョンアップに合わせて更新・検証が必要です( 公式リファレンス参照)。

LoadBalancerからトラフィックが流入してくる場合、WebサーバなどのフロントサーバをDaemonSetで構成すると負荷分散されます。
Deploymentで2pod起動しても1台のノードに乗ってしまうと、けっきょく時分割になってしまい同時に動作しません。コア数が多ければ一定の並列動作も可能かもしれませんが偏りは生じます。

また、送信元IPを直接取得したい場合(HTTPではないサービス)にもDaemonSetは有効です。構成にもよりますが、原則としてkubernetesはNode間のリクエスト転送時に送信元IPを書きかえます。この転送は水面下で自動的に発生するため、全ノードにPodが存在する状態を作れるDaemonSetが1つの対策になります。
ほかにも監視・ロギングのエージェントなどはノードごとに情報収集すべきツールがあるため、この場合にもDaemonSetを活用できます。

中馬崇尋
Chuma Takahiro