k3s/cli/cmd/agent/agent_k3s.go

82 lines
1.6 KiB
Go

// +build k8s
package agent
import (
"fmt"
"io"
"os"
"path/filepath"
"time"
"github.com/natefinch/lumberjack"
"github.com/rancher/norman/pkg/clientaccess"
"github.com/rancher/norman/pkg/resolvehome"
"github.com/rancher/rio/pkg/enterchroot"
"github.com/sirupsen/logrus"
"github.com/urfave/cli"
)
func (a *Agent) Run(ctx *cli.Context) error {
if os.Getuid() != 0 {
return fmt.Errorf("agent must be ran as root")
}
if len(a.T_Token) == 0 {
return fmt.Errorf("--token is required")
}
if len(a.S_Server) == 0 {
return fmt.Errorf("--server is required")
}
dataDir, err := resolvehome.Resolve(a.D_DataDir)
if err != nil {
return err
}
return RunAgent(a.S_Server, a.T_Token, dataDir, a.L_Log, a.I_NodeIp)
}
func RunAgent(server, token, dataDir, logFile, ipAddress string) error {
dataDir = filepath.Join(dataDir, "agent")
for {
tmpFile, err := clientaccess.AgentAccessInfoToTempKubeConfig("", server, token)
if err != nil {
logrus.Error(err)
time.Sleep(2 * time.Second)
continue
}
os.Remove(tmpFile)
break
}
os.Setenv("K3S_URL", server)
os.Setenv("K3S_TOKEN", token)
os.Setenv("K3S_DATA_DIR", dataDir)
os.Setenv("K3S_NODE_IP", ipAddress)
os.MkdirAll(dataDir, 0700)
stdout := io.Writer(os.Stdout)
stderr := io.Writer(os.Stderr)
if logFile == "" {
stdout = os.Stdout
stderr = os.Stderr
} else {
l := &lumberjack.Logger{
Filename: logFile,
MaxSize: 50,
MaxBackups: 3,
MaxAge: 28,
Compress: true,
}
stdout = l
stderr = l
}
return enterchroot.Mount(filepath.Join(dataDir, "root"), stdout, stderr, os.Args[1:])
}