【Kubernetesリソース記事】DaemonSetコントローラーエントリー実践詳細解説

1. DaemonSet コントローラーの理論的知識

中国の公式文書参照:

1. DaemonSet コントローラーとは何ですか?

Kubernetes の DaemonSet (略称 ds) コントローラーは、デーモン プロセス アプリケーションを実行するために使用されるコントローラーです。これにより、各ノード ノードが指定された構成でポッド コピーを実行することが保証されます。ノード ノードが DaemonSet コントローラーに参加または削除すると、DaemonSet コントローラーが自動的に作成されますまたは、対応するポッド レプリカを削除します。

特徴:

  1. ノードごとにインスタンスを 1 つだけ実行する: DaemonSet は、各ノードで Pod インスタンスが 1 つだけ実行されるようにします。これにより、各ノードにデプロイされたデーモンがホストに緊密に結合され、可用性と信頼性が向上します。

  2. ローリング アップグレード: DaemonSet を更新する場合、ローリング アップグレードはいくつかの異なる方法で制御できます。すべてのポッド インスタンスを一度に更新することも、新しいバージョンを実行する前に古いポッド インスタンスを段階的に削除することもできます。

  3. 開始する前にタスクを実行します。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

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-rtDxDp8l-1687509544696) (D:\MD Archives\IMG\image-20230623161952395.png) )]

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

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-4HXmpoUM-1687509544702) (D:\MD Archives\IMG\image-20230623162346648.png) )]

ステップ 2: 使用するミラーを更新するnginx:latest

画像の場所のみ変更し、残りの場所は操作せずに再度申請すると有効になります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-R9t4TPjr-1687509544704) (D:\MD Archives\IMG\image-20230623162435864.png) )]

kubectl apply -f web-daemonset.yaml

ステップ 3: イメージが更新されていることを確認する

kubectl describe pod web-daemonset-2vtd9|grep Image

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-TpUqXnXf-1687509544705) (D:\MD Archives\IMG\image-20230623163222395)。 png)]

イメージのバージョンが正常に更新されたことがわかりますが、この更新は実際には古いバージョンを削除してから、新しいイメージのバージョンを使用して作成するというものです。

3. まとめ

  • DaemonSet コントローラーは、指定された Pod レプリカ セットを実行するように各 Node ノードを制御するために使用されます。Node ノードが追加または削除されると、DaemonSet は指定された Pod レプリカ セットを自動的に作成し、各 Node ノードがこの Pod を実行するようにします。ログの収集や監視などのシナリオで使用されます。
  • DaemonSet RollingUpdate 更新戦略では、最初に古いバージョンの Pod を削除してから、新しいバージョンの Pod を作成します。これは、各 Node ノードが作成できる Pod レプリカ セットは 1 つだけであるためです。

おすすめ

転載: blog.csdn.net/weixin_45310323/article/details/131351965