NAME READY STATUS RESTARTS AGE
fluentd-elasticsearch-nwqph 1/1 Running 0 4m11s
由于我这是单节点,所以只有一个pod运行了。
然后查看一下 Kubernetes 集群里的 DaemonSet 对象:
$ kubectl get ds -n kube-system fluentd-elasticsearch
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-elasticsearch 1 1 1 1 1 27m
然后我们来稍微看一下源码,k8s是通过daemon_controller里面的manage方法来管理Pod删减操作的:
manage方法里面首先会获取daemon pod 与 node 的映射关系,然后判断每一个 node 是否需要运行 daemon pod,然后遍历完node之后将需要创建的Pod列表和需要删除Pod的列表交给syncNodes执行。
func (dsc *DaemonSetsController) manage(ds *apps.DaemonSet, nodeList []*v1.Node, hash string) error {
// 获取已存在 daemon pod 与 node 的映射关系
nodeToDaemonPods, err := dsc.getNodesToDaemonPods(ds)
if err != nil {
return fmt.Errorf(“couldn’t get node to daemon pod mapping for daemon set %q: %v”, ds.Name, err)
}
// 判断每一个 node 是否需要运行 daemon pod
var nodesNeedingDaemonPods, podsToDelete []string
for _, node := range nodeList {
nodesNeedingDaemonPodsOnNode, podsToDeleteOnNode, err := dsc.podsShouldBeOnNode(
node, nodeToDaemonPods, ds)
if err != nil {
continue
}
//将需要删除的Pod和需要在某个节点创建Pod存入列表中
nodesNeedingDaemonPods = append(nodesNeedingDaemonPods, nodesNeedingDaemonPodsOnNode…)
podsToDelete = append(podsToDelete, podsToDeleteOnNode…)
}
podsToDelete = append(podsToDelete, getUnscheduledPodsWithoutNode(nodeList, nodeToDaemonPods)…)
//为对应的 node 创建 daemon pod 以及删除多余的 pods
if err = dsc.syncNodes(ds, podsToDelete, nodesNeedingDaemonPods, hash); err != nil {
return err
}
return nil
}
下面我们看一下p