Skip to content

Commit

Permalink
WIP: overlay node image before bootstrapping if necessary
Browse files Browse the repository at this point in the history
As per openshift/enhancements#1637, we're trying
to get rid of all OpenShift-versioned components from the bootimages.

This means that there will no longer be oc, kubelet, or crio
binaries for example, which bootstrapping obviously relies on.

To adapt to this, the OpenShift installer now ships a new
`node-image-overlay.service` in its bootstrap Ignition config. This
service takes care of pulling down the node image and overlaying it,
effectively updating the system to the node image version.

Here, we accordingly also adapt assisted-installer so that we run
`node-image-overlay.service` before starting e.g. `kubelet.service` and
`bootkube.service`.

See also: openshift/installer#8742
  • Loading branch information
jlebon committed Sep 6, 2024
1 parent c1e4fb7 commit 23f9c3f
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/installer/installer.go
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,18 @@ func (i *installer) startBootstrap() error {
return err
}

// If we're in a pure RHEL/CentOS environment, we need to overlay the node image
// first to have access to e.g. oc, kubelet, cri-o, etc...
// https://github.com/openshift/enhancements/pull/1637
if !i.ops.FileExists("/usr/bin/oc") {
err = i.ops.SystemctlAction("start", "node-image-overlay.service")
if err != nil {
return err
}

i.waitForNodeImageOverlay(context.Background())
}

servicesToStart := []string{"bootkube.service", "approve-csr.service", "progress.service"}
for _, service := range servicesToStart {
err = i.ops.SystemctlAction("start", service)
Expand Down Expand Up @@ -626,6 +638,25 @@ func (i *installer) waitForBootkube(ctx context.Context) {
}
}

func (i *installer) waitForNodeImageOverlay(ctx context.Context) {
i.log.Infof("Waiting for node image overlay to complete")

for {
select {
case <-ctx.Done():
i.log.Info("Context cancelled, terminating wait for node image overlay\n")
return
case <-time.After(generalWaitInterval):
out, err := i.ops.ExecPrivilegeCommand(nil, "systemctl", "is-active", "node-image-overlay.service")
if err == nil {
i.log.Info("node image overlay service completed")
return
}
i.log.Debugf("node image overlay service not yet active: %s", out)
}
}
}

func (i *installer) waitForController(kc k8s_client.K8SClient) error {
i.log.Infof("Waiting for controller to be ready")
i.UpdateHostInstallProgress(models.HostStageWaitingForController, "waiting for controller pod ready event")
Expand Down

0 comments on commit 23f9c3f

Please sign in to comment.