2019-01-09 16:54:15 +00:00
package agent
import (
"context"
2019-02-08 04:13:43 +00:00
"errors"
"io/ioutil"
2019-01-09 16:54:15 +00:00
"os"
"path/filepath"
2019-02-08 04:13:43 +00:00
"strings"
2019-01-09 16:54:15 +00:00
"time"
"github.com/rancher/k3s/pkg/agent/config"
"github.com/rancher/k3s/pkg/agent/containerd"
"github.com/rancher/k3s/pkg/agent/flannel"
2019-07-24 07:22:31 +00:00
"github.com/rancher/k3s/pkg/agent/loadbalancer"
2019-01-09 16:54:15 +00:00
"github.com/rancher/k3s/pkg/agent/syssetup"
"github.com/rancher/k3s/pkg/agent/tunnel"
"github.com/rancher/k3s/pkg/cli/cmds"
2019-05-09 22:05:51 +00:00
"github.com/rancher/k3s/pkg/clientaccess"
2019-01-09 16:54:15 +00:00
"github.com/rancher/k3s/pkg/daemons/agent"
2019-03-08 22:47:44 +00:00
"github.com/rancher/k3s/pkg/rootless"
2019-01-22 21:14:58 +00:00
"github.com/sirupsen/logrus"
2019-01-09 16:54:15 +00:00
)
2019-07-24 07:22:31 +00:00
func run ( ctx context . Context , cfg cmds . Agent , lb * loadbalancer . LoadBalancer ) error {
2019-01-09 16:54:15 +00:00
nodeConfig := config . Get ( ctx , cfg )
2019-05-03 12:41:08 +00:00
if err := config . HostnameCheck ( cfg ) ; err != nil {
return err
}
2019-01-09 16:54:15 +00:00
if ! nodeConfig . NoFlannel {
if err := flannel . Prepare ( ctx , nodeConfig ) ; err != nil {
return err
}
}
2019-03-04 06:29:06 +00:00
if nodeConfig . Docker || nodeConfig . ContainerRuntimeEndpoint != "" {
nodeConfig . AgentConfig . RuntimeSocket = nodeConfig . ContainerRuntimeEndpoint
2019-04-30 20:12:02 +00:00
nodeConfig . AgentConfig . CNIPlugin = true
2019-01-09 16:54:15 +00:00
} else {
if err := containerd . Run ( ctx , nodeConfig ) ; err != nil {
return err
}
}
if err := syssetup . Configure ( ) ; err != nil {
return err
}
2019-07-24 07:22:31 +00:00
if err := tunnel . Setup ( ctx , nodeConfig , lb . Update ) ; err != nil {
2019-01-09 16:54:15 +00:00
return err
}
if err := agent . Agent ( & nodeConfig . AgentConfig ) ; err != nil {
return err
}
if ! nodeConfig . NoFlannel {
if err := flannel . Run ( ctx , nodeConfig ) ; err != nil {
return err
}
}
<- ctx . Done ( )
return ctx . Err ( )
}
func Run ( ctx context . Context , cfg cmds . Agent ) error {
2019-02-08 04:13:43 +00:00
if err := validate ( ) ; err != nil {
return err
}
2019-03-08 22:47:44 +00:00
if cfg . Rootless {
if err := rootless . Rootless ( cfg . DataDir ) ; err != nil {
return err
}
}
2019-01-09 16:54:15 +00:00
cfg . DataDir = filepath . Join ( cfg . DataDir , "agent" )
2019-07-24 07:22:31 +00:00
os . MkdirAll ( cfg . DataDir , 0700 )
2019-01-09 16:54:15 +00:00
2019-01-22 21:14:58 +00:00
if cfg . ClusterSecret != "" {
cfg . Token = "K10node:" + cfg . ClusterSecret
}
2019-07-24 07:22:31 +00:00
lb , err := loadbalancer . Setup ( ctx , cfg )
if err != nil {
return err
}
if lb != nil {
cfg . ServerURL = lb . LoadBalancerServerURL ( )
}
2019-01-09 16:54:15 +00:00
for {
tmpFile , err := clientaccess . AgentAccessInfoToTempKubeConfig ( "" , cfg . ServerURL , cfg . Token )
if err != nil {
logrus . Error ( err )
select {
case <- ctx . Done ( ) :
return ctx . Err ( )
case <- time . After ( 2 * time . Second ) :
}
continue
}
os . Remove ( tmpFile )
break
}
2019-07-24 07:22:31 +00:00
return run ( ctx , cfg , lb )
2019-01-09 16:54:15 +00:00
}
2019-02-08 04:13:43 +00:00
func validate ( ) error {
cgroups , err := ioutil . ReadFile ( "/proc/self/cgroup" )
if err != nil {
return err
}
if ! strings . Contains ( string ( cgroups ) , "cpuset" ) {
logrus . Warn ( "Failed to find cpuset cgroup, you may need to add \"cgroup_enable=cpuset\" to your linux cmdline (/boot/cmdline.txt on a Raspberry Pi)" )
}
if ! strings . Contains ( string ( cgroups ) , "memory" ) {
msg := "ailed to find memory cgroup, you may need to add \"cgroup_memory=1 cgroup_enable=memory\" to your linux cmdline (/boot/cmdline.txt on a Raspberry Pi)"
logrus . Error ( "F" + msg )
return errors . New ( "f" + msg )
}
return nil
}