2019-01-09 16:54:15 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
2019-01-22 21:14:58 +00:00
|
|
|
"strings"
|
2019-01-09 16:54:15 +00:00
|
|
|
|
|
|
|
"github.com/docker/docker/pkg/reexec"
|
|
|
|
"github.com/natefinch/lumberjack"
|
|
|
|
"github.com/rancher/k3s/pkg/agent"
|
|
|
|
"github.com/rancher/k3s/pkg/cli/cmds"
|
|
|
|
"github.com/rancher/k3s/pkg/server"
|
|
|
|
"github.com/rancher/norman/signal"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"github.com/urfave/cli"
|
2019-01-22 21:14:58 +00:00
|
|
|
|
|
|
|
_ "github.com/mattn/go-sqlite3" // ensure we have sqlite
|
2019-01-09 16:54:15 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func setupLogging(app *cli.Context) {
|
|
|
|
if !app.GlobalBool("debug") {
|
|
|
|
flag.Set("stderrthreshold", "3")
|
|
|
|
flag.Set("alsologtostderr", "false")
|
|
|
|
flag.Set("logtostderr", "false")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func runWithLogging(app *cli.Context, cfg *cmds.Server) error {
|
|
|
|
l := &lumberjack.Logger{
|
|
|
|
Filename: cfg.Log,
|
|
|
|
MaxSize: 50,
|
|
|
|
MaxBackups: 3,
|
|
|
|
MaxAge: 28,
|
|
|
|
Compress: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
args := append([]string{"k3s"}, os.Args[1:]...)
|
|
|
|
cmd := reexec.Command(args...)
|
|
|
|
cmd.Env = os.Environ()
|
|
|
|
cmd.Env = append(cmd.Env, "_RIO_REEXEC_=true")
|
|
|
|
cmd.Stderr = l
|
|
|
|
cmd.Stdout = l
|
|
|
|
cmd.Stdin = os.Stdin
|
|
|
|
return cmd.Run()
|
|
|
|
}
|
|
|
|
|
|
|
|
func Run(app *cli.Context) error {
|
|
|
|
return run(app, &cmds.ServerConfig)
|
|
|
|
}
|
|
|
|
|
|
|
|
func run(app *cli.Context, cfg *cmds.Server) error {
|
|
|
|
if cfg.Log != "" && os.Getenv("_RIO_REEXEC_") == "" {
|
|
|
|
return runWithLogging(app, cfg)
|
|
|
|
}
|
|
|
|
|
|
|
|
setupLogging(app)
|
|
|
|
|
|
|
|
if !cfg.DisableAgent && os.Getuid() != 0 {
|
|
|
|
return fmt.Errorf("must run as root unless --disable-agent is specified")
|
|
|
|
}
|
|
|
|
|
|
|
|
serverConfig := server.Config{}
|
2019-01-22 21:14:58 +00:00
|
|
|
serverConfig.ControlConfig.ClusterSecret = cfg.ClusterSecret
|
2019-01-09 16:54:15 +00:00
|
|
|
serverConfig.ControlConfig.DataDir = cfg.DataDir
|
2019-01-22 21:14:58 +00:00
|
|
|
serverConfig.ControlConfig.KubeConfigOutput = cfg.KubeConfigOutput
|
|
|
|
serverConfig.ControlConfig.KubeConfigMode = cfg.KubeConfigMode
|
2019-01-09 16:54:15 +00:00
|
|
|
serverConfig.TLSConfig.HTTPSPort = cfg.HTTPSPort
|
|
|
|
serverConfig.TLSConfig.HTTPPort = cfg.HTTPPort
|
|
|
|
|
2019-01-22 21:14:58 +00:00
|
|
|
// TODO: support etcd
|
|
|
|
serverConfig.ControlConfig.NoLeaderElect = true
|
|
|
|
|
|
|
|
for _, noDeploy := range app.StringSlice("no-deploy") {
|
|
|
|
if !strings.HasSuffix(noDeploy, ".yaml") {
|
|
|
|
noDeploy = noDeploy + ".yaml"
|
|
|
|
}
|
|
|
|
serverConfig.ControlConfig.Skips = append(serverConfig.ControlConfig.Skips, noDeploy)
|
|
|
|
}
|
|
|
|
|
2019-01-09 16:54:15 +00:00
|
|
|
logrus.Info("Starting k3s ", app.App.Version)
|
|
|
|
ctx := signal.SigTermCancelContext(context.Background())
|
|
|
|
certs, err := server.StartServer(ctx, &serverConfig)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if cfg.DisableAgent {
|
|
|
|
<-ctx.Done()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
logFile := filepath.Join(serverConfig.ControlConfig.DataDir, "agent/agent.log")
|
|
|
|
url := fmt.Sprintf("https://localhost:%d", serverConfig.TLSConfig.HTTPSPort)
|
|
|
|
logrus.Infof("Agent starting, logging to %s", logFile)
|
|
|
|
token := server.FormatToken(serverConfig.ControlConfig.Runtime.NodeToken, certs)
|
|
|
|
|
|
|
|
agentConfig := cmds.AgentConfig
|
2019-01-22 21:14:58 +00:00
|
|
|
agentConfig.DataDir = filepath.Dir(serverConfig.ControlConfig.DataDir)
|
2019-01-09 16:54:15 +00:00
|
|
|
agentConfig.ServerURL = url
|
|
|
|
agentConfig.Token = token
|
|
|
|
|
|
|
|
return agent.Run(ctx, agentConfig)
|
|
|
|
}
|