はじめに
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がデプロイされているすべてのポッドもクリーンアップされます。