Kubernetes组件-DaemonSet
⒈简介
Replicationcontroller和ReplicaSet都用于在Kubermetes集群上部署运行特定数量的pod。但是,当某些情况下我们希望在集群中的每个节点上运行同一个指定的pod就需要更为复杂的操作。
这些情况包括pod执行系统级别的与基础结构相关的操作。例如,希望在每个节点上运行日志收集器和资源监控器。一个典型的例子就是Kubernetes自己的kube-proxy进程,它需要运行在所有节点上才能使服务工作。
要在所有集群节点上运行一个pod,需要创建一个DaemonSet对象,DaemonSet确保创建足够的pod,并在自己的节点上部署每个pod,DaemonSet并没有期望副本数的概念。它不需要,因为它的工作是确保一个匹配它选择器的pod在每个节点上运行。如果节点下线,DaemonSet不会在其他地方重新创建pod。但是,当将一个新节点添加到集群中时,DaemonSet会立刻部署一个新的pod实例。如果有人无意中删除了一个pod,那么它也会重新创建一个新的pod。与ReplicaSet一样,DaemonSet 从配置的pod模板创建pod。
⒉使用DaemonSet只在特定的节点上运行pod
默认情况下DaemonSet将在集群中的所有节点上部署pod,除非指定这些pod只在部分节点上运行,这是通过DaemonSet描述文件中pod模板的nodeselector属性指定的。
DaemonSet中的节点选择器定义了DaemonSet必须将其pod部署到的节点。
注意:节点可以防止pod被部署到节点上而设置为不可调度的。DaemonSet仍然可以将pod部署到这些节点上,因为无法调度的属性只会被调度器使用,而DaemonSet管理的pod则完全绕过调度器。这是预料之中的,因为DaemonSet的目的是运行系统服务,即使是在不可调度的节点上,系统服务通常也需要运行。
⒊定义(创建)DaemonSet
apiVersion: apps/v1 #指定当前描述文件遵循apps/v1版本的KubernetesAPI kind: DaemonSet #我们在描述一个DaemonSet metadata: name: ssd-monitor #指定DaemonSet的名称 spec: selector: #pod选择器决定了DaemonSet的操作对象 matchLabels: app: ssd-monitor template: #创建新pod所使用的pod模板 metadata: labels: app: ssd-monitor #模板中的pod标签显然必须和DaemonSet的标签选择器相匹配,否则控制器将无休止的创建新的pod实例。因为创建新的pod不会使实际的副本数量接近期望的副本数量。为了防止出现这种情况,Kubernetes API服务会校验DaemonSet的定义不会接收错误的配置。 #不指定DaemonSet的标签选择器也是一种选择,因为DaemonSet会自动从模板中提取标签,而且描述文件也将更简短 spec: nodeSelector: #pod模板包含一个节点选择器,会选择有disk=ssd标签的节点 disk: ssd containers: - name: coreqi image: fanqisoft/coreqi ports: - containerPort: 8080
创建以上描述文件后使用kubectl命令创建DaemonSet
kubectl create -f ssd-monitor-daemonset.yaml
可以使用kubectl get 和 kubectl describe来检查DaemonSet
#ds是DaemonSet的缩写
kubectl get ds
kubectl describe ds
* 如果节点的标签更改了,那么节点的标签不符合DaemonSet的指定标签,该节点上由DaemonSet创建的pod也会被随之销毁。
⒋删除DaemonSet
使用以下命令删除DaemonSet
kubectl delete ds {dsName}
删除DaemonSet会删除所有的pod。这种情况下是需要列出pod来确认的。