Kubernetes DaemonSetsの使用方法と管理

Kubernetes DaemonSetsの使用方法と管理

  • ITOps・DevOps
6分で読めます 更新日 May 7, 2021

ポイント: 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
    kubectl get pod -o wide
Pod全体

上記の出力からわかるように、私たちの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クラスターおよびコンテナのパフォーマンスと信頼性を向上させるために使用される監視、ストレージ、またはログサービスを容易にします。

関連する読み物

これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。

ITOps・DevOpsの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。