From 6b1f842f254597794ebb6aaf23f9f796a61b415c Mon Sep 17 00:00:00 2001 From: Naadir Jeewa Date: Wed, 25 Mar 2020 20:13:59 +0000 Subject: [PATCH] bootstrap: Retry node joins as well Signed-off-by: Naadir Jeewa --- .../controllers/kubeadmconfig_controller.go | 31 +++++----- .../kubeadm/internal/cloudinit/cloudinit.go | 61 ++++++++++++++++--- .../internal/cloudinit/controlplane_join.go | 46 ++------------ .../cloudinit/kubeadm-bootstrap-script.sh | 34 +++++++---- bootstrap/kubeadm/internal/cloudinit/node.go | 8 ++- .../cloudinit/zz_generated.bindata.go | 4 +- 6 files changed, 101 insertions(+), 83 deletions(-) diff --git a/bootstrap/kubeadm/controllers/kubeadmconfig_controller.go b/bootstrap/kubeadm/controllers/kubeadmconfig_controller.go index 31ef04533367..49b0d804ecfe 100644 --- a/bootstrap/kubeadm/controllers/kubeadmconfig_controller.go +++ b/bootstrap/kubeadm/controllers/kubeadmconfig_controller.go @@ -422,12 +422,13 @@ func (r *KubeadmConfigReconciler) joinWorker(ctx context.Context, scope *Scope) cloudJoinData, err := cloudinit.NewNode(&cloudinit.NodeInput{ BaseUserData: cloudinit.BaseUserData{ - AdditionalFiles: scope.Config.Spec.Files, - NTP: scope.Config.Spec.NTP, - PreKubeadmCommands: scope.Config.Spec.PreKubeadmCommands, - PostKubeadmCommands: scope.Config.Spec.PostKubeadmCommands, - Users: scope.Config.Spec.Users, - KubeadmVerbosity: verbosityFlag, + AdditionalFiles: scope.Config.Spec.Files, + NTP: scope.Config.Spec.NTP, + PreKubeadmCommands: scope.Config.Spec.PreKubeadmCommands, + PostKubeadmCommands: scope.Config.Spec.PostKubeadmCommands, + Users: scope.Config.Spec.Users, + KubeadmVerbosity: verbosityFlag, + UseExperimentalRetry: scope.Config.Spec.UseExperimentalRetryJoin, }, JoinConfiguration: joinData, }) @@ -489,16 +490,16 @@ func (r *KubeadmConfigReconciler) joinControlplane(ctx context.Context, scope *S } cloudJoinData, err := cloudinit.NewJoinControlPlane(&cloudinit.ControlPlaneJoinInput{ - JoinConfiguration: joinData, - Certificates: certificates, - UseExperimentalRetry: scope.Config.Spec.UseExperimentalRetryJoin, + JoinConfiguration: joinData, + Certificates: certificates, BaseUserData: cloudinit.BaseUserData{ - AdditionalFiles: scope.Config.Spec.Files, - NTP: scope.Config.Spec.NTP, - PreKubeadmCommands: scope.Config.Spec.PreKubeadmCommands, - PostKubeadmCommands: scope.Config.Spec.PostKubeadmCommands, - Users: scope.Config.Spec.Users, - KubeadmVerbosity: verbosityFlag, + AdditionalFiles: scope.Config.Spec.Files, + NTP: scope.Config.Spec.NTP, + PreKubeadmCommands: scope.Config.Spec.PreKubeadmCommands, + PostKubeadmCommands: scope.Config.Spec.PostKubeadmCommands, + Users: scope.Config.Spec.Users, + KubeadmVerbosity: verbosityFlag, + UseExperimentalRetry: scope.Config.Spec.UseExperimentalRetryJoin, }, }) if err != nil { diff --git a/bootstrap/kubeadm/internal/cloudinit/cloudinit.go b/bootstrap/kubeadm/internal/cloudinit/cloudinit.go index 5536e14c96fc..6e755b0e6271 100644 --- a/bootstrap/kubeadm/internal/cloudinit/cloudinit.go +++ b/bootstrap/kubeadm/internal/cloudinit/cloudinit.go @@ -18,6 +18,7 @@ package cloudinit import ( "bytes" + "fmt" "text/template" "github.com/pkg/errors" @@ -25,21 +26,46 @@ import ( ) const ( - cloudConfigHeader = `## template: jinja + standardJoinCommand = "kubeadm join --config /tmp/kubeadm-join-config.yaml %s" + retriableJoinScriptName = "/usr/local/bin/kubeadm-bootstrap-script" + retriableJoinScriptOwner = "root" + retriableJoinScriptPermissions = "0755" + cloudConfigHeader = `## template: jinja #cloud-config ` ) // BaseUserData is shared across all the various types of files written to disk. type BaseUserData struct { - Header string - PreKubeadmCommands []string - PostKubeadmCommands []string - AdditionalFiles []bootstrapv1.File - WriteFiles []bootstrapv1.File - Users []bootstrapv1.User - NTP *bootstrapv1.NTP - KubeadmVerbosity string + Header string + PreKubeadmCommands []string + PostKubeadmCommands []string + AdditionalFiles []bootstrapv1.File + WriteFiles []bootstrapv1.File + Users []bootstrapv1.User + NTP *bootstrapv1.NTP + KubeadmVerbosity string + UseExperimentalRetry bool + KubeadmCommand string +} + +func (input *BaseUserData) prepare(controlplane bool) error { + input.Header = cloudConfigHeader + input.WriteFiles = append(input.WriteFiles, input.AdditionalFiles...) + input.KubeadmCommand = fmt.Sprintf(standardJoinCommand, input.KubeadmVerbosity) + if input.UseExperimentalRetry { + if controlplane { + input.KubeadmCommand = fmt.Sprintf("%s controlplane", retriableJoinScriptName) + } else { + input.KubeadmCommand = retriableJoinScriptName + } + joinScriptFile, err := generateBootstrapScript(input) + if err != nil { + return errors.Wrap(err, "failed to generate user data for machine joining control plane") + } + input.WriteFiles = append(input.WriteFiles, *joinScriptFile) + } + return nil } func generate(kind string, tpl string, data interface{}) ([]byte, error) { @@ -72,3 +98,20 @@ func generate(kind string, tpl string, data interface{}) ([]byte, error) { return out.Bytes(), nil } + +func generateBootstrapScript(input interface{}) (*bootstrapv1.File, error) { + scriptBytes, err := bootstrapKubeadmInternalCloudinitKubeadmBootstrapScriptShBytes() + if err != nil { + return nil, errors.Wrap(err, "couldn't read bootstrap script") + } + joinScript, err := generate("JoinScript", string(scriptBytes), input) + if err != nil { + return nil, errors.Wrap(err, "failed to bootstrap script for machine joins") + } + return &bootstrapv1.File{ + Path: retriableJoinScriptName, + Owner: retriableJoinScriptOwner, + Permissions: retriableJoinScriptPermissions, + Content: string(joinScript), + }, nil +} diff --git a/bootstrap/kubeadm/internal/cloudinit/controlplane_join.go b/bootstrap/kubeadm/internal/cloudinit/controlplane_join.go index ae0ff0520f7f..a1c01fe596cc 100644 --- a/bootstrap/kubeadm/internal/cloudinit/controlplane_join.go +++ b/bootstrap/kubeadm/internal/cloudinit/controlplane_join.go @@ -17,22 +17,14 @@ limitations under the License. package cloudinit import ( - "fmt" - "github.com/pkg/errors" - bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1alpha3" "sigs.k8s.io/cluster-api/util/secret" ) const ( - standardJoinCommand = "kubeadm join --config /tmp/kubeadm-controlplane-join-config.yaml %s" - retriableJoinScriptName = "/usr/local/bin/kubeadm-bootstrap-script" - retriableJoinScriptOwner = "root" - retriableJoinScriptPermissions = "0755" - controlPlaneJoinCloudInit = `{{.Header}} {{template "files" .WriteFiles}} -- path: /tmp/kubeadm-controlplane-join-config.yaml +- path: /tmp/kubeadm-join-config.yaml owner: root:root permissions: '0640' content: | @@ -50,24 +42,16 @@ runcmd: type ControlPlaneJoinInput struct { BaseUserData secret.Certificates - UseExperimentalRetry bool - KubeadmCommand string - BootstrapToken string - JoinConfiguration string + BootstrapToken string + JoinConfiguration string } // NewJoinControlPlane returns the user data string to be used on a new control plane instance. func NewJoinControlPlane(input *ControlPlaneJoinInput) ([]byte, error) { - input.Header = cloudConfigHeader // TODO: Consider validating that the correct certificates exist. It is different for external/stacked etcd input.WriteFiles = input.Certificates.AsFiles() - input.WriteFiles = append(input.WriteFiles, input.AdditionalFiles...) - input.KubeadmCommand = fmt.Sprintf(standardJoinCommand, input.KubeadmVerbosity) - if input.UseExperimentalRetry { - err := input.useBootstrapScript() - if err != nil { - return nil, err - } + if err := input.prepare(true); err != nil { + return nil, err } userData, err := generate("JoinControlplane", controlPlaneJoinCloudInit, input) if err != nil { @@ -76,23 +60,3 @@ func NewJoinControlPlane(input *ControlPlaneJoinInput) ([]byte, error) { return userData, err } - -func (input *ControlPlaneJoinInput) useBootstrapScript() error { - scriptBytes, err := bootstrapKubeadmInternalCloudinitKubeadmBootstrapScriptShBytes() - if err != nil { - return errors.Wrap(err, "couldn't read bootstrap script") - } - joinScript, err := generate("JoinControlplaneScript", string(scriptBytes), input) - if err != nil { - return errors.Wrap(err, "failed to generate user data for machine joining control plane") - } - joinScriptFile := bootstrapv1.File{ - Path: retriableJoinScriptName, - Owner: retriableJoinScriptOwner, - Permissions: retriableJoinScriptPermissions, - Content: string(joinScript), - } - input.WriteFiles = append(input.WriteFiles, joinScriptFile) - input.KubeadmCommand = retriableJoinScriptName - return nil -} diff --git a/bootstrap/kubeadm/internal/cloudinit/kubeadm-bootstrap-script.sh b/bootstrap/kubeadm/internal/cloudinit/kubeadm-bootstrap-script.sh index 8b42d367ec3b..cc5dea284d27 100644 --- a/bootstrap/kubeadm/internal/cloudinit/kubeadm-bootstrap-script.sh +++ b/bootstrap/kubeadm/internal/cloudinit/kubeadm-bootstrap-script.sh @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +OPTION="$1" + # Log an error and exit. # Args: # $1 Message to log with the error @@ -22,10 +24,12 @@ log::error_exit() { local code="${2}" log::error "${message}" - log::info "Removing member from cluster status" - kubeadm reset -f update-cluster-status || true - log::info "Removing etcd member" - kubeadm reset -f remove-etcd-member || true + if [ "$OPTION" == "controlplane" ]; then + log::info "Removing member from cluster status" + kubeadm reset -f update-cluster-status || true + lo g::info "Removing etcd member" + kubeadm reset -f remove-etcd-member || true + fi log::info "Resetting kubeadm" kubeadm reset -f || true log::error "cluster.x-k8s.io kubeadm bootstrap script $0 exiting with status ${code}" @@ -86,7 +90,7 @@ function retry-command() { until [ $n -ge 5 ]; do log::info "running '$*'" # shellcheck disable=SC1083 - "$@" --config /tmp/kubeadm-controlplane-join-config.yaml {{.KubeadmVerbosity}} + "$@" --config /tmp/kubeadm-join-config.yaml {{.KubeadmVerbosity}} kubeadm_return=$? check_kubeadm_command "'$*'" "${kubeadm_return}" if [ ${kubeadm_return} -eq 0 ]; then @@ -108,7 +112,7 @@ function try-or-die-command() { local kubeadm_return log::info "running '$*'" # shellcheck disable=SC1083 - "$@" --config /tmp/kubeadm-controlplane-join-config.yaml {{.KubeadmVerbosity}} + "$@" --config /tmp/kubeadm-join-config.yaml {{.KubeadmVerbosity}} kubeadm_return=$? check_kubeadm_command "'$*'" "${kubeadm_return}" if [ ${kubeadm_return} -ne 0 ]; then @@ -117,13 +121,17 @@ function try-or-die-command() { } retry-command kubeadm join phase preflight -retry-command kubeadm join phase control-plane-prepare download-certs -retry-command kubeadm join phase control-plane-prepare certs -retry-command kubeadm join phase control-plane-prepare kubeconfig -retry-command kubeadm join phase control-plane-prepare control-plane +if [ "$OPTION" == "controlplane" ]; then + retry-command kubeadm join phase control-plane-prepare download-certs + retry-command kubeadm join phase control-plane-prepare certs + retry-command kubeadm join phase control-plane-prepare kubeconfig + retry-command kubeadm join phase control-plane-prepare control-plane +fi retry-command kubeadm join phase kubelet-start -try-or-die-command kubeadm join phase control-plane-join etcd -retry-command kubeadm join phase control-plane-join update-status -retry-command kubeadm join phase control-plane-join mark-control-plane +if [ "$OPTION" == "controlplane" ]; then + try-or-die-command kubeadm join phase control-plane-join etcd + retry-command kubeadm join phase control-plane-join update-status + retry-command kubeadm join phase control-plane-join mark-control-plane +fi log::success_exit diff --git a/bootstrap/kubeadm/internal/cloudinit/node.go b/bootstrap/kubeadm/internal/cloudinit/node.go index f67563f155bf..f6fadc0e32b5 100644 --- a/bootstrap/kubeadm/internal/cloudinit/node.go +++ b/bootstrap/kubeadm/internal/cloudinit/node.go @@ -19,7 +19,7 @@ package cloudinit const ( nodeCloudInit = `{{.Header}} {{template "files" .WriteFiles}} -- path: /tmp/kubeadm-node.yaml +- path: /tmp/kubeadm-join-config.yaml owner: root:root permissions: '0640' content: | @@ -27,7 +27,7 @@ const ( {{.JoinConfiguration | Indent 6}} runcmd: {{- template "commands" .PreKubeadmCommands }} - - 'kubeadm join --config /tmp/kubeadm-node.yaml {{.KubeadmVerbosity}}' + - {{ .KubeadmCommand }} {{- template "commands" .PostKubeadmCommands }} {{- template "ntp" .NTP }} {{- template "users" .Users }} @@ -37,12 +37,14 @@ runcmd: // NodeInput defines the context to generate a node user data. type NodeInput struct { BaseUserData - JoinConfiguration string } // NewNode returns the user data string to be used on a node instance. func NewNode(input *NodeInput) ([]byte, error) { + if err := input.prepare(false); err != nil { + return nil, err + } input.Header = cloudConfigHeader input.WriteFiles = append(input.WriteFiles, input.AdditionalFiles...) return generate("Node", nodeCloudInit, input) diff --git a/bootstrap/kubeadm/internal/cloudinit/zz_generated.bindata.go b/bootstrap/kubeadm/internal/cloudinit/zz_generated.bindata.go index d0039238ed87..2ef5e5f191f4 100644 --- a/bootstrap/kubeadm/internal/cloudinit/zz_generated.bindata.go +++ b/bootstrap/kubeadm/internal/cloudinit/zz_generated.bindata.go @@ -93,7 +93,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _bootstrapKubeadmInternalCloudinitKubeadmBootstrapScriptSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\x71\x4f\x1b\xb9\x13\xfd\x7f\x3f\xc5\x23\x89\x7e\x85\xc2\x26\x21\x55\x7f\xaa\x40\xdc\x5d\x8e\xb6\xba\xa8\x3d\x38\x11\xda\xaa\xaa\x2a\xe4\xec\xce\xee\xfa\xf0\xda\x5b\xdb\xdb\x10\x51\xbe\xfb\xc9\x5e\x27\x4d\x48\x80\x96\xbb\xfc\x15\x8d\x67\xde\xcc\xbc\x79\x1e\x6f\x7b\xab\x37\xe1\xb2\x37\x61\xa6\x88\xda\x38\x56\xd5\x4c\xf3\xbc\xb0\x18\xf4\x07\x7d\x9c\x17\x84\x37\xf5\x84\xb4\x24\x4b\x06\xc3\xda\x16\x4a\x9b\x6e\xd4\x8e\xda\x78\xcb\x13\x92\x86\x52\xd4\x32\x25\x0d\x5b\x10\x86\x15\x4b\x0a\x9a\x9f\xec\xe1\x3d\x69\xc3\x95\xc4\xa0\xdb\xc7\xb6\x73\x68\x85\xa3\xd6\xce\x61\xd4\xc6\x4c\xd5\x28\xd9\x0c\x52\x59\xd4\x86\x60\x0b\x6e\x90\x71\x41\xa0\xab\x84\x2a\x0b\x2e\x91\xa8\xb2\x12\x9c\xc9\x84\x30\xe5\xb6\xf0\x69\x02\x48\x37\x6a\xe3\x63\x80\x50\x13\xcb\xb8\x04\x43\xa2\xaa\x19\x54\xb6\xec\x07\x66\x7d\xc1\xee\x57\x58\x5b\x1d\xf4\x7a\xd3\xe9\xb4\xcb\x7c\xb1\x5d\xa5\xf3\x9e\x68\x1c\x4d\xef\xed\xe8\xf8\xd5\xc9\xf8\x55\x3c\xe8\xf6\x7d\xc8\x3b\x29\xc8\x18\x68\xfa\x52\x73\x4d\x29\x26\x33\xb0\xaa\x12\x3c\x61\x13\x41\x10\x6c\x0a\xa5\xc1\x72\x4d\x94\xc2\x2a\x57\xef\x54\x73\xcb\x65\xbe\x07\xa3\x32\x3b\x65\x9a\xa2\x36\x52\x6e\xac\xe6\x93\xda\xae\x90\x35\xaf\x8e\x9b\x15\x07\x25\xc1\x24\x5a\xc3\x31\x46\xe3\x16\x7e\x1f\x8e\x47\xe3\xbd\xa8\x8d\x0f\xa3\xf3\x3f\x4e\xdf\x9d\xe3\xc3\xf0\xec\x6c\x78\x72\x3e\x7a\x35\xc6\xe9\x19\x8e\x4f\x4f\x5e\x8e\xce\x47\xa7\x27\x63\x9c\xbe\xc6\xf0\xe4\x23\xde\x8c\x4e\x5e\xee\x81\xb8\x2d\x48\x83\xae\x2a\xed\xea\x57\x1a\xdc\xd1\x48\xa9\xe3\x6c\x4c\xb4\x52\x40\xa6\x9a\x82\x4c\x45\x09\xcf\x78\x02\xc1\x64\x5e\xb3\x9c\x90\xab\xaf\xa4\x25\x97\x39\x2a\xd2\x25\x37\x6e\x98\x06\x4c\xa6\x51\x1b\x82\x97\xdc\x32\xeb\x2d\x6b\x4d\x75\x23\x27\x10\x95\xbb\x56\x48\x6b\x47\x92\x4c\x41\x57\xdc\xba\x02\x86\x3a\x37\x07\x7e\x20\x9d\x7d\xfc\x49\xc6\xb8\x5c\x56\x41\xa8\xfc\xfb\x90\x7d\x58\xe3\x34\xf0\x3a\x6c\x70\x12\x95\x7a\x5f\x4d\xb6\xd6\x32\x12\x2a\x3f\x38\xf0\x27\x17\x0e\x7d\x7b\x07\xd7\x11\x20\x54\xc2\x04\xca\x06\xf9\xa8\xd5\xb9\xde\xbf\x69\x2d\xcc\x0e\xc1\xd9\x06\x37\xad\xc8\x1b\xe7\x08\x68\x75\xae\x43\x4c\x70\xcf\x0f\x0e\xb8\xcc\x14\x5a\x67\x54\xaa\xaf\x8e\x87\x92\xca\x09\x69\x64\x5a\x95\x48\x44\x6d\x2c\x69\x18\xcb\x6c\x6d\x5c\xc4\x65\x3d\x21\x96\x96\xd0\x64\xc8\x22\xce\x50\x57\x29\xb3\x14\x07\xcf\xb8\xf1\xc4\xb7\x6f\xb0\xba\xa6\x3b\x52\x90\x4d\xd2\x90\x67\x23\xa6\x76\x8e\x14\x3b\xb7\x38\x94\x73\x07\xa0\x21\xeb\xb4\x38\x87\xd8\x88\x76\x2b\x34\x10\x11\x0a\xee\x5e\xc5\x97\x2f\x4c\x97\xab\x45\xdc\x44\x29\x6b\xac\x66\x15\x4c\xa2\x79\x65\xd1\xe9\xfb\xb1\xba\x34\x7e\x74\xa1\xc5\xce\xb5\xa3\xd9\xd3\xe8\x8e\x1d\xb5\xc1\x70\x13\x35\x43\x33\x75\x92\x90\x31\xab\x63\x5b\x14\xff\x53\x05\x64\x5c\x72\x53\x50\xba\xc8\xd6\x77\x59\x6e\x09\x70\x52\x5b\x5c\x12\x55\xc8\x15\x97\x79\x77\x49\x39\xf7\x8b\xc6\xf2\x92\x8c\x65\x65\x75\xd4\xd9\x76\xc3\x44\x1c\x73\xa3\xe2\x17\xff\xef\xef\x1f\x19\x4a\x94\x4c\xcd\x8e\xcb\x9b\x14\x0a\xad\xad\xad\x2d\x7c\xea\x5c\x2f\x62\x6e\x3e\xc3\xe3\xe0\x97\xff\x0d\x22\xc0\x14\x3c\xb3\x11\xfc\x8d\x0b\x89\x0e\x91\xaa\xc8\x6d\xa6\x06\xc0\xfd\x5b\x52\x61\x88\x4b\x95\xa4\xa6\xa5\xbf\x34\x97\x16\x6c\x4e\xb3\xe0\x92\xba\xc0\x6b\xa5\x4b\x66\x6d\xb3\x84\x4c\xa1\xa6\xa8\x2b\xf8\x75\x68\xac\x26\x56\xba\x85\xa8\x6a\x5b\xd5\x36\xf4\xed\x48\x0e\x6d\xff\x54\x7f\xbb\xbb\xbb\x1b\xfb\x7b\x4c\x6f\x4b\x7d\x25\x05\x25\x97\x17\x61\xc4\x17\x89\x2a\x4b\x26\xd3\x95\xb1\x04\xdb\x7d\x77\x19\x48\x98\xa1\xb9\xf2\xc0\x65\x04\xb4\xfa\xad\x1d\x5f\xc1\x92\xb4\xbe\x5f\x81\x4a\x69\xc7\x59\x50\x62\x56\x0b\xd0\x15\x25\xb5\xdb\x69\xbe\x0d\x07\xe5\xd3\x7a\x74\xe0\xf0\xd0\x41\xee\x2f\x43\x86\xfb\xb2\x86\x99\x31\x2e\x28\x05\x4b\x1c\xd8\xb6\xd9\xb9\x07\x6f\xf0\x23\x78\x95\xa6\x4c\xf8\x77\xd9\x73\x15\x34\x9d\xd6\xda\x5d\xbc\xcd\xb8\xcf\xd6\x70\x2f\x9a\xab\xb8\x06\xfe\x95\x09\x9e\xfa\x55\x1e\x70\xef\x2c\xf6\xe9\x0f\x94\x5a\xcb\x4b\xa9\xa6\x73\xa8\xf9\x38\xee\x84\x24\xc3\x12\xa7\x81\xac\x96\x9e\x2c\xb7\xd9\xf5\x2c\x5e\x15\x81\x3c\xea\x2f\x66\x3e\x97\x49\x78\x01\x80\x5a\x5a\x2e\xf0\x09\x1d\x89\x38\x27\x3c\xc7\xe7\x85\xf0\x96\xc6\xae\x6b\xe9\x5f\xb2\x27\x9d\xa7\x4f\x9a\xf4\x6d\x98\x82\x84\x68\x08\x4d\xb9\x71\x6f\xfa\xd1\xf8\x78\xbf\xff\xe2\x99\x3f\x6f\x75\x7e\x6b\x21\x8e\x13\x25\x33\x9e\xa3\x67\xcb\xaa\x17\x72\x3b\x9b\xd5\x4a\x54\x82\x49\x8a\xff\x56\x5c\x06\xaf\xee\x8c\x95\x02\xd7\xd7\xdd\x37\x8d\xe3\x7b\xd2\x13\x65\xb8\x9d\xdd\xdc\x78\xc8\xd5\xda\x8f\x3a\xbf\x7a\xeb\x46\xf9\xa3\xe5\x2b\x75\x9b\x73\x35\x2a\x90\xc7\x33\xd7\xf2\xed\x33\xc4\xf4\x05\x7d\xc7\x80\x2d\x48\x7a\x47\x60\xa2\x89\x5d\xfa\xff\x19\x0f\x9d\x7f\x20\x30\x21\xd4\x74\x49\x58\x7e\x5e\xc6\x6d\x90\x8a\x19\xf3\x50\x8e\xc1\x43\x39\xe4\x51\x67\x7b\x5b\x62\x17\xfb\x3b\x8d\x68\x8c\x70\xdb\x77\xff\xf9\xfc\xde\xdf\x0d\x2f\xe9\x56\x0b\x6b\x12\xb6\x4a\xa1\x64\x72\x16\x8a\xde\x9b\xbf\x41\x8e\x9a\x8c\xaf\xc8\xc9\x89\x49\xe9\x38\xe5\x14\x6f\x5a\x2c\x6b\x6a\xba\x47\x32\xf7\x0b\xe6\x3f\x97\xcb\x26\xb1\x3c\x42\x2a\x8f\x67\x39\x63\x96\x89\x86\xe2\x0d\x0c\xaf\xdc\xd3\xc5\xfb\xec\xba\x43\x55\xb8\x4d\xbc\x90\xd6\xc3\xae\x81\xa0\xb8\x61\xa8\xd2\x54\x31\x4d\x48\xd5\x54\x0a\xc5\xd2\x38\x21\x6d\xcd\x63\x51\xfe\x55\xb0\x73\x6c\x66\xf5\xe8\xf4\xcb\xd6\x87\x41\x9c\x49\x90\x75\x9f\x8a\xda\x46\xeb\xe2\x7d\x38\xb1\x3f\x70\x5f\x87\x3f\x5b\xb1\x3f\x08\x5f\xac\xcd\xf7\xc5\xa3\x10\x4a\xa6\x2f\xe3\xd5\xae\xd7\xbf\xf8\xa2\x7f\x02\x00\x00\xff\xff\x0b\x2a\xd2\x84\x77\x0e\x00\x00") +var _bootstrapKubeadmInternalCloudinitKubeadmBootstrapScriptSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\xed\x6e\xdb\x3a\x12\xfd\xaf\xa7\x38\x91\x8d\x6d\xd2\x44\xfe\x2a\xba\x28\x12\x78\x77\xbd\x69\x8b\x6b\xb4\x37\x29\xe2\xb4\x45\x51\x14\x01\x2d\x8d\x24\xde\x50\xa4\x4a\x52\x75\x8c\x34\xef\x7e\x41\x4a\x76\xec\x38\x1f\x4d\x7a\xfd\xcb\x20\x67\xce\x9c\x99\x39\x9c\x51\x6b\xab\x3b\xe5\xb2\x3b\x65\x26\x0f\x5a\x38\x54\xe5\x5c\xf3\x2c\xb7\x18\xf4\x06\x3d\x9c\xe6\x84\x77\xd5\x94\xb4\x24\x4b\x06\xa3\xca\xe6\x4a\x9b\x4e\xd0\x0a\x5a\x78\xcf\x63\x92\x86\x12\x54\x32\x21\x0d\x9b\x13\x46\x25\x8b\x73\x5a\xdc\xec\xe1\x13\x69\xc3\x95\xc4\xa0\xd3\xc3\xb6\x33\x08\x9b\xab\x70\xe7\x20\x68\x61\xae\x2a\x14\x6c\x0e\xa9\x2c\x2a\x43\xb0\x39\x37\x48\xb9\x20\xd0\x45\x4c\xa5\x05\x97\x88\x55\x51\x0a\xce\x64\x4c\x98\x71\x9b\xfb\x30\x0d\x48\x27\x68\xe1\x4b\x03\xa1\xa6\x96\x71\x09\x86\x58\x95\x73\xa8\x74\xd5\x0e\xcc\x7a\xc2\xee\x97\x5b\x5b\xee\x77\xbb\xb3\xd9\xac\xc3\x3c\xd9\x8e\xd2\x59\x57\xd4\x86\xa6\xfb\x7e\x7c\xf8\xe6\x68\xf2\x26\x1a\x74\x7a\xde\xe5\xa3\x14\x64\x0c\x34\x7d\xaf\xb8\xa6\x04\xd3\x39\x58\x59\x0a\x1e\xb3\xa9\x20\x08\x36\x83\xd2\x60\x99\x26\x4a\x60\x95\xe3\x3b\xd3\xdc\x72\x99\xed\xc1\xa8\xd4\xce\x98\xa6\xa0\x85\x84\x1b\xab\xf9\xb4\xb2\x6b\xc5\x5a\xb0\xe3\x66\xcd\x40\x49\x30\x89\x70\x34\xc1\x78\x12\xe2\xff\xa3\xc9\x78\xb2\x17\xb4\xf0\x79\x7c\xfa\xc7\xf1\xc7\x53\x7c\x1e\x9d\x9c\x8c\x8e\x4e\xc7\x6f\x26\x38\x3e\xc1\xe1\xf1\xd1\xeb\xf1\xe9\xf8\xf8\x68\x82\xe3\xb7\x18\x1d\x7d\xc1\xbb\xf1\xd1\xeb\x3d\x10\xb7\x39\x69\xd0\x45\xa9\x1d\x7f\xa5\xc1\x5d\x19\x29\x71\x35\x9b\x10\xad\x11\x48\x55\x4d\xc8\x94\x14\xf3\x94\xc7\x10\x4c\x66\x15\xcb\x08\x99\xfa\x41\x5a\x72\x99\xa1\x24\x5d\x70\xe3\x9a\x69\xc0\x64\x12\xb4\x20\x78\xc1\x2d\xb3\xfe\x64\x23\xa9\x4e\x10\x1c\x7f\x70\xbc\x86\x61\xbb\x1f\x06\x4e\x2d\x2a\x73\x79\x91\xd6\xae\x62\x32\x01\x5d\x70\xeb\xd8\x8c\x74\x66\xf6\x7d\x77\xda\x7d\xfc\x49\xc6\xb8\xc0\x56\x41\xa8\xec\xba\xe3\xde\xad\x36\x1a\x78\x51\xd6\x38\xb1\x4a\xbc\xad\x26\x5b\x69\x19\x08\x95\xed\xef\xfb\x9b\x33\x87\xbe\xbd\x83\xcb\x00\x10\x2a\x66\x02\x45\x8d\x3c\x0c\xdb\x97\xfd\xab\x70\x79\xec\x10\xdc\xd9\xe0\x2a\x0c\xfc\xe1\x02\x01\x61\xfb\xb2\xf1\xf1\xe6\x3c\xc5\x57\x84\xed\x3a\xab\x10\xc3\x21\xc2\x58\x49\xab\x95\x28\x05\x93\x14\xe2\xdb\x81\x63\x2a\x03\xa7\x32\x0f\xc3\x65\xaa\x10\x9e\x50\xa1\x7e\xb8\x0a\x16\x54\x4c\x49\x23\xd5\xaa\x40\x2c\x2a\x63\x49\xc3\x58\x66\x2b\x13\x7a\x9f\xf3\x6a\x4a\x2c\x29\xa0\xc9\x90\x45\x94\xa2\x2a\x13\x66\x29\x6a\x6c\xa3\xda\x16\x3f\x7f\xc2\xea\x8a\x9a\x30\xd8\x8c\x43\x36\x4e\x9a\x60\x77\x00\x6b\x67\x4a\x91\x33\x8c\x1a\x56\xd7\xa8\x29\x0f\x6e\xf0\x37\x64\x9d\xa2\x17\x38\x0e\x74\x03\xf2\xda\x7f\xb5\x82\x0d\xf5\xce\x45\x74\xfe\xca\x74\xb8\x5a\xfa\x4d\x95\xb2\xc6\x6a\x56\xc2\xc4\x9a\x97\x16\xed\x9e\xd7\x83\x0b\xe3\x7b\xde\x24\xdb\xbe\x74\xfd\xf1\xf5\x77\xd7\xae\x27\xcd\xc1\x55\x50\x77\xdb\x54\x71\x4c\xc6\xac\xf7\x7b\x49\xfe\x51\x04\x52\x2e\xb9\xc9\x29\x59\x46\xeb\xb9\x28\x37\x94\x3b\xad\x2c\xce\x89\x4a\x64\x8a\xcb\xac\xb3\x22\xb9\xfb\xd5\x66\x79\x41\xc6\xb2\xa2\x1c\xb6\xb7\x5d\x5b\x11\x45\xdc\xa8\xe8\xd5\xbf\x7b\xfd\xa1\xa1\x58\xc9\xc4\xec\xb8\xb8\x71\xae\x10\x6e\x6d\x6d\xe1\x6b\xfb\x72\xe9\x73\xf5\x0d\x1e\x07\xff\xf9\xd7\x20\x00\x4c\xce\x53\xeb\x5a\xa5\xf4\x22\xd0\x01\x12\xe5\x9b\x5d\x03\xb8\x7f\x2b\xf2\x6d\xfc\x12\x25\xa9\x4e\xe9\x83\xe6\xd2\x82\x2d\xca\x2c\xb8\xa4\x0e\xf0\x56\xe9\x82\x59\x5b\x8f\x32\x93\xab\x19\xaa\x12\x7e\xa8\x1a\xab\x89\x15\x6e\xac\xaa\xca\x96\x95\x6d\xf2\x76\x45\x6e\xd2\x7e\x54\x7e\xbb\xbb\xbb\xb7\xe6\xf7\x94\xdc\x56\xf2\x8a\x73\x8a\xcf\xcf\x9a\x16\x9f\xc5\xaa\x28\x98\x4c\xd6\xda\xd2\x9c\xdd\x37\x04\x80\x98\x19\x5a\x28\x0f\xdc\x3d\xe8\xb0\x17\xee\xdc\x7c\xd7\xd7\x4f\xa0\x54\xda\xd5\xac\x51\x62\x5a\x09\xd0\x05\xc5\x95\x9b\x8c\x3e\x0d\x07\xe5\xc3\x5e\xd5\xef\xf1\xe0\xc0\x41\xf6\x57\x21\x9b\xf7\xb2\x81\x99\x32\x2e\x28\x01\x8b\x1d\xd8\xb6\xd9\xb9\x07\x6f\xf0\x2b\x78\xa5\xa6\x54\xf8\xed\xee\x6b\xd5\x68\x3a\xa9\xb4\x7b\x78\xb7\xe3\xbe\xd8\xc0\x3d\xab\x9f\xe2\x06\xf8\x0f\x26\x78\xe2\x17\x42\x83\x7b\x27\xd9\xe7\xbf\x40\xb5\x92\xe7\x52\xcd\x16\x50\x8b\x76\xdc\x09\x49\x86\xc5\x4e\x03\x69\x25\x7d\xb1\xdc\x4a\xd0\xf3\x68\x5d\x04\x72\xd8\x5b\xf6\x7c\x21\x93\x66\x75\x00\x95\xb4\x5c\xe0\x2b\xda\x12\x51\x46\x78\xe9\x06\x7a\x23\xbc\x95\xb6\xeb\x4a\xfa\x7d\xf8\xac\xfd\xfc\x59\x1d\xbe\x05\x93\x93\x10\x75\x41\x13\x6e\xdc\x97\xc1\x70\x72\xd8\xef\xbd\x7a\xe1\xef\xc3\xf6\xff\x42\x44\x51\xac\x64\xca\x33\x74\x6d\x51\x76\x9b\xd8\xd1\x5f\x8a\xcb\xe6\xa2\x33\x67\x85\xc0\xe5\x65\xe7\x5d\x7d\xf7\x89\xf4\x54\x19\x6e\xe7\x57\x57\xab\x43\xbc\xa1\x3b\x6c\xff\xd7\x9f\xde\xaa\x78\x84\x9e\x9c\x1b\x96\xeb\x5e\x4d\xbd\xfc\x26\xdb\xb8\x43\x44\xdf\xd1\x5b\xdb\x62\xc0\x54\x13\x3b\xf7\xff\xfd\x5a\x70\xc9\x7e\x26\x30\x21\xd4\x6c\x45\x4b\xbe\x45\xc6\x0d\x8d\x92\x19\xf3\x50\x8c\xc1\x43\x31\xe4\xb0\xbd\xbd\x2d\xb1\x8b\xfe\x4e\xad\x13\x23\xdc\xc0\xed\xbf\x5c\x3c\xf5\xbb\xe1\x25\xdd\x48\x61\x43\xb5\x56\x29\x14\x4c\xce\x1b\xd2\x7b\x8b\xb5\x13\xd6\xab\x6f\x55\x41\x4e\x3f\x4a\x47\x09\xa7\xe8\xb6\x59\xb2\x21\xa0\x7b\x54\x72\xbf\x46\xfe\x09\x85\xdc\xa6\x8f\x27\xa8\xe3\xe9\x85\x4d\x99\x65\xa2\xae\xea\x2d\x45\x5d\x7b\x8d\xcb\x2d\xec\xb2\x43\x99\xbb\x79\xbb\x54\x53\xf0\x88\x0f\xad\x07\x51\x1b\xc7\xc8\x7b\x46\xa5\xa6\x92\x69\x42\xa2\x66\x52\x28\x96\x44\x31\x69\x6b\x9e\x8e\xf3\x9b\xee\xce\xb0\x6e\xed\x6f\x50\x58\x3d\x0d\x52\xfe\x70\xa1\xdd\x91\x20\xeb\x3e\x27\xf5\xa3\x8a\xbd\xf9\x1c\x1e\xa6\xe9\x2f\xdc\x77\xe6\xe3\x33\xf4\x17\xcd\x27\x70\xfd\x99\xf2\x44\x8c\x82\xe9\xf3\x68\xa3\x4e\x9b\x5f\x8f\xc1\xdf\x01\x00\x00\xff\xff\xc6\x83\x7a\x27\x09\x0f\x00\x00") func bootstrapKubeadmInternalCloudinitKubeadmBootstrapScriptShBytes() ([]byte, error) { return bindataRead( @@ -108,7 +108,7 @@ func bootstrapKubeadmInternalCloudinitKubeadmBootstrapScriptSh() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bootstrap/kubeadm/internal/cloudinit/kubeadm-bootstrap-script.sh", size: 3703, mode: os.FileMode(420), modTime: time.Unix(1, 0)} + info := bindataFileInfo{name: "bootstrap/kubeadm/internal/cloudinit/kubeadm-bootstrap-script.sh", size: 3849, mode: os.FileMode(420), modTime: time.Unix(1, 0)} a := &asset{bytes: bytes, info: info} return a, nil }