Andrew Rynhard 28782c2d46 fix: stop race condition between kubelet and networkd
The kubelet fails to start if a machine's hostname is not set. If
networkd doesn't set it in time, the kubelet service fails to start.
Addionally, this adds retries to container pulls to ensure that any
temporary network failures don't cause fatal errors if we can't pull
images.

Signed-off-by: Andrew Rynhard <andrew@andrewrynhard.com>
2020-01-20 10:52:53 -05:00

34 lines
885 B
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package image
import (
"context"
"fmt"
"time"
"github.com/talos-systems/talos/pkg/retry"
"github.com/containerd/containerd"
)
// Pull is a convenience function that wraps the containerd image pull func with
// retry functionality.
func Pull(ctx context.Context, client *containerd.Client, ref string) (img containerd.Image, err error) {
err = retry.Exponential(1*time.Minute, retry.WithUnits(1*time.Second)).Retry(func() error {
if img, err = client.Pull(ctx, ref, containerd.WithPullUnpack); err != nil {
return retry.ExpectedError(fmt.Errorf("failed to pull image %q: %w", ref, err))
}
return nil
})
if err != nil {
return nil, err
}
return img, nil
}