什么是 DaemonSet?
编写 DaemonSet 规约
必需字段
Pod 模板
Pod Selector
仅在某些节点上运行 Pod
如何调度 Daemon Pod
与 Daemon Pod 通信
更新 DaemonSet
DaemonSet 的可替代选择
init 脚本
裸 Pod
静态 Pod
Replication Controller
DaemonSetは何ですか?
すべて(または一部)のノード上のポッドのコピーを実行してくださいDaemonSet。ノードが参加すると、クラスタは、彼らのためにポッドを追加します。ノードは、ポッドを回収するクラスタから削除されたとき。DaemonSetポッドは、そのすべての作成を削除します削除します。
いくつかの一般的な使用DaemonSetの使用:
运行集群存储 daemon,例如在每个节点上运行 glusterd、ceph。
在每个节点上运行日志收集 daemon,例如fluentd、logstash。
在每个节点上运行监控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond。
単純な使用法は、すべてのノード上のDaemonSet開始を有することであり、各タイプは、デーモンとして使用されます。これは、異なるフラグを有する、及び/又はハードウェアの種類ごとに異なるメモリ、CPU要件と、少し複雑各個々型デーモン複数DaemonSetに使用するために使用することです。
DaemonSetの法令を書く
必要フィールド
そして、他のすべてのKubernetes同じ構成は、DaemonSetはapiVersion、種類およびメタデータフィールドを必要とします。プロファイルに関する基本的な情報は、ドキュメントのアプリケーションのデプロイ、構成コンテナおよびリソース管理を参照してください。
DaemonSetも.spec構成セクションを必要としています。
ポッドテンプレート
唯一の必須フィールド.spec .spec.templateです。
.spec.templateポッドはテンプレートです。これは、ポッドスキーマは、それがネストされていることを除いて、apiVersionまたは種類フィールドを持たずに、同じを持っています。
必須フィールドポッドに加えて、ポッドテンプレートDaemonSetは(ポッドセレクタを参照)合理的なラベルを指定する必要があります。
ポッドDaemonSetテンプレートは必ずRestartPolicyの値を持たなければならない、またはその値が指定されていない場合、デフォルトは常にあります。
ポッドセレクター
.spec.selectorフィールドには、ジョブ.spec.selectorや他のリソースが同じであると働きポッドセレクタを示しています。
spec.selectorは、次のフィールドで構成されたオブジェクトを表します。
matchLabels - 与 ReplicationController 的 .spec.selector 的作用相同。
matchExpressions - 允许构建更加复杂的 Selector,可以通过指定 key、value 列表,以及与 key 和 value 列表相关的操作符。
上記二つのフィールドが指定された場合、結果は、AND関係で表されます。
あなたが.spec.selectorを指定する場合は、.spec.template.metadata.labelsと一致する必要があります。指定しない場合、デフォルトでは、彼らは等価です。彼らは構成と一致しない場合には、APIを拒否しています。
ラベルセレクタポッドが一致する場合、直接又は他のDaemonSet、またはコントローラ(例えばReplicationController)に基づいて、また任意のポッドを作成することができます。そうでなければDaemonSetコントローラは、これらのポッドは、それが作成していることであると仮定します。Kubernetesはそう停止しません。テストノードが異なる値を持つため、シーンは、手動でポッドを作成することが望ましい場合があります。
ポッドは、いくつかのノード上でのみ実行します
.spec.template.spec.nodeSelectorを指定した場合、DaemonSetコントローラーポッドは、ノードセレクタに一致するノード上に作成されます。同様に、このようなケースは、あなたがしてDaemonSetコントローラーポッドは、ノード上で作成したノードの親和性と一致することができ、.spec.template.spec.affinityを指定することができます。あなたが指定されていない場合は、DaemonSetコントローラーは、すべてのノード上のポッドを作成します。
デーモンポッドをスケジュールする方法
通常、ポッドは、どのマシンが選択されているKubernetesスケジューラを実行します。しかし、デーモンコントローラーポッドによって作成されたことは、このように、(ポッドは.spec.nodeNameを指定したときに作成)どのマシン上で同定されています。
DaemonSet Controller 并不关心一个节点的 unschedulable 字段。
DaemonSet Controller 可以创建 Pod,即使调度器还没有启动,这对集群启动是非常有帮助的。
彼らはnode.kubernetes.io/not-readyとテイントのnode.alpha.kubernetes.io/unreachableのtolerationSecondsを指定しないと、デーモンポッドケアテイントと寛容は、寛容の作成はNOEXECUTEを持っています。これはTaintBasedEvictionsアルファ特性が有効になっている場合には、そのようなネットワークパーティションとしてノード障害は、その後、彼らはTaintBasedEvictionsが有効になっていない機能とき、それはこれらのシーンでクリアが、NodeControllerのでされません(削除されないことを保証しますハードコードされた行動)がクリアされ、理由は寛容な原因でクリアされません。
と通信しているデーモンのポッド
DaemonSetはポッドとの通信、次のように、いくつかの可能なモードは次のとおりです。
Push:配置 DaemonSet 中的 Pod 向其它 Service 发送更新,例如统计数据库。它们没有客户端。
NodeIP 和已知端口:DaemonSet 中的 Pod 可以使用 hostPort,从而可以通过节点 IP 访问到 Pod。客户端能通过某种方法知道节点 IP 列表,并且基于此也可以知道端口。
DNS:创建具有相同 Pod Selector 的 Headless Service,然后通过使用 endpoints 资源或从 DNS 检索到多个 A 记录来发现 DaemonSet。
Service:创建具有相同 Pod Selector 的 Service,并使用该 Service 随机访问到某个节点上的 daemon(没有办法访问到特定节点)。
更新DaemonSet
あなたはノードラベル(ラベル)を変更した場合、DaemonSetポッドは、すぐに新しい一致にノードに追加して、ノード上のポッドを削除し、最近一致しないことができます。
私たちは、ポッドDaemonSetを作成、変更することができます。しかし、それはポッドが更新され、すべてのフィールドを許可しません。(でも、同じ名前の)次のノードが作成されると、DaemonSetコントローラは、元のテンプレートを使用します。
あなたはDaemonSetを削除することができます。kubectlとは--cascade = falseオプションを指定した場合、ポッドは、ノード上に保持されます。あなたは、新しいDaemonSetが異なるテンプレートを持って作成することができます。一致し、ラベルを介してすべての既存のポッドを識別することができます異なるテンプレートを持つ新しいDaemonSet。それも、偽のポッドテンプレートと一致する、修正または削除されません。削除または削除ノードによってポッドは、新しいポッドの作成を強制することができます。
Kubernetes 1.6以降では、あなたはDaemonSetのローリング・アップグレードを実行することができます。
将来のバージョンでは、Kubernetes制御可能な更新ノードをサポートします。
DaemonSet代替選択肢の
initスクリプト
我々は、おそらく(例えば、INIT、upstartd、またはにsystemdを使って)ノード上で直接デーモンプロセスを開始します。これは非常に良いですが、これらのプロセスを実行するためにDaemonSetをもとにすると、次のようなメリットがあります。
像对待应用程序一样,具备为 daemon 提供监控和管理日志的能力。
为 daemon 和应用程序使用相同的配置语言和工具(如 Pod 模板、kubectl)。
Kubernetes 未来版本可能会支持对 DaemonSet 创建 Pod 与节点升级工作流进行集成。
在资源受限的容器中运行 daemon,能够增加 daemon 和应用容器的隔离性。然而,这也实现了在容器中运行 daemon,但却不能在 Pod 中运行(例如,直接基于 Docker 启动)。
ベアポッド
ポッドは、特定のノード上で実行し、直接、指定を作成することもできます。しかし、DaemonSetが何らかの理由で置き換えを削除したり、そのようなノード障害、ノード日常のメンテナンス、カーネルをアップグレードすると、ポッドを終了させます。このような理由から、私たちはむしろ別のポッドを作成するよりもDaemonSetを使用する必要があります。
静的ポッド
あなたはポッド、Kubeletによって監視されているディレクトリを作成し、指定したディレクトリのファイルに記述する必要があります。これらは、静的ポッドポッドと呼ばれています。DaemonSetとは異なり、静的ポッドkubectlおよびその他のKubernetes APIのクライアント管理から。静的ポッドを開始し、クラスタの場合はそれらを有用にするた、apiserverには依存しません。また、将来はまだポッドを廃棄することができます。
レプリケーション・コントローラ
DaemonSetとレプリケーションコントローラーは非常に似ている、彼らはポッド、ポッドを作成することができ、これらのプロセスに対応(例えば、Webサーバ、ストレージサーバ)を終了することを希望しません。ステートレスサービスは、フロントエンド(フロントエンド)サービスとして、レプリケーション・コントローラを使用し、コピーの数は正確にはるかに重要ホスト上で実行ポッドを制御するために、よりスケーラブルな容量、スムーズなアップグレードになります。ポッドは、あなたがデーモンコントローラーを使用する必要があり、すべてのコピーを必要とするか、常に特定のホスト上で実行され、あなたはそれが非常に重要であると考えられた他のポッド、で開始する必要があります