mirror of https://github.com/kubernetes/kops.git
				
				
				
			Merge pull request #16954 from justinsb/refactor_file_assets
refactor: build assets for kubernetes and nodeup explicitly
This commit is contained in:
		
						commit
						59e06d8a96
					
				|  | @ -35,10 +35,8 @@ import ( | |||
| 	"k8s.io/kops/pkg/model" | ||||
| 	"k8s.io/kops/pkg/model/resources" | ||||
| 	"k8s.io/kops/pkg/nodemodel" | ||||
| 	"k8s.io/kops/pkg/nodemodel/wellknownassets" | ||||
| 	"k8s.io/kops/pkg/wellknownservices" | ||||
| 	"k8s.io/kops/upup/pkg/fi" | ||||
| 	"k8s.io/kops/util/pkg/architectures" | ||||
| 	"k8s.io/kops/util/pkg/vfs" | ||||
| 	"k8s.io/utils/pointer" | ||||
| 	ctrl "sigs.k8s.io/controller-runtime" | ||||
|  | @ -211,17 +209,12 @@ func (r *KopsConfigReconciler) buildBootstrapData(ctx context.Context) ([]byte, | |||
| 	// 	encryptionConfigSecretHash = base64.URLEncoding.EncodeToString(hashBytes[:])
 | ||||
| 	// }
 | ||||
| 
 | ||||
| 	nodeUpAssets := make(map[architectures.Architecture]*assets.MirroredAsset) | ||||
| 	for _, arch := range architectures.GetSupported() { | ||||
| 		asset, err := wellknownassets.NodeUpAsset(assetBuilder, arch) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		nodeUpAssets[arch] = asset | ||||
| 	nodeUpAssets, err := nodemodel.BuildNodeUpAssets(ctx, assetBuilder) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	assets := make(map[architectures.Architecture][]*assets.MirroredAsset) | ||||
| 	configBuilder, err := nodemodel.NewNodeUpConfigBuilder(cluster, assetBuilder, assets, encryptionConfigSecretHash) | ||||
| 	configBuilder, err := nodemodel.NewNodeUpConfigBuilder(cluster, assetBuilder, encryptionConfigSecretHash) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | @ -267,7 +260,7 @@ func (r *KopsConfigReconciler) buildBootstrapData(ctx context.Context) ([]byte, | |||
| 	// b.nodeupConfig.Resource = fi.NewBytesResource(configData)
 | ||||
| 
 | ||||
| 	var nodeupScript resources.NodeUpScript | ||||
| 	nodeupScript.NodeUpAssets = nodeUpAssets | ||||
| 	nodeupScript.NodeUpAssets = nodeUpAssets.NodeUpAssets | ||||
| 	nodeupScript.BootConfig = bootConfig | ||||
| 
 | ||||
| 	{ | ||||
|  |  | |||
|  | @ -752,14 +752,13 @@ func (b *ConfigBuilder) GetBootstrapData(ctx context.Context) (*BootstrapData, e | |||
| 	// 	}
 | ||||
| 	// 	hashBytes := sha256.Sum256(secret.Data)
 | ||||
| 	// 	encryptionConfigSecretHash = base64.URLEncoding.EncodeToString(hashBytes[:])
 | ||||
| 	// }
 | ||||
| 
 | ||||
| 	fileAssets := &nodemodel.FileAssets{Cluster: cluster} | ||||
| 	if err := fileAssets.AddFileAssets(assetBuilder); err != nil { | ||||
| 	nodeUpAssets, err := nodemodel.BuildNodeUpAssets(ctx, assetBuilder) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	configBuilder, err := nodemodel.NewNodeUpConfigBuilder(cluster, assetBuilder, fileAssets.Assets, encryptionConfigSecretHash) | ||||
| 	configBuilder, err := nodemodel.NewNodeUpConfigBuilder(cluster, assetBuilder, encryptionConfigSecretHash) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | @ -791,7 +790,7 @@ func (b *ConfigBuilder) GetBootstrapData(ctx context.Context) (*BootstrapData, e | |||
| 	} | ||||
| 
 | ||||
| 	var nodeupScript resources.NodeUpScript | ||||
| 	nodeupScript.NodeUpAssets = fileAssets.NodeUpAssets | ||||
| 	nodeupScript.NodeUpAssets = nodeUpAssets.NodeUpAssets | ||||
| 	nodeupScript.BootConfig = bootConfig | ||||
| 
 | ||||
| 	nodeupScript.WithEnvironmentVariables(cluster, ig) | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ limitations under the License. | |||
| package nodemodel | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"path" | ||||
|  | @ -32,70 +33,62 @@ import ( | |||
| 	"k8s.io/kops/util/pkg/hashing" | ||||
| ) | ||||
| 
 | ||||
| type FileAssets struct { | ||||
| 	// Assets is a list of sources for files (primarily when not using everything containerized)
 | ||||
| 	// Formats:
 | ||||
| 	//  raw url: http://... or https://...
 | ||||
| 	//  url with hash: <hex>@http://... or <hex>@https://...
 | ||||
| 	Assets map[architectures.Architecture][]*assets.MirroredAsset | ||||
| 
 | ||||
| 	// NodeUpAssets are the assets for downloading nodeup
 | ||||
| 	NodeUpAssets map[architectures.Architecture]*assets.MirroredAsset | ||||
| 
 | ||||
| 	Cluster *kops.Cluster | ||||
| // KubernetesFileAssets are the assets for downloading Kubernetes binaries
 | ||||
| type KubernetesFileAssets struct { | ||||
| 	// KubernetesFileAssets are the assets for downloading Kubernetes binaries
 | ||||
| 	KubernetesFileAssets map[architectures.Architecture][]*assets.MirroredAsset | ||||
| } | ||||
| 
 | ||||
| // AddFileAssets adds the file assets within the assetBuilder
 | ||||
| func (c *FileAssets) AddFileAssets(assetBuilder *assets.AssetBuilder) error { | ||||
| // BuildKubernetesFileAssets returns the Kubernetes file assets for the given cluster
 | ||||
| func BuildKubernetesFileAssets(cluster *kops.Cluster, assetBuilder *assets.AssetBuilder) (*KubernetesFileAssets, error) { | ||||
| 	var baseURL string | ||||
| 	if components.IsBaseURL(c.Cluster.Spec.KubernetesVersion) { | ||||
| 		baseURL = c.Cluster.Spec.KubernetesVersion | ||||
| 	if components.IsBaseURL(cluster.Spec.KubernetesVersion) { | ||||
| 		baseURL = cluster.Spec.KubernetesVersion | ||||
| 	} else { | ||||
| 		baseURL = "https://dl.k8s.io/release/v" + c.Cluster.Spec.KubernetesVersion | ||||
| 		baseURL = "https://dl.k8s.io/release/v" + cluster.Spec.KubernetesVersion | ||||
| 	} | ||||
| 
 | ||||
| 	c.Assets = make(map[architectures.Architecture][]*assets.MirroredAsset) | ||||
| 	c.NodeUpAssets = make(map[architectures.Architecture]*assets.MirroredAsset) | ||||
| 	kubernetesAssets := make(map[architectures.Architecture][]*assets.MirroredAsset) | ||||
| 	for _, arch := range architectures.GetSupported() { | ||||
| 		c.Assets[arch] = []*assets.MirroredAsset{} | ||||
| 		kubernetesAssets[arch] = []*assets.MirroredAsset{} | ||||
| 
 | ||||
| 		k8sAssetsNames := []string{ | ||||
| 			fmt.Sprintf("/bin/linux/%s/kubelet", arch), | ||||
| 			fmt.Sprintf("/bin/linux/%s/kubectl", arch), | ||||
| 		} | ||||
| 
 | ||||
| 		if needsMounterAsset(c.Cluster) { | ||||
| 		if needsMounterAsset(cluster) { | ||||
| 			k8sAssetsNames = append(k8sAssetsNames, fmt.Sprintf("/bin/linux/%s/mounter", arch)) | ||||
| 		} | ||||
| 
 | ||||
| 		for _, an := range k8sAssetsNames { | ||||
| 			k, err := url.Parse(baseURL) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			k.Path = path.Join(k.Path, an) | ||||
| 
 | ||||
| 			asset, err := assetBuilder.RemapFile(k, nil) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			c.Assets[arch] = append(c.Assets[arch], assets.BuildMirroredAsset(asset)) | ||||
| 			kubernetesAssets[arch] = append(kubernetesAssets[arch], assets.BuildMirroredAsset(asset)) | ||||
| 		} | ||||
| 
 | ||||
| 		kubernetesVersion, _ := util.ParseKubernetesVersion(c.Cluster.Spec.KubernetesVersion) | ||||
| 		kubernetesVersion, _ := util.ParseKubernetesVersion(cluster.Spec.KubernetesVersion) | ||||
| 
 | ||||
| 		cloudProvider := c.Cluster.GetCloudProvider() | ||||
| 		cloudProvider := cluster.GetCloudProvider() | ||||
| 		if ok := model.UseExternalKubeletCredentialProvider(*kubernetesVersion, cloudProvider); ok { | ||||
| 			switch cloudProvider { | ||||
| 			case kops.CloudProviderGCE: | ||||
| 				binaryLocation := c.Cluster.Spec.CloudProvider.GCE.BinariesLocation | ||||
| 				binaryLocation := cluster.Spec.CloudProvider.GCE.BinariesLocation | ||||
| 				if binaryLocation == nil { | ||||
| 					binaryLocation = fi.PtrTo("https://storage.googleapis.com/k8s-staging-cloud-provider-gcp/auth-provider-gcp") | ||||
| 				} | ||||
| 				// VALID FOR 60 DAYS WE REALLY NEED TO MERGE https://github.com/kubernetes/cloud-provider-gcp/pull/601 and CUT A RELEASE
 | ||||
| 				k, err := url.Parse(fmt.Sprintf("%s/linux-%s/v20231005-providersv0.27.1-65-g8fbe8d27", *binaryLocation, arch)) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 					return nil, err | ||||
| 				} | ||||
| 
 | ||||
| 				// TODO: Move these hashes to assetdata
 | ||||
|  | @ -105,81 +98,98 @@ func (c *FileAssets) AddFileAssets(assetBuilder *assets.AssetBuilder) error { | |||
| 				} | ||||
| 				hash, err := hashing.FromString(hashes[arch]) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("unable to parse auth-provider-gcp binary asset hash %q: %v", hashes[arch], err) | ||||
| 					return nil, fmt.Errorf("unable to parse auth-provider-gcp binary asset hash %q: %v", hashes[arch], err) | ||||
| 				} | ||||
| 				asset, err := assetBuilder.RemapFile(k, hash) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 					return nil, err | ||||
| 				} | ||||
| 
 | ||||
| 				c.Assets[arch] = append(c.Assets[arch], assets.BuildMirroredAsset(asset)) | ||||
| 				kubernetesAssets[arch] = append(kubernetesAssets[arch], assets.BuildMirroredAsset(asset)) | ||||
| 			case kops.CloudProviderAWS: | ||||
| 				binaryLocation := c.Cluster.Spec.CloudProvider.AWS.BinariesLocation | ||||
| 				binaryLocation := cluster.Spec.CloudProvider.AWS.BinariesLocation | ||||
| 				if binaryLocation == nil { | ||||
| 					binaryLocation = fi.PtrTo("https://artifacts.k8s.io/binaries/cloud-provider-aws/v1.27.1") | ||||
| 				} | ||||
| 
 | ||||
| 				u, err := url.Parse(fmt.Sprintf("%s/linux/%s/ecr-credential-provider-linux-%s", *binaryLocation, arch, arch)) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 					return nil, err | ||||
| 				} | ||||
| 				asset, err := assetBuilder.RemapFile(u, nil) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 					return nil, err | ||||
| 				} | ||||
| 				c.Assets[arch] = append(c.Assets[arch], assets.BuildMirroredAsset(asset)) | ||||
| 				kubernetesAssets[arch] = append(kubernetesAssets[arch], assets.BuildMirroredAsset(asset)) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		{ | ||||
| 			cniAsset, err := wellknownassets.FindCNIAssets(c.Cluster, assetBuilder, arch) | ||||
| 			cniAsset, err := wellknownassets.FindCNIAssets(cluster, assetBuilder, arch) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			c.Assets[arch] = append(c.Assets[arch], assets.BuildMirroredAsset(cniAsset)) | ||||
| 			kubernetesAssets[arch] = append(kubernetesAssets[arch], assets.BuildMirroredAsset(cniAsset)) | ||||
| 		} | ||||
| 
 | ||||
| 		if c.Cluster.Spec.Containerd == nil || !c.Cluster.Spec.Containerd.SkipInstall { | ||||
| 			containerdAsset, err := wellknownassets.FindContainerdAsset(c.Cluster, assetBuilder, arch) | ||||
| 		if cluster.Spec.Containerd == nil || !cluster.Spec.Containerd.SkipInstall { | ||||
| 			containerdAsset, err := wellknownassets.FindContainerdAsset(cluster, assetBuilder, arch) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			if containerdAsset != nil { | ||||
| 				c.Assets[arch] = append(c.Assets[arch], assets.BuildMirroredAsset(containerdAsset)) | ||||
| 				kubernetesAssets[arch] = append(kubernetesAssets[arch], assets.BuildMirroredAsset(containerdAsset)) | ||||
| 			} | ||||
| 
 | ||||
| 			runcAsset, err := wellknownassets.FindRuncAsset(c.Cluster, assetBuilder, arch) | ||||
| 			runcAsset, err := wellknownassets.FindRuncAsset(cluster, assetBuilder, arch) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			if runcAsset != nil { | ||||
| 				c.Assets[arch] = append(c.Assets[arch], assets.BuildMirroredAsset(runcAsset)) | ||||
| 				kubernetesAssets[arch] = append(kubernetesAssets[arch], assets.BuildMirroredAsset(runcAsset)) | ||||
| 			} | ||||
| 			nerdctlAsset, err := wellknownassets.FindNerdctlAsset(c.Cluster, assetBuilder, arch) | ||||
| 			nerdctlAsset, err := wellknownassets.FindNerdctlAsset(cluster, assetBuilder, arch) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			if nerdctlAsset != nil { | ||||
| 				c.Assets[arch] = append(c.Assets[arch], assets.BuildMirroredAsset(nerdctlAsset)) | ||||
| 				kubernetesAssets[arch] = append(kubernetesAssets[arch], assets.BuildMirroredAsset(nerdctlAsset)) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		crictlAsset, err := wellknownassets.FindCrictlAsset(c.Cluster, assetBuilder, arch) | ||||
| 		crictlAsset, err := wellknownassets.FindCrictlAsset(cluster, assetBuilder, arch) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		if crictlAsset != nil { | ||||
| 			c.Assets[arch] = append(c.Assets[arch], assets.BuildMirroredAsset(crictlAsset)) | ||||
| 			kubernetesAssets[arch] = append(kubernetesAssets[arch], assets.BuildMirroredAsset(crictlAsset)) | ||||
| 		} | ||||
| 
 | ||||
| 		asset, err := wellknownassets.NodeUpAsset(assetBuilder, arch) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		c.NodeUpAssets[arch] = asset | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| 	return &KubernetesFileAssets{ | ||||
| 		KubernetesFileAssets: kubernetesAssets, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // NodeUpAssets are the assets for downloading nodeup
 | ||||
| type NodeUpAssets struct { | ||||
| 	// NodeUpAssets are the assets for downloading nodeup
 | ||||
| 	NodeUpAssets map[architectures.Architecture]*assets.MirroredAsset | ||||
| } | ||||
| 
 | ||||
| func BuildNodeUpAssets(ctx context.Context, assetBuilder *assets.AssetBuilder) (*NodeUpAssets, error) { | ||||
| 	nodeUpAssets := make(map[architectures.Architecture]*assets.MirroredAsset) | ||||
| 	for _, arch := range architectures.GetSupported() { | ||||
| 		asset, err := wellknownassets.NodeUpAsset(assetBuilder, arch) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		nodeUpAssets[arch] = asset | ||||
| 	} | ||||
| 	return &NodeUpAssets{ | ||||
| 		NodeUpAssets: nodeUpAssets, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // needsMounterAsset checks if we need the mounter program
 | ||||
|  |  | |||
|  | @ -42,12 +42,6 @@ import ( | |||
| ) | ||||
| 
 | ||||
| type nodeUpConfigBuilder struct { | ||||
| 	// Assets is a list of sources for files (primarily when not using everything containerized)
 | ||||
| 	// Formats:
 | ||||
| 	//  raw url: http://... or https://...
 | ||||
| 	//  url with hash: <hex>@http://... or <hex>@https://...
 | ||||
| 	assets map[architectures.Architecture][]*assets.MirroredAsset | ||||
| 
 | ||||
| 	assetBuilder               *assets.AssetBuilder | ||||
| 	channels                   []string | ||||
| 	configBase                 vfs.Path | ||||
|  | @ -59,7 +53,7 @@ type nodeUpConfigBuilder struct { | |||
| 	encryptionConfigSecretHash string | ||||
| } | ||||
| 
 | ||||
| func NewNodeUpConfigBuilder(cluster *kops.Cluster, assetBuilder *assets.AssetBuilder, nodeAssets map[architectures.Architecture][]*assets.MirroredAsset, encryptionConfigSecretHash string) (model.NodeUpConfigBuilder, error) { | ||||
| func NewNodeUpConfigBuilder(cluster *kops.Cluster, assetBuilder *assets.AssetBuilder, encryptionConfigSecretHash string) (model.NodeUpConfigBuilder, error) { | ||||
| 	configBase, err := vfs.Context.BuildVfsPath(cluster.Spec.ConfigStore.Base) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error parsing configStore.base %q: %v", cluster.Spec.ConfigStore.Base, err) | ||||
|  | @ -194,7 +188,6 @@ func NewNodeUpConfigBuilder(cluster *kops.Cluster, assetBuilder *assets.AssetBui | |||
| 
 | ||||
| 	configBuilder := nodeUpConfigBuilder{ | ||||
| 		assetBuilder:               assetBuilder, | ||||
| 		assets:                     nodeAssets, | ||||
| 		channels:                   channels, | ||||
| 		configBase:                 configBase, | ||||
| 		cluster:                    cluster, | ||||
|  | @ -227,10 +220,14 @@ func (n *nodeUpConfigBuilder) BuildConfig(ig *kops.InstanceGroup, wellKnownAddre | |||
| 
 | ||||
| 	config, bootConfig := nodeup.NewConfig(cluster, ig) | ||||
| 
 | ||||
| 	kubernetesAssets, err := BuildKubernetesFileAssets(cluster, n.assetBuilder) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	config.Assets = make(map[architectures.Architecture][]string) | ||||
| 	for _, arch := range architectures.GetSupported() { | ||||
| 		config.Assets[arch] = []string{} | ||||
| 		for _, a := range n.assets[arch] { | ||||
| 		for _, a := range kubernetesAssets.KubernetesFileAssets[arch] { | ||||
| 			config.Assets[arch] = append(config.Assets[arch], a.CompactString()) | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -385,11 +385,6 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) (*ApplyResults, error) { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	fileAssets := &nodemodel.FileAssets{Cluster: cluster} | ||||
| 	if err := fileAssets.AddFileAssets(assetBuilder); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	project := "" | ||||
| 	scwZone := "" | ||||
| 
 | ||||
|  | @ -513,7 +508,11 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) (*ApplyResults, error) { | |||
| 		cloud:            cloud, | ||||
| 	} | ||||
| 
 | ||||
| 	configBuilder, err := nodemodel.NewNodeUpConfigBuilder(cluster, assetBuilder, fileAssets.Assets, encryptionConfigSecretHash) | ||||
| 	nodeUpAssets, err := nodemodel.BuildNodeUpAssets(ctx, assetBuilder) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	configBuilder, err := nodemodel.NewNodeUpConfigBuilder(cluster, assetBuilder, encryptionConfigSecretHash) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | @ -521,7 +520,7 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) (*ApplyResults, error) { | |||
| 		KopsModelContext:    modelContext, | ||||
| 		Lifecycle:           clusterLifecycle, | ||||
| 		NodeUpConfigBuilder: configBuilder, | ||||
| 		NodeUpAssets:        fileAssets.NodeUpAssets, | ||||
| 		NodeUpAssets:        nodeUpAssets.NodeUpAssets, | ||||
| 	} | ||||
| 
 | ||||
| 	{ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue