// Run blocks implementing the scheduler module. func Run(conn db.Conn, dk docker.Client) { bootWait(conn) subnet := getMinionSubnet(conn) err := dk.ConfigureNetwork(plugin.NetworkName, subnet) if err != nil { log.WithError(err).Fatal("Failed to configure network plugin") } loopLog := util.NewEventTimer("Scheduler") trig := conn.TriggerTick(60, db.MinionTable, db.ContainerTable, db.PlacementTable, db.EtcdTable).C for range trig { loopLog.LogStart() minion, err := conn.MinionSelf() if err != nil { log.WithError(err).Warn("Missing self in the minion table.") continue } if minion.Role == db.Worker { subnet = updateNetwork(conn, dk, subnet) runWorker(conn, dk, minion.PrivateIP, subnet) } else if minion.Role == db.Master { runMaster(conn) } loopLog.LogEnd() } }
// Run blocks implementing the network services. func Run(conn db.Conn, dk docker.Client) { loopLog := util.NewEventTimer("Network") for range conn.TriggerTick(30, db.MinionTable, db.ContainerTable, db.ConnectionTable, db.LabelTable, db.EtcdTable).C { loopLog.LogStart() runWorker(conn, dk) runMaster(conn) loopLog.LogEnd() } }
// Manage system infrstracture containers that support the application. func (sv *supervisor) runSystem() { imageSet := map[string]struct{}{} for _, image := range images { imageSet[image] = struct{}{} } for image := range imageSet { go sv.dk.Pull(image) } loopLog := util.NewEventTimer("Supervisor") for range sv.conn.Trigger(db.MinionTable, db.EtcdTable).C { loopLog.LogStart() sv.runSystemOnce() loopLog.LogEnd() } }
// Run blocks executing the minion. func Run() { // XXX Uncomment the following line to run the profiler //runProfiler(5 * time.Minute) log.Info("Minion Start") conn := db.New() dk := docker.New("unix:///var/run/docker.sock") // Not in a goroutine, want the plugin to start before the scheduler plugin.Run() go minionServerRun(conn) go supervisor.Run(conn, dk) go scheduler.Run(conn, dk) go network.Run(conn, dk) go etcd.Run(conn) go syncAuthorizedKeys(conn) go apiServer.Run(conn, fmt.Sprintf("tcp://0.0.0.0:%d", api.DefaultRemotePort)) loopLog := util.NewEventTimer("Minion-Update") for range conn.Trigger(db.MinionTable).C { loopLog.LogStart() conn.Transact(func(view db.Database) error { minion, err := view.MinionSelf() if err != nil { return err } updatePolicy(view, minion.Role, minion.Spec) return nil }) loopLog.LogEnd() } }