このページでは、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.20
のfluentd-elasticsearch
イメージを pull します。コンテナ イメージは Container Registry によってホストされます。 - コンテナは 100 m の CPU と 200 Mi のメモリをリクエストします。コンテナは自身のメモリ使用量の合計を 200 Mi 以内に制限します。
要約すると、Pod 仕様には次の手順が含まれています。
- Pod に
fluentd
というラベルを付けます。 - ノードラベル セレクタ
type: prod
を使用して、一致するノードに合わせて Pod をスケジュールします。ラベルセレクタに対応していないノードに対してスケジュールしないでください(または、すべてのノードに対してスケジュールする場合は、nodeSelector
フィールドを省略します)。 - バージョン
1.20
でfluentd-elasticsearch
を実行します。 - メモリリソースと CPU リソースをリクエストします。
DaemonSet 設定の詳細については、DaemonSet API リファレンスをご覧ください。
DaemonSet の更新
DaemonSet を更新するには、ポッド仕様、リソースの要求と制限、ラベル、および注釈を変更します。
更新の処理方法を決定するために、DaemonSet により spec: updateStrategy
で定義された更新戦略が使用されます。OnDelete
と RollingUpdate
という 2 つの戦略があります
OnDelete
は、オブジェクトの構成が変更されたときに DaemonSet Pod を自動的に削除して再作成しません。代わりに、ポッドを手動で削除することにより、変更が反映された新しいポッドをコントローラに作成させる必要があります。RollingUpdate
は、DaemonSet Pod を自動的に削除して再作成します。この戦略では、有効な変更によって自動的にロールアウトがトリガーされます。これは DaemonSet のデフォルトの更新戦略です。
更新ロールアウトは、次のコマンドを実行してモニタリングできます。
kubectl rollout status ds daemonset-name
DaemonSet の更新の詳細については、Kubernetes ドキュメントの DaemonSet でローリング更新を実行するをご覧ください。