GNU/Linux >> Linux の 問題 >  >> Cent OS

Kubernetes DaemonSetとは何ですか?その使用方法は?

はじめに

Kubernetesを使用すると、ソフトウェアのデプロイを自動化し、コンテナ化されたアプリケーションを管理し、クラスターを簡単にスケーリングできます。 DaemonSetsを含む幅広いKubernetesオブジェクトは、追加レベルの制御を提供します。

Kubernetes DaemonSetsを使用して、クラスター内のすべての単一ノードに特定のポッドをデプロイします。

この記事では、DaemonSetとは何か、いつ使用するか、作成する方法について説明します。

Kubernetes DaemonSetとは何ですか?

Kubernetesは、アプリケーションに十分なリソースがあり、確実に実行され、ライフサイクル全体で高可用性を維持することを保証します。クラスタ内のアプリの場所は優先事項ではありません。

DaemonSetを使用すると、Kubernetesのスケジューリングの制限を克服し、特定のアプリがクラスター内のすべてのノードにデプロイされるようにします。mデプロイされたポッドには通常、クラスター全体に分散する必要のあるバックグラウンドプロセスが含まれています。

DaemonSetは通常、YAMLファイルを使用して記述されます。 YAMLファイルのフィールドを使用すると、ポッドのデプロイプロセスをさらに制御できます。良い例は、ラベルを利用して、ノードの限られたサブセットで特定のポッドを開始することです。

DaemonSetsはどのように機能しますか?

DaemonSetは、コントローラーによって管理されるアクティブなKubernetesオブジェクトです。特定のポッドがすべてのノードに存在する必要があることを示す、目的の状態を宣言できます。調整制御ループは、目的の状態を現在の観測状態と比較します。監視対象のノードに一致するポッドがない場合、DaemonSetコントローラーは自動的にポッドを作成します。

この自動化されたプロセスには、既存のノードと新しく作成されたすべてのノードが含まれます。 DaemonSetコントローラーによって作成されたポッドは、Kubernetesスケジューラーによって無視され、ノード自体である限り存在します。

DaemonSetは、デフォルトですべてのノードにポッドを作成します。必要に応じて、ノードセレクターを使用して、受け入れ可能なノードの数を制限できます。 DaemonSetコントローラーは、事前定義された nodeSelectorに一致するノードにのみポッドを作成します。 YAMLファイルのフィールド。

DaemonSetを使用する理由

DaemonSetsは、メンテナンスタスクを実行してサービスをサポートするポッドをすべてのノードにデプロイすることにより、クラスターのパフォーマンスを向上させることができます。関連性のあるタイムリーなサービスを提供するには、特定のバックグラウンドプロセス、Kubernetesモニタリングアプリ、その他のエージェントがクラスタ全体に存在する必要があります。

DaemonSetsは、次のような長期実行サービスに非常に適しています。

  • ログコレクション
  • ノードリソースの監視(Prometheusなどのフレームワーク)
  • クラスターストレージ
  • インフラストラクチャ関連のポッド(システム操作)

1つのデーモンセットがすべてのノードに1つのデーモンタイプをデプロイするのが一般的です。ただし、複数のデーモンセットは、異なるラベルを使用して1つのデーモンタイプを制御することもできます。 Kubernetesラベルは、個々のノードの特性に基づいてデプロイルールを指定します。

デーモンセットを作成するには?

YAMLファイルでDaemonSetを記述し、kubectlコマンドを使用してファイルをクラスターに適用できます。

たとえば、 daemonset-node-exporter.yaml 以下のファイルは、Prometheus node-exporterをデプロイします 監視内 名前空間。クラスター内のすべてのノードのハードウェア使用状況メトリックを監視します。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
  labels:
    name: node-exporter
spec:
  template:
    metadata:
      labels:
        name: node-exporter
      annotations:
         prometheus.io/scrape: "true"
         prometheus.io/port: "9100"
    spec:
      hostPID: true
      hostIPC: true
      hostNetwork: true
      containers:
        - ports:
            - containerPort: 9100
              protocol: TCP
          resources:
            requests:
              cpu: 0.15
          securityContext:
            privileged: true
          image: prom/node-exporter:v0.15.2
          args:
            - --path.procfs
            - /host/proc
            - --path.sysfs
            - /host/sys
            - --collector.filesystem.ignored-mount-points
            - '"^/(sys|proc|dev|host|etc)($|/)"'
          name: node-exporter
          volumeMounts:
            - name: dev
              mountPath: /host/dev
            - name: proc
              mountPath: /host/proc
            - name: sys
              mountPath: /host/sys
            - name: rootfs
              mountPath: /rootfs
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: dev
          hostPath:
            path: /dev
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /

