2017-11-28 11:26:15 +00:00
package cmd
import (
2018-01-09 22:10:56 +00:00
"context"
2017-11-28 11:26:15 +00:00
"fmt"
2018-04-18 06:04:30 +00:00
"strings"
2018-07-10 19:21:27 +00:00
"time"
2017-11-28 11:26:15 +00:00
2019-09-03 20:01:22 +00:00
"github.com/sirupsen/logrus"
2017-11-28 11:26:15 +00:00
"github.com/rancher/rke/cluster"
2018-07-10 19:21:27 +00:00
"github.com/rancher/rke/dind"
2017-12-11 18:28:08 +00:00
"github.com/rancher/rke/hosts"
2018-01-09 22:10:56 +00:00
"github.com/rancher/rke/log"
2017-11-28 11:26:15 +00:00
"github.com/rancher/rke/pki"
2019-08-19 17:53:15 +00:00
"github.com/rancher/rke/pki/cert"
2020-07-11 16:24:19 +00:00
v3 "github.com/rancher/rke/types"
2017-11-28 11:26:15 +00:00
"github.com/urfave/cli"
)
2018-07-10 19:21:27 +00:00
const DINDWaitTime = 3
2017-11-28 11:26:15 +00:00
func UpCommand ( ) cli . Command {
upFlags := [ ] cli . Flag {
cli . StringFlag {
Name : "config" ,
Usage : "Specify an alternate cluster YAML file" ,
2018-02-06 19:25:54 +00:00
Value : pki . ClusterConfig ,
2017-11-28 11:26:15 +00:00
EnvVar : "RKE_CONFIG" ,
} ,
2017-12-22 01:01:53 +00:00
cli . BoolFlag {
Name : "local" ,
Usage : "Deploy Kubernetes cluster locally" ,
} ,
2018-07-10 19:21:27 +00:00
cli . BoolFlag {
Name : "dind" ,
Usage : "Deploy Kubernetes cluster in docker containers (experimental)" ,
} ,
2018-09-10 23:17:45 +00:00
cli . StringFlag {
Name : "dind-storage-driver" ,
Usage : "Storage driver for the docker in docker containers (experimental)" ,
} ,
2019-01-22 00:46:08 +00:00
cli . StringFlag {
Name : "dind-dns-server" ,
Usage : "DNS resolver to be used by docker in docker container. Useful if host is running systemd-resovld" ,
Value : "8.8.8.8" ,
} ,
2018-03-20 12:56:49 +00:00
cli . BoolFlag {
Name : "update-only" ,
Usage : "Skip idempotent deployment of control and etcd plane" ,
} ,
cli . BoolFlag {
Name : "disable-port-check" ,
Usage : "Disable port check validation between nodes" ,
} ,
2018-10-31 23:11:57 +00:00
cli . BoolFlag {
Name : "init" ,
2018-11-07 23:54:08 +00:00
Usage : "Initiate RKE cluster" ,
2018-10-31 23:11:57 +00:00
} ,
2019-01-02 23:02:34 +00:00
cli . StringFlag {
Name : "cert-dir" ,
Usage : "Specify a certificate dir path" ,
} ,
cli . BoolFlag {
Name : "custom-certs" ,
Usage : "Use custom certificates from a cert dir" ,
} ,
2017-11-28 11:26:15 +00:00
}
2018-03-06 00:52:43 +00:00
2018-05-15 17:35:52 +00:00
upFlags = append ( upFlags , commonFlags ... )
2018-03-06 00:52:43 +00:00
2017-11-28 11:26:15 +00:00
return cli . Command {
Name : "up" ,
Usage : "Bring the cluster up" ,
Action : clusterUpFromCli ,
Flags : upFlags ,
}
}
2018-11-07 23:54:08 +00:00
2019-06-17 20:52:15 +00:00
func ClusterUp ( ctx context . Context , dialersOptions hosts . DialersOptions , flags cluster . ExternalFlags , data map [ string ] interface { } ) ( string , string , string , string , map [ string ] pki . CertificatePKI , error ) {
2017-11-28 11:26:15 +00:00
var APIURL , caCrt , clientCert , clientKey string
2020-03-12 19:22:52 +00:00
var reconcileCluster , restore bool
2018-11-02 05:53:29 +00:00
2018-11-07 23:54:08 +00:00
clusterState , err := cluster . ReadStateFile ( ctx , cluster . GetStateFilePath ( flags . ClusterFilePath , flags . ConfigDir ) )
2018-11-02 05:53:29 +00:00
if err != nil {
return APIURL , caCrt , clientCert , clientKey , nil , err
}
2019-10-03 01:56:39 +00:00
// We generate the first encryption config in ClusterInit, to store it ASAP. It's written
// to the DesiredState
stateEncryptionConfig := clusterState . DesiredState . EncryptionConfig
// if CurrentState has EncryptionConfig, it means this is NOT the first time we enable encryption, we should use the _latest_ applied value from the current cluster
if clusterState . CurrentState . EncryptionConfig != "" {
stateEncryptionConfig = clusterState . CurrentState . EncryptionConfig
}
kubeCluster , err := cluster . InitClusterObject ( ctx , clusterState . DesiredState . RancherKubernetesEngineConfig . DeepCopy ( ) , flags , stateEncryptionConfig )
2018-11-02 05:53:29 +00:00
if err != nil {
return APIURL , caCrt , clientCert , clientKey , nil , err
}
2019-09-06 22:53:14 +00:00
svcOptionsData := cluster . GetServiceOptionData ( data )
2018-12-20 22:01:42 +00:00
// check if rotate certificates is triggered
if kubeCluster . RancherKubernetesEngineConfig . RotateCertificates != nil {
2019-09-06 22:53:14 +00:00
return rebuildClusterWithRotatedCertificates ( ctx , dialersOptions , flags , svcOptionsData )
2018-12-20 22:01:42 +00:00
}
2018-11-03 01:45:23 +00:00
2018-12-20 22:01:42 +00:00
log . Infof ( ctx , "Building Kubernetes cluster" )
2018-11-07 23:54:08 +00:00
err = kubeCluster . SetupDialers ( ctx , dialersOptions )
2017-11-28 11:26:15 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-11-28 11:26:15 +00:00
}
2018-11-07 23:54:08 +00:00
err = kubeCluster . TunnelHosts ( ctx , flags )
2017-11-28 11:26:15 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-11-28 11:26:15 +00:00
}
2018-11-07 23:54:08 +00:00
currentCluster , err := kubeCluster . GetClusterState ( ctx , clusterState )
2018-01-18 20:41:04 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2018-01-16 18:29:09 +00:00
}
2018-11-07 23:54:08 +00:00
if ! flags . DisablePortCheck {
2018-03-20 12:56:49 +00:00
if err = kubeCluster . CheckClusterPorts ( ctx , currentCluster ) ; err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2018-03-20 12:56:49 +00:00
}
2017-11-28 11:26:15 +00:00
}
2018-11-03 01:45:23 +00:00
err = cluster . SetUpAuthentication ( ctx , kubeCluster , currentCluster , clusterState )
2017-11-28 11:26:15 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-11-28 11:26:15 +00:00
}
2018-11-03 01:45:23 +00:00
if len ( kubeCluster . ControlPlaneHosts ) > 0 {
2019-09-25 01:57:52 +00:00
APIURL = fmt . Sprintf ( "https://%s:6443" , kubeCluster . ControlPlaneHosts [ 0 ] . Address )
2018-11-03 01:45:23 +00:00
}
clientCert = string ( cert . EncodeCertPEM ( kubeCluster . Certificates [ pki . KubeAdminCertName ] . Certificate ) )
clientKey = string ( cert . EncodePrivateKeyPEM ( kubeCluster . Certificates [ pki . KubeAdminCertName ] . Key ) )
caCrt = string ( cert . EncodeCertPEM ( kubeCluster . Certificates [ pki . CACertName ] . Certificate ) )
2018-11-02 05:53:29 +00:00
2018-11-03 01:45:23 +00:00
// moved deploying certs before reconcile to remove all unneeded certs generation from reconcile
2019-01-14 17:51:20 +00:00
err = kubeCluster . SetUpHosts ( ctx , flags )
2018-11-03 01:45:23 +00:00
if err != nil {
return APIURL , caCrt , clientCert , clientKey , nil , err
}
2017-11-28 11:26:15 +00:00
2019-09-06 22:53:14 +00:00
err = cluster . ReconcileCluster ( ctx , kubeCluster , currentCluster , flags , svcOptionsData )
2017-11-28 11:26:15 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-11-28 11:26:15 +00:00
}
2019-10-03 01:56:39 +00:00
2020-03-12 19:22:52 +00:00
/ * reconcileCluster flag decides whether zero downtime upgrade logic is used or not .
Zero - downtime upgrades should happen only when upgrading existing clusters . Not for new clusters or during etcd snapshot restore .
currentCluster != nil indicates this is an existing cluster . Restore flag on DesiredState . RancherKubernetesEngineConfig indicates if it ' s a snapshot restore or not .
reconcileCluster flag should be set to true only if currentCluster is not nil and restore is set to false
* /
if clusterState . DesiredState . RancherKubernetesEngineConfig != nil {
restore = clusterState . DesiredState . RancherKubernetesEngineConfig . Restore . Restore
}
if currentCluster != nil && ! restore {
2020-02-26 21:33:22 +00:00
// reconcile this cluster, to check if upgrade is needed, or new nodes are getting added/removed
/ * This is to separate newly added nodes , so we don ' t try to check their status / cordon them before upgrade .
This will also cover nodes that were considered inactive first time cluster was provisioned , but are now active during upgrade * /
currentClusterNodes := make ( map [ string ] bool )
for _ , node := range clusterState . CurrentState . RancherKubernetesEngineConfig . Nodes {
currentClusterNodes [ node . HostnameOverride ] = true
}
newNodes := make ( map [ string ] bool )
for _ , node := range clusterState . DesiredState . RancherKubernetesEngineConfig . Nodes {
if ! currentClusterNodes [ node . HostnameOverride ] {
newNodes [ node . HostnameOverride ] = true
}
}
kubeCluster . NewHosts = newNodes
reconcileCluster = true
maxUnavailableWorker , maxUnavailableControl , err := kubeCluster . CalculateMaxUnavailable ( )
if err != nil {
return APIURL , caCrt , clientCert , clientKey , nil , err
}
logrus . Infof ( "Setting maxUnavailable for worker nodes to: %v" , maxUnavailableWorker )
2020-03-01 20:54:45 +00:00
logrus . Infof ( "Setting maxUnavailable for controlplane nodes to: %v" , maxUnavailableControl )
2020-02-26 21:33:22 +00:00
kubeCluster . MaxUnavailableForWorkerNodes , kubeCluster . MaxUnavailableForControlNodes = maxUnavailableWorker , maxUnavailableControl
}
2018-10-10 17:19:21 +00:00
// update APIURL after reconcile
if len ( kubeCluster . ControlPlaneHosts ) > 0 {
2019-09-25 01:57:52 +00:00
APIURL = fmt . Sprintf ( "https://%s:6443" , kubeCluster . ControlPlaneHosts [ 0 ] . Address )
2018-10-10 17:19:21 +00:00
}
2019-10-03 01:56:39 +00:00
if err = cluster . ReconcileEncryptionProviderConfig ( ctx , kubeCluster , currentCluster ) ; err != nil {
return APIURL , caCrt , clientCert , clientKey , nil , err
}
2018-11-02 05:53:29 +00:00
2018-02-01 21:43:09 +00:00
if err := kubeCluster . PrePullK8sImages ( ctx ) ; err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2018-02-01 21:43:09 +00:00
}
2020-02-26 21:33:22 +00:00
errMsgMaxUnavailableNotFailedCtrl , err := kubeCluster . DeployControlPlane ( ctx , svcOptionsData , reconcileCluster )
2017-11-28 11:26:15 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-11-28 11:26:15 +00:00
}
2018-02-26 21:14:04 +00:00
// Apply Authz configuration after deploying controlplane
2018-11-07 23:54:08 +00:00
err = cluster . ApplyAuthzResources ( ctx , kubeCluster . RancherKubernetesEngineConfig , flags , dialersOptions )
2018-02-26 21:14:04 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2018-02-26 21:14:04 +00:00
}
2018-11-07 23:54:08 +00:00
err = kubeCluster . UpdateClusterCurrentState ( ctx , clusterState )
2017-11-28 11:26:15 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-11-28 11:26:15 +00:00
}
2018-11-07 23:54:08 +00:00
err = cluster . SaveFullStateToKubernetes ( ctx , kubeCluster , clusterState )
2018-11-07 00:24:49 +00:00
if err != nil {
return APIURL , caCrt , clientCert , clientKey , nil , err
}
2020-02-26 21:33:22 +00:00
errMsgMaxUnavailableNotFailedWrkr , err := kubeCluster . DeployWorkerPlane ( ctx , svcOptionsData , reconcileCluster )
2017-12-26 22:07:25 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-12-26 22:07:25 +00:00
}
2018-03-21 17:20:58 +00:00
if err = kubeCluster . CleanDeadLogs ( ctx ) ; err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2018-03-21 17:20:58 +00:00
}
2018-09-26 23:26:20 +00:00
err = kubeCluster . SyncLabelsAndTaints ( ctx , currentCluster )
2017-11-28 11:26:15 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-11-28 11:26:15 +00:00
}
2019-06-17 20:52:15 +00:00
err = cluster . ConfigureCluster ( ctx , kubeCluster . RancherKubernetesEngineConfig , kubeCluster . Certificates , flags , dialersOptions , data , false )
2017-11-28 11:26:15 +00:00
if err != nil {
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , nil , err
2017-11-28 11:26:15 +00:00
}
2019-10-03 01:56:39 +00:00
if kubeCluster . EncryptionConfig . RewriteSecrets {
if err = kubeCluster . RewriteSecrets ( ctx ) ; err != nil {
return APIURL , caCrt , clientCert , clientKey , nil , err
}
}
2017-11-28 11:26:15 +00:00
2018-04-18 06:04:30 +00:00
if err := checkAllIncluded ( kubeCluster ) ; err != nil {
return APIURL , caCrt , clientCert , clientKey , nil , err
}
2020-02-26 21:33:22 +00:00
if errMsgMaxUnavailableNotFailedCtrl != "" || errMsgMaxUnavailableNotFailedWrkr != "" {
return APIURL , caCrt , clientCert , clientKey , nil , fmt . Errorf ( errMsgMaxUnavailableNotFailedCtrl + errMsgMaxUnavailableNotFailedWrkr )
2020-02-04 19:27:52 +00:00
}
2018-01-09 22:10:56 +00:00
log . Infof ( ctx , "Finished building Kubernetes cluster successfully" )
2018-04-02 11:02:00 +00:00
return APIURL , caCrt , clientCert , clientKey , kubeCluster . Certificates , nil
2017-11-28 11:26:15 +00:00
}
2018-04-18 06:04:30 +00:00
func checkAllIncluded ( cluster * cluster . Cluster ) error {
if len ( cluster . InactiveHosts ) == 0 {
return nil
}
var names [ ] string
for _ , host := range cluster . InactiveHosts {
names = append ( names , host . Address )
}
2020-02-14 17:40:23 +00:00
if len ( names ) > 0 {
return fmt . Errorf ( "Provisioning incomplete, host(s) [%s] skipped because they could not be contacted" , strings . Join ( names , "," ) )
}
return nil
2018-04-18 06:04:30 +00:00
}
2017-11-28 11:26:15 +00:00
func clusterUpFromCli ( ctx * cli . Context ) error {
2019-09-03 20:01:22 +00:00
logrus . Infof ( "Running RKE version: %v" , ctx . App . Version )
2018-01-15 04:36:28 +00:00
if ctx . Bool ( "local" ) {
return clusterUpLocal ( ctx )
}
2018-07-10 19:21:27 +00:00
if ctx . Bool ( "dind" ) {
return clusterUpDind ( ctx )
}
2017-12-16 03:38:15 +00:00
clusterFile , filePath , err := resolveClusterFile ( ctx )
2017-11-28 11:26:15 +00:00
if err != nil {
return fmt . Errorf ( "Failed to resolve cluster file: %v" , err )
}
2017-12-16 03:38:15 +00:00
rkeConfig , err := cluster . ParseConfig ( clusterFile )
if err != nil {
return fmt . Errorf ( "Failed to parse cluster file: %v" , err )
}
2018-03-06 00:52:43 +00:00
rkeConfig , err = setOptionsFromCLI ( ctx , rkeConfig )
if err != nil {
return err
}
2018-03-20 12:56:49 +00:00
updateOnly := ctx . Bool ( "update-only" )
disablePortCheck := ctx . Bool ( "disable-port-check" )
2018-11-07 23:54:08 +00:00
// setting up the flags
2018-11-12 23:24:59 +00:00
flags := cluster . GetExternalFlags ( false , updateOnly , disablePortCheck , "" , filePath )
2019-01-02 23:02:34 +00:00
// Custom certificates and certificate dir flags
flags . CertificateDir = ctx . String ( "cert-dir" )
flags . CustomCerts = ctx . Bool ( "custom-certs" )
2018-10-31 23:11:57 +00:00
if ctx . Bool ( "init" ) {
2018-11-07 23:54:08 +00:00
return ClusterInit ( context . Background ( ) , rkeConfig , hosts . DialersOptions { } , flags )
2018-10-31 23:11:57 +00:00
}
2018-11-07 23:54:08 +00:00
if err := ClusterInit ( context . Background ( ) , rkeConfig , hosts . DialersOptions { } , flags ) ; err != nil {
2018-11-02 05:53:29 +00:00
return err
}
2018-11-07 23:54:08 +00:00
2019-06-17 20:52:15 +00:00
_ , _ , _ , _ , _ , err = ClusterUp ( context . Background ( ) , hosts . DialersOptions { } , flags , map [ string ] interface { } { } )
2018-01-15 04:36:28 +00:00
return err
}
func clusterUpLocal ( ctx * cli . Context ) error {
var rkeConfig * v3 . RancherKubernetesEngineConfig
clusterFile , filePath , err := resolveClusterFile ( ctx )
if err != nil {
log . Infof ( context . Background ( ) , "Failed to resolve cluster file, using default cluster instead" )
rkeConfig = cluster . GetLocalRKEConfig ( )
} else {
rkeConfig , err = cluster . ParseConfig ( clusterFile )
if err != nil {
return fmt . Errorf ( "Failed to parse cluster file: %v" , err )
}
2017-12-22 01:01:53 +00:00
rkeConfig . Nodes = [ ] v3 . RKEConfigNode { * cluster . GetLocalRKENodeConfig ( ) }
}
2018-05-15 17:35:52 +00:00
2020-05-20 18:30:46 +00:00
ignoreDockerVersion := ctx . Bool ( "ignore-docker-version" )
rkeConfig . IgnoreDockerVersion = & ignoreDockerVersion
2018-05-15 17:35:52 +00:00
2018-11-07 23:54:08 +00:00
// setting up the dialers
dialers := hosts . GetDialerOptions ( nil , hosts . LocalHealthcheckFactory , nil )
// setting up the flags
2018-11-12 23:24:59 +00:00
flags := cluster . GetExternalFlags ( true , false , false , "" , filePath )
2018-11-07 23:54:08 +00:00
if ctx . Bool ( "init" ) {
return ClusterInit ( context . Background ( ) , rkeConfig , dialers , flags )
}
if err := ClusterInit ( context . Background ( ) , rkeConfig , dialers , flags ) ; err != nil {
return err
}
2019-06-17 20:52:15 +00:00
_ , _ , _ , _ , _ , err = ClusterUp ( context . Background ( ) , dialers , flags , map [ string ] interface { } { } )
2017-11-28 11:26:15 +00:00
return err
}
2018-07-10 19:21:27 +00:00
func clusterUpDind ( ctx * cli . Context ) error {
// get dind config
2019-01-22 00:46:08 +00:00
rkeConfig , disablePortCheck , dindStorageDriver , filePath , dindDNS , err := getDindConfig ( ctx )
2018-07-10 19:21:27 +00:00
if err != nil {
return err
}
// setup dind environment
2019-01-22 00:46:08 +00:00
if err = createDINDEnv ( context . Background ( ) , rkeConfig , dindStorageDriver , dindDNS ) ; err != nil {
2018-07-10 19:21:27 +00:00
return err
}
2018-11-07 23:54:08 +00:00
// setting up the dialers
dialers := hosts . GetDialerOptions ( hosts . DindConnFactory , hosts . DindHealthcheckConnFactory , nil )
// setting up flags
2018-11-12 23:24:59 +00:00
flags := cluster . GetExternalFlags ( false , false , disablePortCheck , "" , filePath )
2019-01-07 19:52:57 +00:00
flags . DinD = true
2018-11-07 23:54:08 +00:00
if ctx . Bool ( "init" ) {
return ClusterInit ( context . Background ( ) , rkeConfig , dialers , flags )
}
if err := ClusterInit ( context . Background ( ) , rkeConfig , dialers , flags ) ; err != nil {
return err
}
2018-07-10 19:21:27 +00:00
// start cluster
2019-06-17 20:52:15 +00:00
_ , _ , _ , _ , _ , err = ClusterUp ( context . Background ( ) , dialers , flags , map [ string ] interface { } { } )
2018-07-10 19:21:27 +00:00
return err
}
2019-01-22 00:46:08 +00:00
func getDindConfig ( ctx * cli . Context ) ( * v3 . RancherKubernetesEngineConfig , bool , string , string , string , error ) {
2018-07-10 19:21:27 +00:00
disablePortCheck := ctx . Bool ( "disable-port-check" )
2018-09-10 23:17:45 +00:00
dindStorageDriver := ctx . String ( "dind-storage-driver" )
2019-01-22 00:46:08 +00:00
dindDNS := ctx . String ( "dind-dns-server" )
2018-09-10 23:17:45 +00:00
2018-07-10 19:21:27 +00:00
clusterFile , filePath , err := resolveClusterFile ( ctx )
if err != nil {
2019-01-22 00:46:08 +00:00
return nil , disablePortCheck , "" , "" , "" , fmt . Errorf ( "Failed to resolve cluster file: %v" , err )
2018-07-10 19:21:27 +00:00
}
rkeConfig , err := cluster . ParseConfig ( clusterFile )
if err != nil {
2019-01-22 00:46:08 +00:00
return nil , disablePortCheck , "" , "" , "" , fmt . Errorf ( "Failed to parse cluster file: %v" , err )
2018-07-10 19:21:27 +00:00
}
rkeConfig , err = setOptionsFromCLI ( ctx , rkeConfig )
if err != nil {
2019-01-22 00:46:08 +00:00
return nil , disablePortCheck , "" , "" , "" , err
2018-07-10 19:21:27 +00:00
}
// Setting conntrack max for kubeproxy to 0
if rkeConfig . Services . Kubeproxy . ExtraArgs == nil {
rkeConfig . Services . Kubeproxy . ExtraArgs = make ( map [ string ] string )
}
rkeConfig . Services . Kubeproxy . ExtraArgs [ "conntrack-max-per-core" ] = "0"
2019-01-22 00:46:08 +00:00
return rkeConfig , disablePortCheck , dindStorageDriver , filePath , dindDNS , nil
2018-07-10 19:21:27 +00:00
}
2019-01-22 00:46:08 +00:00
func createDINDEnv ( ctx context . Context , rkeConfig * v3 . RancherKubernetesEngineConfig , dindStorageDriver , dindDNS string ) error {
2018-08-14 22:04:56 +00:00
for i := range rkeConfig . Nodes {
2019-01-22 00:46:08 +00:00
address , err := dind . StartUpDindContainer ( ctx , rkeConfig . Nodes [ i ] . Address , dind . DINDNetwork , dindStorageDriver , dindDNS )
2018-08-14 22:04:56 +00:00
if err != nil {
2018-07-10 19:21:27 +00:00
return err
}
2018-08-14 22:04:56 +00:00
if rkeConfig . Nodes [ i ] . HostnameOverride == "" {
rkeConfig . Nodes [ i ] . HostnameOverride = rkeConfig . Nodes [ i ] . Address
}
rkeConfig . Nodes [ i ] . Address = address
2018-07-10 19:21:27 +00:00
}
time . Sleep ( DINDWaitTime * time . Second )
return nil
}