在Kelsey Hightower的Kubernetes Up and Running中,他给出了两个命令:kubectl get daemonSets --namespace=kube-system kube-proxy
和kubectl get deployments --namespace=kube-system kube-dns
为什么一个使用daemonSets而另一个使用呢?
有什么区别?
最佳答案
Kubernetes部署管理集群上运行的无状态服务(例如,管理状态服务的StatefulSet相对)。他们的目的是保持一组相同的Pod运行并以受控方式对其进行升级。例如,您在部署定义中定义要为应用程序运行多少个副本(pods
),而kubernetes将使应用程序的许多副本散布在节点上。如果您说5个副本超过3个节点,则某些节点正在运行您的应用程序的多个副本。
守护程序集管理复制的Pod组。但是,DaemonSets尝试在整个集群或节点子集上遵循每个节点一个Pod的模型。守护程序在每个节点上最多可以运行一个副本。使用Daemonset的另一个优点是,如果将节点添加到群集,则Daemonset将自动在该节点上生成pod,而部署不会这样做。DaemonSets
对于部署需要在所有或某些节点上运行且不需要用户干预的正在进行的后台任务很有用。此类任务的示例包括:存储守护程序(例如ceph
),日志收集守护程序(例如fluentd
)和节点监视守护程序(例如collectd
)。
让我们以您提到的问题为例,为什么kube-dns
是部署而kube-proxy
是守护程序?
其背后的原因是群集中的每个节点都需要kube-proxy
来运行IP表,以便每个节点都可以访问每个pod,无论它位于哪个节点上。因此,当我们将kube-proxy
设为daemonset
并在稍后将另一个节点添加到集群时,会自动在该节点上生成kube-proxy。Kube-dns
的责任是使用其名称发现服务IP,即使是kube-dns
的一个副本也足以将服务名称解析为其IP,因此我们将kube-dns
称为deployment
,因为我们不需要每个节点上的kube-dns
。
关于kubernetes - 守护程序集与部署之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53888389/