Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。
DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。
Controller:
Kubernetes通常不会直接创建Pod,而是通过Controller来管理pod的。
Controller中定义了Pod的部署属性(比如部署几个副本、在什么样的Node上运行等)。
为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。
Deployment:最常用的 Controller,比如前面在线教程中就是通过创建 Deployment 来部署应用的。Deployment 可以管理 Pod 的多个副本,并确保 Pod 按照期望的状态运行。ReplicaSet:实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet。DaemonSet:用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon。StatefuleSet:能够保证 Pod 的每个副本在整个生命周期中名称是不变的。而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。同时 StatefuleSet 会保证副本按照固定的顺序启动、更新或者删除。Job:用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。CronJob:定时任务
典型应用场景
:
-
在集群的每个节点上运行存储Daemon,如ceph或glusterd;
-
在每个节点上运行日志搜集Daemon,比如flunentd或logstash;
-
在每个节点上运行监控Daemon,比如Prometheus Node Exporter或collectd。
Kubernetes 自己就在用 DaemonSet 运行系统组件。执行如下命令:
kubectl get daemonset --namespace=kube-system
DaemonSet kube-flannel-ds 和 kube-proxy 分别负责在每个节点上运行 flannel 和 kube-proxy 组件。
因为 flannel 和 kube-proxy 属于系统组件,需要在命令行中通过 --namespace=kube-system 指定 namespace kube-system。如果不指定则只返回默认 namespace default 中的资源。
由于无法拿到 kube-proxy 的 YAML 文件,只能运行如下命令查看其配置:
kubectl edit daemonset kube-proxy --namespace=kube-system
Kubernetes 集群中每个当前运行的资源都可以通过 kubectl edit 查看其配置和运行状态,比如
:
kubectl edit deployment
httpd-deployment