ポイント: Kubernetes DaemonSetsは、特定のポッドがすべてのノードで実行されることを保証し、ログ記録や監視などのタスクを管理し、ノードが追加または削除されると自動的にポッドを作成および削除します。
- YAMLファイルを使用して構成され、ポッド展開のさまざまなカスタマイズを可能にします。
- Kubernetesクラスター内のすべてのノードにわたってFluentdやPrometheusなどのサービスの展開を容易にします。
Kubernetesは、コンテナ化されたアプリケーションをオーケストレートするリーディングオープンソースエンジンです。この記事では、Kubernetesが提供するDaemonSet機能を見ていきます。ユースケースと、DaemonSetsを作成、更新、通信、削除する方法について説明します。
Kubernetes DaemonSetとは何ですか?
DaemonSet機能は、あなたのポッドの一部またはすべてが、すべての利用可能なノードでスケジュールされ、実行されることを保証するために使用されます。これは本質的に、すべてのノードにわたって希望するポッドのコピーを実行します。
- 新しいノードがKubernetesクラスターに追加されると、新しいポッドがその新しく接続されたノードに追加されます。
- ノードが削除されると、DaemonSetコントローラーはそのノードに関連付けられたポッドがガーベジコレクションされることを保証します。DaemonSetを削除すると、DaemonSetが作成したすべてのポッドがクリーンアップされます。
DaemonSetsはKubernetesクラスターの不可欠な部分であり、管理者がすべてのノードまたはそのサブセットにわたってサービス(ポッド)を簡単に構成できるようにします。
DaemonSetのユースケース
DaemonSetsは、すべてのノードにわたってポッドを展開することにより、Kubernetesクラスターのパフォーマンスを向上させることができます。これにより、メンテナンスタスクやサポートサービスを分散できます。監視やログ収集のような長時間実行されるサービスに適しています。以下はDaemonSetsのユースケースの例です:
- 各ノードでクラスターのストレージ用のデーモンを実行するため、glusterdやcephなど。
- 各ノードでログ収集用のデーモンを実行するため、Fluentdやlogstashなど。
- すべてのノードでノード監視を実行するため、Prometheus Node Exporter、collectd、またはDatadogエージェントなど。
要件に応じて、異なるフラグ、メモリ、CPUなどを持つ単一のタイプのデーモンに対して複数のDaemonSetsをセットアップできます。これにより、さまざまな構成やハードウェアタイプをサポートできます。
DaemonSetポッドのスケジューリング
デフォルトでは、ポッドが実行されるノードはKubernetesスケジューラーによって決定されます。ただし、DaemonSetポッドはDaemonSetコントローラーによって作成およびスケジュールされます。DaemonSetコントローラーを使用すると、ポッドの動作が不一致になる可能性やポッドの優先順位の先取に問題が発生することがあります。これらの問題を緩和するために、Kubernetes(ScheduleDaemonSetPods)では、ユーザーがDaemonSetコントローラーではなくデフォルトのスケジューラーを使用してDaemonSetsをスケジュールできるようにします。これは、.spec.nodeNameタームの代わりにDaemonSetポッドにNodeAffinityタームを追加することで行われます。その後、デフォルトのスケジューラーがポッドをターゲットホストにバインドするために使用されます。以下はNodeAffinity設定のサンプルです:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
# Key Name
- key: disktype
operator: In
# Value
values:
- ssd
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
上記のように、"disktype=ssd"ラベルを持つノードでのみポッドが作成されるようにNodeAffinityを設定しました。さらに、DaemonSetポッドはKubernetesのタイントとトレランスに従います。node.kubernetes.io/unschedulable:NoScheduleトレランスはDaemonSetポッドに自動的に追加されます。(タイントとトレランスに関する詳細はKubernetesの公式ドキュメントを参照してください。)
DaemonSetを作成する方法
Kubernetesの他のすべてのコンポーネントと同様に、DaemonSetsはYAMLファイルを使用して構成されます。DaemonSetファイルの構造を見てみましょう。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: test-daemonset
namespace: test-daemonset-namespace
Labels:
app-type: test-app-type
spec:
template:
metadata:
labels:
name: test-daemonset-container
selector:
matchLabels:
name: test-daemonset-container
上記の構造に見られるように、apiVersion、kind, およびmetadata は、すべてのKubernetesマニフェストで必要なフィールドです。DaemonSet特有のフィールドはspecセクションに含まれ、これらのフィールドも必須です。
- template. これは、すべてのノードに展開される必要のあるポッドの定義です。DaemonSetのポッドテンプレートには、RestartPolicyを"Always"に設定する必要があります。デフォルトでは、RestartPolicyを指定していない場合は"Always"が使用されます。
- selector. DaemonSetによって管理されるポッドのセレクターです。この値はポッドテンプレートに指定されたラベルでなければなりません。(上記の例では、name: test-daemonset-containerをセレクターとして使用しました。)この値は固定されており、DaemonSetの最初の作成後は変更できません。この値を変更すると、そのDaemonSetを介して作成されたポッドが孤立します。Kubernetesは、複雑なセレクターを作成するためにmatchLabelsとmatchExpressionsの2つの方法を提供しています。
他のオプションのフィールド
- template.spec.nodeSelector - これは、指定されたセレクターに一致するポッドを作成するノードのサブセットを指定するために使用できます。
- template.spec.affinity - このフィールドは、ポッドを構成されたアフィニティに一致するノードでのみ実行するように設定するために構成できます。
DaemonSetの作成
それでは、サンプルDaemonSetを作成してみましょう。ここでは、Kubernetesクラスターのすべてのノードで実行される"fluentd-elasticsearch"イメージを使用します。それぞれのポッドはログを収集し、データをElasticSearchに送信します。
daemonset-example.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch-test
namespace: default # Name Space
labels:
k8s-app: fluentd-logging
spec:
selector: # Selector
matchLabels:
name: fluentd-elasticsearch-test-deamonset
template: # Pod Template
metadata:
labels:
name: fluentd-elasticsearch-test-deamonset
spec:
tolerations: # Tolerations
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers: # Container Details
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
まず、kubectl createコマンドを使用してDaemonSetを作成し、次にDaemonSetとポッドの情報を以下のように取得します:
kubectl create -f daemonset-example.yaml
kubectl get daemonset
kubectl get pod -o wide
上記の出力からわかるように、私たちのDaemonSetは正常に展開されました。クラスターに利用可能なノードに応じて、構成のノード数に一致するように自動的にスケーリングされます。(ここでは、単一ノードのKubernetesクラスターで実行しているため、ノード数は1になります。)
DaemonSetsの更新
DaemonSetsの更新に関しては、ノードラベルが変更されると、DaemonSetは自動的に一致するノードに新しいポッドを追加し、一致しないノードからポッドを削除します。以下のように、"kubectl apply"コマンドを使用してDaemonSetを更新できます。
DaemonSetsを更新する際に従うことができる2つの戦略があります:
- Kubernetesのデフォルト戦略、これにより古いDaemonSetポッドが削除され、DaemonSetテンプレートが更新されると新しいポッドが自動的に作成されます。
- このオプションを使用すると、新しいDaemonSetポッドは、ユーザーが手動で古いDaemonSetポッドを削除した後にのみ作成されます。
これらの戦略はspec.updateStrategy.typeオプションを使用して構成できます。
DaemonSetsの削除
DaemonSetを削除するのは簡単なタスクです。それを行うには、単にDaemonSetを指定してkubectl deleteコマンドを実行します。これにより、DaemonSetとそれが作成したすべての基盤ポッドが削除されます。
kubectl deleteコマンドにcascade=falseフラグを使用して、ポッドを削除せずにDaemonSetのみを削除できます。
DaemonSetによって作成されたポッドとの通信
DaemonSetsによって作成されたポッドとの通信方法はいくつかあります。以下に利用可能なオプションを示します:
- プッシュ。 この方法では、ポッドを他のサービス(監視サービス、統計データベース)に情報を送信するように構成できます。ただし、データを受信することはありません。
- NodeIP&既知のポート。 ポッドはhostPortを使用してノードIP経由で到達可能です。ユーザーはその後、既知のポートとノードIPを使用してポッドと通信できます。
- DNS。 この方法では、ユーザーは同じポッドセレクターを持つヘッドレスサービスを構成して、エンドポイントリソースを使用してDaemonSetを発見できます。
- サービス。 DaemonSet内のランダムノードを選択するために、同じポッドセレクターを使用してサービスを作成できます。
DaemonSetの概要
この記事では、Kubernetes DaemonSetsについて学びました。これらの構成は、Kubernetesクラスターおよびコンテナのパフォーマンスと信頼性を向上させるために使用される監視、ストレージ、またはログサービスを容易にします。
関連する読み物
Kubernetesガイド
- Kubernetesとは(K8s)?Kubernetes基本チュートリアル
- Kubernetesクラスター効率を向上させるためのベストプラクティス
- ベストプラクティス:Kubernetes向けのアプリケーションの設計
- Kubernetes Pods:入門
- Kubernetes ReplicaSets:簡潔な紹介
- Kubernetes Deployments完全解説
- Kubernetes DaemonSetsの使用方法と管理
- Kubernetesサービスの仕組み
- Kubernetes Port、TargetPort、およびNodePortの使用
- KubernetesにおけるConfigMapsの作成と使用
- Kubernetes Secretsの紹介
- Kubernetesネットワーキングの基本
- Kubernetes Ingressの説明
- Kubernetes Helm Chartsの紹介
- Kubernetesオペレーターパターンとは?
- KubernetesでのStatefulSetとしてのPostgreSQLの展開
- Kubernetesカスタムリソース定義(CRDs)の説明
- クラウドネイティブアプリケーションのための3つのKubernetesパターン
- Kubernetesコンピューティングリソースの説明
- DevOpsパイプラインのためのKubernetesセキュリティ
- Kubernetesでの継続的配信のためのSpinnakerの使用
- Kubernetesマルチクラスター:使用方法と理由
- Kubernetesモニタリング:包括的ガイド
- Kubernetes対Docker:簡単な比較
- Kubernetes対Docker Swarm:コンテナオーケストレーションツールの比較
- Kubernetes対OpenShift:違いは何ですか?
- Kubernetes認定:認定を取得する方法と理由
これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。