記事ディレクトリ
1. DaemonSet コントローラーの理論的知識
1. DaemonSet コントローラーとは何ですか?
Kubernetes の DaemonSet (略称 ds) コントローラーは、デーモン プロセス アプリケーションを実行するために使用されるコントローラーです。これにより、各ノード ノードが指定された構成でポッド コピーを実行することが保証されます。ノード ノードが DaemonSet コントローラーに参加または削除すると、DaemonSet コントローラーが自動的に作成されますまたは、対応するポッド レプリカを削除します。
特徴:
-
ノードごとにインスタンスを 1 つだけ実行する: DaemonSet は、各ノードで Pod インスタンスが 1 つだけ実行されるようにします。これにより、各ノードにデプロイされたデーモンがホストに緊密に結合され、可用性と信頼性が向上します。
-
ローリング アップグレード: DaemonSet を更新する場合、ローリング アップグレードはいくつかの異なる方法で制御できます。すべてのポッド インスタンスを一度に更新することも、新しいバージョンを実行する前に古いポッド インスタンスを段階的に削除することもできます。
-
開始する前にタスクを実行します。DaemonSet を渡すことができます。
2. DaemonSet コントローラーの動作原理
DaemonSet コントローラーは、K8s デーモンセット オブジェクト、ポッド オブジェクト、およびノード オブジェクトを監視します。これらの監視対象オブジェクトが変化すると、syncLoop サイクルがトリガーされ、K8s クラスターが daemonset オブジェクトによって記述された状態に向かって進化できるようになります。
3. DaemonSet の典型的な適用シナリオ
-
ログとメトリックの収集: 各ノードでログとメトリック コレクター (flunentd、logstash、filebeat など) を実行します。
-
データ ストレージ: 各ノードでデータ ストレージ (glusterd、ceph など) を実行します。
-
監視コンポーネント: prometheus、node_exporter、collectd などの監視コンポーネントを各ノードで実行します。
4. DaemonSet と Deployment の違い
- デプロイメントによって作成された Pod は各 Node ノードに分散され、各ノードは複数のコピーを実行できます。
- daemonset によって作成された Pod は、各 Node ノードで最大 1 つの Pod コピーのみを実行できます。これは通常、バックグラウンド サービスとデーモン アプリケーションを実行するために使用されます。
したがって、一般に、バックグラウンド サービスやデーモン プロセスなどの単一ノード アプリケーションをデプロイする場合は DaemonSet を使用でき、Web サービスなどの複雑なアプリケーションをデプロイする必要がある場合は、デプロイメントを使用する必要があります。
2. 事例: DaemonSet コントローラーのデモンストレーション
1. DaemonSet を使用してログ収集コンポーネントをデプロイする
fluentd ログ収集コンポーネントをデプロイします (ELK 全体の実験を行うためではなく、DaemonSet の使用をデモンストレーションするためのみです) YAML リソース リストは次のとおりです。
cat fluentd-daemonset.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: elasticsearch-fluentd
namespace: default
spec:
selector:
matchLabels:
app: elasticsearch-fluentd
template:
metadata:
labels:
app: elasticsearch-fluentd
spec:
tolerations: # 定义容忍度,运行在master节点运行(根据自己master的污点定义)
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
volumes: # 定义卷名称为 system-log
- name: system-log
hostPath:
path: /var/log
containers:
- name: elasticsearch-fluentd
image: qinziteng/fluentd:2.5.1
imagePullPolicy: IfNotPresent
resources: # 定义资源限制
requests:
cpu: 100m
memory: 300Mi
limits:
memory: 300Mi
volumeMounts:
- name: system-log # 使用system-log卷,挂载到容器/var/log目录
mountPath: /var/log
YAML ファイルを実行します。
kubectl apply -f fluentd-daemonset.yaml
以下の図に示すように、ポッドのステータスを表示すると、下請け業者が K8s クラスターの各ノードにポッドを作成していることがわかります。
kubectl get pods -o wide
2. DaemonSet は Pod ローリング アップデートを管理します
DaemonSet 更新戦略はspec.updateStrategy
フィールドで定義されており、現在 2 つの更新戦略をサポートしています。
- rollingUpdate: daemonset は 1 つのノード上で複数の Pod を実行することをサポートしていないため、rollingUpdate の更新戦略では、最初に削除してから更新します。
- OnDelete: デフォルトでは更新は実行されません。手動で削除してから更新する必要があります。
ステップ 1: daemonset リソースを作成し、nginx:1.18.0 ミラーを使用します。YAML は次のとおりです。
cat web-daemonset.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: web-daemonset
namespace: default
spec:
updateStrategy:
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: web-daemonset
template:
metadata:
labels:
app: web-daemonset
spec:
tolerations:
- effect: NoSchedule # 容忍度根据master 污点定义
key: node-role.kubernetes.io/control-plane
containers:
- name: web-daemonset
image: nginx:1.18.0
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 300Mi
limits:
memory: 300Mi
YAML ファイルを実行します。
kubectl apply -f web-daemonset.yaml
ポッドのステータスを確認します。
kubectl get pods -o wide -l app=web-daemonset
ステップ 2: 使用するミラーを更新するnginx:latest
画像の場所のみ変更し、残りの場所は操作せずに再度申請すると有効になります。
kubectl apply -f web-daemonset.yaml
ステップ 3: イメージが更新されていることを確認する
kubectl describe pod web-daemonset-2vtd9|grep Image
イメージのバージョンが正常に更新されたことがわかりますが、この更新は実際には古いバージョンを削除してから、新しいイメージのバージョンを使用して作成するというものです。
3. まとめ
- DaemonSet コントローラーは、指定された Pod レプリカ セットを実行するように各 Node ノードを制御するために使用されます。Node ノードが追加または削除されると、DaemonSet は指定された Pod レプリカ セットを自動的に作成し、各 Node ノードがこの Pod を実行するようにします。ログの収集や監視などのシナリオで使用されます。
- DaemonSet RollingUpdate 更新戦略では、最初に古いバージョンの Pod を削除してから、新しいバージョンの Pod を作成します。これは、各 Node ノードが作成できる Pod レプリカ セットは 1 つだけであるためです。