// runOnce runs a given set of pods and returns their status. func (kl *Kubelet) runOnce(pods []api.BoundPod) (results []RunPodResult, err error) { if kl.dockerPuller == nil { kl.dockerPuller = dockertools.NewDockerPuller(kl.dockerClient, kl.pullQPS, kl.pullBurst) } pods = filterHostPortConflicts(pods) ch := make(chan RunPodResult) for i := range pods { pod := pods[i] // Make a copy go func() { err := kl.runPod(pod) ch <- RunPodResult{&pod, err} }() } glog.Infof("waiting for %d pods", len(pods)) failedPods := []string{} for i := 0; i < len(pods); i++ { res := <-ch results = append(results, res) if res.Err != nil { // TODO(proppy): report which containers failed the pod. glog.Infof("failed to start pod %q: %v", res.Pod.Name, res.Err) failedPods = append(failedPods, res.Pod.Name) } else { glog.Infof("started pod %q", res.Pod.Name) } } if len(failedPods) > 0 { return results, fmt.Errorf("error running pods: %v", failedPods) } glog.Infof("%d pods started", len(pods)) return results, err }
// Run starts the kubelet reacting to config updates func (kl *Kubelet) Run(updates <-chan PodUpdate) { if kl.logServer == nil { kl.logServer = http.StripPrefix("/logs/", http.FileServer(http.Dir("/var/log/"))) } if kl.dockerPuller == nil { kl.dockerPuller = dockertools.NewDockerPuller(kl.dockerClient, kl.pullQPS, kl.pullBurst) } if kl.healthChecker == nil { kl.healthChecker = health.NewHealthChecker() } kl.syncLoop(updates, kl) }