2016-08-23 15:03:41 +00:00
/ *
Copyright 2016 The Kubernetes Authors All rights reserved .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package provision
import (
"bytes"
"fmt"
2016-10-17 09:00:43 +00:00
"text/template"
2016-11-16 19:50:08 +00:00
"time"
2016-08-23 15:03:41 +00:00
"github.com/docker/machine/libmachine/auth"
"github.com/docker/machine/libmachine/drivers"
"github.com/docker/machine/libmachine/engine"
"github.com/docker/machine/libmachine/provision"
"github.com/docker/machine/libmachine/provision/pkgaction"
"github.com/docker/machine/libmachine/swarm"
2020-03-24 21:43:11 +00:00
"github.com/spf13/viper"
2020-09-29 22:49:41 +00:00
"k8s.io/klog/v2"
2020-03-24 21:43:11 +00:00
"k8s.io/minikube/pkg/minikube/config"
2019-08-14 06:48:30 +00:00
"k8s.io/minikube/pkg/util/retry"
2016-08-23 15:03:41 +00:00
)
2019-03-16 13:12:18 +00:00
// BuildrootProvisioner provisions the custom system based on Buildroot
2016-08-23 15:03:41 +00:00
type BuildrootProvisioner struct {
provision . SystemdProvisioner
2020-03-24 22:54:39 +00:00
clusterName string
2016-08-23 15:03:41 +00:00
}
2019-03-16 13:12:18 +00:00
// NewBuildrootProvisioner creates a new BuildrootProvisioner
2016-08-23 15:03:41 +00:00
func NewBuildrootProvisioner ( d drivers . Driver ) provision . Provisioner {
return & BuildrootProvisioner {
2020-03-20 00:40:02 +00:00
NewSystemdProvisioner ( "buildroot" , d ) ,
2020-03-24 22:54:39 +00:00
viper . GetString ( config . ProfileName ) ,
2016-08-23 15:03:41 +00:00
}
}
func ( p * BuildrootProvisioner ) String ( ) string {
return "buildroot"
}
2019-07-14 14:02:37 +00:00
// CompatibleWithHost checks if provisioner is compatible with host
func ( p * BuildrootProvisioner ) CompatibleWithHost ( ) bool {
return p . OsReleaseInfo . ID == "buildroot"
}
2019-03-16 13:12:18 +00:00
// GenerateDockerOptions generates the *provision.DockerOptions for this provisioner
2016-08-23 15:03:41 +00:00
func ( p * BuildrootProvisioner ) GenerateDockerOptions ( dockerPort int ) ( * provision . DockerOptions , error ) {
var engineCfg bytes . Buffer
2019-10-18 20:00:07 +00:00
drvLabel := fmt . Sprintf ( "provider=%s" , p . Driver . DriverName ( ) )
p . EngineOptions . Labels = append ( p . EngineOptions . Labels , drvLabel )
2016-08-23 15:03:41 +00:00
2019-08-14 19:18:38 +00:00
noPivot := true
// Using pivot_root is not supported on fstype rootfs
if fstype , err := rootFileSystemType ( p ) ; err == nil {
2020-09-29 22:49:41 +00:00
klog . Infof ( "root file system type: %s" , fstype )
2019-08-14 19:18:38 +00:00
noPivot = fstype == "rootfs"
}
2016-08-23 15:03:41 +00:00
engineConfigTmpl := ` [ Unit ]
Description = Docker Application Container Engine
Documentation = https : //docs.docker.com
2018-11-21 21:39:48 +00:00
After = network . target minikube - automount . service docker . socket
Requires = minikube - automount . service docker . socket
2021-02-08 23:32:28 +00:00
StartLimitBurst = 3
StartLimitIntervalSec = 60
2016-08-23 15:03:41 +00:00
[ Service ]
Type = notify
2020-11-24 23:13:56 +00:00
Restart = on - failure
2019-08-14 19:18:38 +00:00
`
if noPivot {
2020-09-29 22:49:41 +00:00
klog . Warning ( "Using fundamentally insecure --no-pivot option" )
2019-08-14 19:18:38 +00:00
engineConfigTmpl += `
2016-08-23 15:03:41 +00:00
# DOCKER_RAMDISK disables pivot_root in Docker , using MS_MOVE instead .
Environment = DOCKER_RAMDISK = yes
2019-08-14 19:18:38 +00:00
`
}
engineConfigTmpl += `
2016-10-27 21:50:36 +00:00
{ { range . EngineOptions . Env } } Environment = { { . } }
{ { end } }
2017-04-05 04:40:05 +00:00
2017-04-10 02:38:45 +00:00
# This file is a systemd drop - in unit that inherits from the base dockerd configuration .
# The base configuration already specifies an ' ExecStart = ... ' command . The first directive
# here is to clear out that command inherited from the base configuration . Without this ,
# the command from the base configuration and the command specified here are treated as
# a sequence of commands , which is not the desired behavior , nor is it valid -- systemd
# will catch this invalid input and refuse to start the service with an error like :
# Service has more than one ExecStart = setting , which is only allowed for Type = oneshot services .
2019-10-29 21:21:53 +00:00
# NOTE : default - ulimit = nofile is set to an arbitrary number for consistency with other
# container runtimes . If left unlimited , it may result in OOM issues with MySQL .
2017-04-05 04:40:05 +00:00
ExecStart =
2020-03-12 21:50:19 +00:00
ExecStart = / usr / bin / dockerd - H tcp : //0.0.0.0:2376 -H unix:///var/run/docker.sock --default-ulimit=nofile=1048576:1048576 --tlsverify --tlscacert {{.AuthOptions.CaCertRemotePath}} --tlscert {{.AuthOptions.ServerCertRemotePath}} --tlskey {{.AuthOptions.ServerKeyRemotePath}} {{ range .EngineOptions.Labels }}--label {{.}} {{ end }}{{ range .EngineOptions.InsecureRegistry }}--insecure-registry {{.}} {{ end }}{{ range .EngineOptions.RegistryMirror }}--registry-mirror {{.}} {{ end }}{{ range .EngineOptions.ArbitraryFlags }}--{{.}} {{ end }}
2020-12-23 01:00:23 +00:00
ExecReload = / bin / kill - s HUP \ $ MAINPID
2016-08-23 15:03:41 +00:00
# Having non - zero Limit * s causes performance problems due to accounting overhead
# in the kernel . We recommend using cgroups to do container - local accounting .
2019-10-29 05:33:18 +00:00
LimitNOFILE = infinity
2016-08-23 15:03:41 +00:00
LimitNPROC = infinity
LimitCORE = infinity
# Uncomment TasksMax if your systemd version supports it .
# Only systemd 226 and above support this version .
TasksMax = infinity
TimeoutStartSec = 0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate = yes
# kill only the docker process , not all processes in the cgroup
KillMode = process
[ Install ]
WantedBy = multi - user . target
`
t , err := template . New ( "engineConfig" ) . Parse ( engineConfigTmpl )
if err != nil {
return nil , err
}
engineConfigContext := provision . EngineConfigContext {
DockerPort : dockerPort ,
AuthOptions : p . AuthOptions ,
EngineOptions : p . EngineOptions ,
}
2019-03-27 09:05:20 +00:00
escapeSystemdDirectives ( & engineConfigContext )
2017-10-16 19:17:57 +00:00
if err := t . Execute ( & engineCfg , engineConfigContext ) ; err != nil {
return nil , err
}
2016-08-23 15:03:41 +00:00
2020-03-20 00:40:02 +00:00
do := & provision . DockerOptions {
2016-08-23 15:03:41 +00:00
EngineOptions : engineCfg . String ( ) ,
2017-07-10 18:50:21 +00:00
EngineOptionsPath : "/lib/systemd/system/docker.service" ,
2020-01-22 19:00:10 +00:00
}
2020-03-20 00:40:02 +00:00
return do , updateUnit ( p , "docker" , do . EngineOptions , do . EngineOptionsPath )
2016-08-23 15:03:41 +00:00
}
2019-03-16 13:12:18 +00:00
// Package installs a package
2016-08-23 15:03:41 +00:00
func ( p * BuildrootProvisioner ) Package ( name string , action pkgaction . PackageAction ) error {
return nil
}
2019-03-16 13:12:18 +00:00
// Provision does the provisioning
2016-08-23 15:03:41 +00:00
func ( p * BuildrootProvisioner ) Provision ( swarmOptions swarm . Options , authOptions auth . Options , engineOptions engine . Options ) error {
p . SwarmOptions = swarmOptions
p . AuthOptions = authOptions
p . EngineOptions = engineOptions
2020-09-29 22:49:41 +00:00
klog . Infof ( "provisioning hostname %q" , p . Driver . GetMachineName ( ) )
2016-08-23 15:03:41 +00:00
if err := p . SetHostname ( p . Driver . GetMachineName ( ) ) ; err != nil {
return err
}
p . AuthOptions = setRemoteAuthOptions ( p )
2020-09-29 22:49:41 +00:00
klog . Infof ( "set auth options %+v" , p . AuthOptions )
2016-08-23 15:03:41 +00:00
2020-09-29 22:49:41 +00:00
klog . Infof ( "setting up certificates" )
2019-08-14 06:48:30 +00:00
configAuth := func ( ) error {
2017-07-10 18:50:21 +00:00
if err := configureAuth ( p ) ; err != nil {
2020-09-29 22:49:41 +00:00
klog . Warningf ( "configureAuth failed: %v" , err )
2019-08-14 06:48:30 +00:00
return & retry . RetriableError { Err : err }
2016-11-16 19:50:08 +00:00
}
return nil
}
2019-08-14 06:48:30 +00:00
2020-04-16 22:14:59 +00:00
err := retry . Expo ( configAuth , 100 * time . Microsecond , 2 * time . Minute )
2016-11-16 19:50:08 +00:00
if err != nil {
2020-09-29 22:49:41 +00:00
klog . Infof ( "Error configuring auth during provisioning %v" , err )
2016-08-23 15:03:41 +00:00
return err
}
2020-09-29 22:49:41 +00:00
klog . Infof ( "setting minikube options for container-runtime" )
2020-03-24 23:10:20 +00:00
if err := setContainerRuntimeOptions ( p . clusterName , p ) ; err != nil {
2020-09-29 22:49:41 +00:00
klog . Infof ( "Error setting container-runtime options during provisioning %v" , err )
2017-10-16 19:17:57 +00:00
return err
}
2016-08-23 15:03:41 +00:00
return nil
}