Kubernetesコマンドラインインターフェースにアクセスし、新しく作成されたYAMLファイルを適用します:

kubectl apply -f daemonset-node-exporter.yaml

DaemonSetが作成されたことをシステムが確認します。

daemonset-node-exporterを送信したら DaemonSet、 describeで現在の状態を確認します コマンド:

kubectl describe daemonset node-exporter -n monitoring

出力は基本的なDaemonSet情報を提供し、ポッドが使用可能なすべてのノードにデプロイされたことを示します。

次のコマンドを使用して、実行中のすべてのポッドを一覧表示することで、これをさらに確認できます。

kubectl get pod -o wide -n monitoring

DaemonSetは、 node-exporterを継続的にデプロイします。 新しく作成されたすべてのノードへのポッド。

DaemonSetを特定のノードに制限する方法

DaemonSetは、ノードセレクターによって制約されない限り、デフォルトでクラスター内のすべてのノードにポッドを作成します。最初に、必要なラベルのセットをノードのサブセットに追加する必要があります。

kubectl labelを使用してこれを実現します 指図。 ssd=trueを追加します node01にラベルを付ける 次のコマンドでノード:

kubectl label nodes node01 ssd=true

ノードセレクターはnodeSelectorの一部です DaemonSetYAMLファイル内のフィールド。次の例では、DaemonSetは ssd=trueというラベルの付いたノードにのみNginxをデプロイします

apiVersion: apps/v1 
kind: "DaemonSet" 
metadata: 
labels: 
app: nginx 
ssd: "true" 
name: nginx-ssd-storage 
spec: 
template: 
metadata: 
labels: 
app: nginx ssd: "true" 
spec: 
nodeSelector: 
ssd: "true" 
containers: - 
name: nginx 
image: nginx:1.10.0

ssd=trueを追加する 新しいノードへのラベルは、 nginx-ssd-storageをデプロイします そのノードへのポッド。ラベルがノードから削除されると、DaemonSetコントローラーはポッドも削除します。

デーモンセットを更新するには?

OnDelete 更新戦略は、初期のKubernetesバージョン(バージョン1.6より前)でDaemonSetによって管理されているポッドを更新する唯一の方法でした。 OnDelete このアプローチでは、各ポッドを手動で削除する必要があります。そうして初めて、DaemonSetは新しい構成を使用して新しいポッドを作成できます。

最近のKubernetesバージョンでは、デフォルトでローリングアップデートが使用されます。更新戦略は、 spec.updateStrategy.typeを使用して定義されます 分野。デフォルト値はRollingUpdateに設定されています

ローリング更新戦略では、古いポッドが削除され、代わりに新しいポッドが作成されます。プロセスは自動で制御されます。すべてのポッドを同時に削除して作成すると、使用できなくなり、ダウンタイムが長くなる可能性があります。

2つのパラメータを使用して、更新プロセスを制御できます。

  • minReadySeconds ポッドのアップグレード間の期間を定義します。値は秒単位で定義され、適切な時間枠を設定すると、システムが次のポッドの更新に進む前にポッドの状態が確保されます。
  • updateStrategy.rollingUpdate.maxUnavailable 同時にアップグレードできるポッドの数を定義できます。このパラメーターの値は、デプロイされているアプリケーションのタイプに大きく依存します。高可用性を確保するには、速度と安全性のバランスをとる必要があります。

kubectl rolloutを使用します DaemonSetローリングアップグレードのステータスを確認するコマンド:

kubectl rollout status ds/daemonset-node-exporter -n monitoring

システムはDaemonSetの更新を監視し、 node-exporterの現在のロールアウトステータスを通知します。 DaemonSet。

デーモンセットを削除するには?

kubectl deleteを使用してDaemonSetを削除します 指図。削除するDaemonSetの名前を正しく指定してください:

kubectl delete -f daemonset-node-exporter.yaml -n monitoring

このコマンドは注意して使用する必要があります。 DaemonSetを削除すると、問題のDaemonSetがデプロイされているすべてのポッドもクリーンアップされます。


Cent OS
  1. LinuxでのChownコマンドとは何ですか?その使用方法

  2. Chrootの「刑務所」–それは何で、どのように使用するのですか?

  3. public_ftpフォルダーとは何ですか。

  1. Umaskとは何ですか?その使用方法

  2. cURLコマンドとは何ですか?その使用方法は?

  3. Build-Essential-Ubuntu とは何ですか? インストール方法と使用方法は?

  1. Kubernetesシークレット–シークレットを作成、使用、アクセスする方法

  2. lspciコマンド:それは何であり、それを使用する方法

  3. chroot jailとは何ですか?その使用方法は?