From 0b095068f3b2859b32ef9d2b5a1c28e487eb9ef2 Mon Sep 17 00:00:00 2001 From: Ciprian Hacman Date: Tue, 3 May 2022 06:37:54 +0300 Subject: [PATCH] Add support for installing additional packages --- k8s/crds/kops.k8s.io_instancegroups.yaml | 5 +++++ nodeup/pkg/model/packages.go | 8 ++++++++ pkg/apis/kops/instancegroup.go | 2 ++ pkg/apis/kops/v1alpha2/instancegroup.go | 2 ++ pkg/apis/kops/v1alpha2/zz_generated.conversion.go | 2 ++ pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go | 5 +++++ pkg/apis/kops/v1alpha3/instancegroup.go | 2 ++ pkg/apis/kops/v1alpha3/zz_generated.conversion.go | 2 ++ pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go | 5 +++++ pkg/apis/kops/zz_generated.deepcopy.go | 5 +++++ pkg/apis/nodeup/config.go | 2 ++ upup/pkg/fi/cloudup/apply_cluster.go | 4 ++++ 12 files changed, 44 insertions(+) diff --git a/k8s/crds/kops.k8s.io_instancegroups.yaml b/k8s/crds/kops.k8s.io_instancegroups.yaml index 93a74a1a46..294d991973 100644 --- a/k8s/crds/kops.k8s.io_instancegroups.yaml +++ b/k8s/crds/kops.k8s.io_instancegroups.yaml @@ -834,6 +834,11 @@ spec: description: NodeLabels indicates the kubernetes labels for nodes in this instance group type: object + packages: + description: Packages specifies additional packages to be installed. + items: + type: string + type: array role: description: 'Type determines the role of instances in this instance group: masters or nodes' diff --git a/nodeup/pkg/model/packages.go b/nodeup/pkg/model/packages.go index a6f086e39b..7e6fa27d54 100644 --- a/nodeup/pkg/model/packages.go +++ b/nodeup/pkg/model/packages.go @@ -52,6 +52,10 @@ func (b *PackagesBuilder) Build(c *fi.ModelBuilderContext) error { c.AddTask(&nodetasks.Package{Name: "pigz"}) c.AddTask(&nodetasks.Package{Name: "socat"}) c.AddTask(&nodetasks.Package{Name: "util-linux"}) + // Additional packages + for _, additionalPackage := range b.NodeupConfig.Packages { + c.EnsureTask(&nodetasks.Package{Name: additionalPackage}) + } } else if b.Distribution.IsRHELFamily() { c.AddTask(&nodetasks.Package{Name: "nfs-utils"}) // From containerd: https://github.com/containerd/cri/blob/master/contrib/ansible/tasks/bootstrap_centos.yaml @@ -72,6 +76,10 @@ func (b *PackagesBuilder) Build(c *fi.ModelBuilderContext) error { c.AddTask(&nodetasks.Package{Name: "container-selinux"}) c.AddTask(&nodetasks.Package{Name: "pigz"}) } + // Additional packages + for _, additionalPackage := range b.NodeupConfig.Packages { + c.EnsureTask(&nodetasks.Package{Name: additionalPackage}) + } } else { // Hopefully they are already installed klog.Warningf("unknown distribution, skipping required packages install: %v", b.Distribution) diff --git a/pkg/apis/kops/instancegroup.go b/pkg/apis/kops/instancegroup.go index 08e6459e02..0625c69f3c 100644 --- a/pkg/apis/kops/instancegroup.go +++ b/pkg/apis/kops/instancegroup.go @@ -192,6 +192,8 @@ type InstanceGroupSpec struct { WarmPool *WarmPoolSpec `json:"warmPool,omitempty"` // Containerd specifies override configuration for instance group Containerd *ContainerdConfig `json:"containerd,omitempty"` + // Packages specifies additional packages to be installed. + Packages []string `json:"packages,omitempty"` } const ( diff --git a/pkg/apis/kops/v1alpha2/instancegroup.go b/pkg/apis/kops/v1alpha2/instancegroup.go index 0e45fc2473..d8d781dd3e 100644 --- a/pkg/apis/kops/v1alpha2/instancegroup.go +++ b/pkg/apis/kops/v1alpha2/instancegroup.go @@ -158,6 +158,8 @@ type InstanceGroupSpec struct { WarmPool *WarmPoolSpec `json:"warmPool,omitempty"` // Containerd specifies override configuration for instance group Containerd *ContainerdConfig `json:"containerd,omitempty"` + // Packages specifies additional packages to be installed. + Packages []string `json:"packages,omitempty"` } // InstanceMetadataOptions defines the EC2 instance metadata service options (AWS Only) diff --git a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go index 87bbc4f2dd..ab7c7f10a6 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go @@ -4413,6 +4413,7 @@ func autoConvert_v1alpha2_InstanceGroupSpec_To_kops_InstanceGroupSpec(in *Instan } else { out.Containerd = nil } + out.Packages = in.Packages return nil } @@ -4584,6 +4585,7 @@ func autoConvert_kops_InstanceGroupSpec_To_v1alpha2_InstanceGroupSpec(in *kops.I } else { out.Containerd = nil } + out.Packages = in.Packages return nil } diff --git a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go index 79b4c9dd80..4427de22d7 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go @@ -2491,6 +2491,11 @@ func (in *InstanceGroupSpec) DeepCopyInto(out *InstanceGroupSpec) { *out = new(ContainerdConfig) (*in).DeepCopyInto(*out) } + if in.Packages != nil { + in, out := &in.Packages, &out.Packages + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/pkg/apis/kops/v1alpha3/instancegroup.go b/pkg/apis/kops/v1alpha3/instancegroup.go index f3fcb304d9..c6cbcc0072 100644 --- a/pkg/apis/kops/v1alpha3/instancegroup.go +++ b/pkg/apis/kops/v1alpha3/instancegroup.go @@ -155,6 +155,8 @@ type InstanceGroupSpec struct { WarmPool *WarmPoolSpec `json:"warmPool,omitempty"` // Containerd specifies override configuration for instance group Containerd *ContainerdConfig `json:"containerd,omitempty"` + // Packages specifies additional packages to be installed. + Packages []string `json:"packages,omitempty"` } // InstanceMetadataOptions defines the EC2 instance metadata service options (AWS Only) diff --git a/pkg/apis/kops/v1alpha3/zz_generated.conversion.go b/pkg/apis/kops/v1alpha3/zz_generated.conversion.go index b58a67123c..768b13ddd8 100644 --- a/pkg/apis/kops/v1alpha3/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha3/zz_generated.conversion.go @@ -4506,6 +4506,7 @@ func autoConvert_v1alpha3_InstanceGroupSpec_To_kops_InstanceGroupSpec(in *Instan } else { out.Containerd = nil } + out.Packages = in.Packages return nil } @@ -4677,6 +4678,7 @@ func autoConvert_kops_InstanceGroupSpec_To_v1alpha3_InstanceGroupSpec(in *kops.I } else { out.Containerd = nil } + out.Packages = in.Packages return nil } diff --git a/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go index d88b3493b0..ef8d7a7cbb 100644 --- a/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go @@ -2476,6 +2476,11 @@ func (in *InstanceGroupSpec) DeepCopyInto(out *InstanceGroupSpec) { *out = new(ContainerdConfig) (*in).DeepCopyInto(*out) } + if in.Packages != nil { + in, out := &in.Packages, &out.Packages + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/pkg/apis/kops/zz_generated.deepcopy.go b/pkg/apis/kops/zz_generated.deepcopy.go index 5b884a9c78..f26b52908a 100644 --- a/pkg/apis/kops/zz_generated.deepcopy.go +++ b/pkg/apis/kops/zz_generated.deepcopy.go @@ -2639,6 +2639,11 @@ func (in *InstanceGroupSpec) DeepCopyInto(out *InstanceGroupSpec) { *out = new(ContainerdConfig) (*in).DeepCopyInto(*out) } + if in.Packages != nil { + in, out := &in.Packages, &out.Packages + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/pkg/apis/nodeup/config.go b/pkg/apis/nodeup/config.go index eb31200472..cbdc80f313 100644 --- a/pkg/apis/nodeup/config.go +++ b/pkg/apis/nodeup/config.go @@ -41,6 +41,8 @@ type Config struct { ApiserverAdditionalIPs []string `json:",omitempty"` // WarmPoolImages are the container images to pre-pull during instance pre-initialization WarmPoolImages []string `json:"warmPoolImages,omitempty"` + // Packages specifies additional packages to be installed. + Packages []string `json:"packages,omitempty"` // Manifests for running etcd EtcdManifests []string `json:"etcdManifests,omitempty"` diff --git a/upup/pkg/fi/cloudup/apply_cluster.go b/upup/pkg/fi/cloudup/apply_cluster.go index e04ed9b8b8..bb325497a7 100644 --- a/upup/pkg/fi/cloudup/apply_cluster.go +++ b/upup/pkg/fi/cloudup/apply_cluster.go @@ -1410,6 +1410,10 @@ func (n *nodeUpConfigBuilder) BuildConfig(ig *kops.InstanceGroup, apiserverAddit config.WarmPoolImages = n.buildWarmPoolImages(ig) } + if ig.Spec.Packages != nil { + config.Packages = ig.Spec.Packages + } + return config, bootConfig, nil }