Skip to content

Commit 3da950f

Browse files
authored
Adds imageprovider package (#47)
1 parent caccff4 commit 3da950f

File tree

9 files changed

+137
-55
lines changed

9 files changed

+137
-55
lines changed

operator/pkg/awsprovider/launchtemplate/reconciler.go

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import (
1919
"encoding/base64"
2020
"fmt"
2121

22-
"github.com/aws/aws-sdk-go/aws"
2322
"github.com/aws/aws-sdk-go/service/ec2"
2423
"github.com/aws/aws-sdk-go/service/ssm"
24+
cpv1alpha1 "github.com/awslabs/kit/operator/pkg/apis/controlplane/v1alpha1"
2525
"github.com/awslabs/kit/operator/pkg/apis/dataplane/v1alpha1"
2626
"github.com/awslabs/kit/operator/pkg/awsprovider"
2727
"github.com/awslabs/kit/operator/pkg/awsprovider/securitygroup"
@@ -33,6 +33,7 @@ import (
3333
"github.com/awslabs/kit/operator/pkg/utils/secrets"
3434
"go.uber.org/zap"
3535
"k8s.io/apimachinery/pkg/types"
36+
"knative.dev/pkg/ptr"
3637
)
3738

3839
const (
@@ -57,7 +58,7 @@ func (c *Controller) Reconcile(ctx context.Context, dataplane *v1alpha1.DataPlan
5758
return fmt.Errorf("getting launch template, %w", err)
5859
}
5960
if !existingTemplateMatchesDesired(templates, dataplane.Spec.ClusterName) { // TODO check if existing LT is same as desired LT
60-
// if not present create launch template
61+
// create launch template
6162
if err := c.createLaunchTemplate(ctx, dataplane); err != nil {
6263
return fmt.Errorf("creating launch template, %w", err)
6364
}
@@ -68,8 +69,12 @@ func (c *Controller) Reconcile(ctx context.Context, dataplane *v1alpha1.DataPlan
6869
}
6970

7071
func (c *Controller) Finalize(ctx context.Context, dataplane *v1alpha1.DataPlane) error {
72+
return c.deleteLaunchTemplate(ctx, TemplateName(dataplane.Spec.ClusterName))
73+
}
74+
75+
func (c *Controller) deleteLaunchTemplate(ctx context.Context, templateName string) error {
7176
if _, err := c.ec2api.DeleteLaunchTemplateWithContext(ctx, &ec2.DeleteLaunchTemplateInput{
72-
LaunchTemplateName: aws.String(TemplateName(dataplane.Spec.ClusterName)),
77+
LaunchTemplateName: ptr.String(templateName),
7378
}); err != nil {
7479
if errors.IsLaunchTemplateDoNotExist(err) {
7580
return nil
@@ -96,35 +101,32 @@ func (c *Controller) createLaunchTemplate(ctx context.Context, dataplane *v1alph
96101
return fmt.Errorf("getting control plane ca certificate, %w", err)
97102
}
98103
_, clusterCA := secrets.Parse(caSecret)
99-
paramOutput, err := c.ssm.GetParameterWithContext(ctx, &ssm.GetParameterInput{
100-
Name: aws.String("/aws/service/eks/optimized-ami/1.20/amazon-linux-2/recommended/image_id"),
101-
})
104+
amiID, err := c.amiID(ctx, dataplane)
102105
if err != nil {
103-
return fmt.Errorf("getting ssm parameter, %w", err)
106+
return fmt.Errorf("getting ami id for worker nodes, %w", err)
104107
}
105-
amiID := *paramOutput.Parameter.Value
106108
input := &ec2.CreateLaunchTemplateInput{
107109
LaunchTemplateData: &ec2.RequestLaunchTemplateData{
108110
BlockDeviceMappings: []*ec2.LaunchTemplateBlockDeviceMappingRequest{{
109-
DeviceName: aws.String("/dev/xvda"),
111+
DeviceName: ptr.String("/dev/xvda"),
110112
Ebs: &ec2.LaunchTemplateEbsBlockDeviceRequest{
111-
DeleteOnTermination: aws.Bool(true),
112-
Iops: aws.Int64(3000),
113-
VolumeSize: aws.Int64(40),
114-
VolumeType: aws.String("gp3"),
113+
DeleteOnTermination: ptr.Bool(true),
114+
Iops: ptr.Int64(3000),
115+
VolumeSize: ptr.Int64(40),
116+
VolumeType: ptr.String("gp3"),
115117
}},
116118
},
117-
InstanceType: aws.String("t2.xlarge"), // TODO get this from dataplane spec
118-
ImageId: aws.String(amiID),
119+
InstanceType: ptr.String("t2.xlarge"), // TODO get this from dataplane spec
120+
ImageId: ptr.String(amiID),
119121
IamInstanceProfile: &ec2.LaunchTemplateIamInstanceProfileSpecificationRequest{
120-
Name: aws.String(fmt.Sprintf("KitNodeInstanceProfile-%s", dataplane.Spec.ClusterName)),
122+
Name: ptr.String(fmt.Sprintf("KitNodeInstanceProfile-%s", dataplane.Spec.ClusterName)),
121123
},
122-
Monitoring: &ec2.LaunchTemplatesMonitoringRequest{Enabled: aws.Bool(true)},
123-
SecurityGroupIds: []*string{aws.String(securityGroupID)},
124-
UserData: aws.String(base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(userData,
124+
Monitoring: &ec2.LaunchTemplatesMonitoringRequest{Enabled: ptr.Bool(true)},
125+
SecurityGroupIds: []*string{ptr.String(securityGroupID)},
126+
UserData: ptr.String(base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(userData,
125127
dataplane.Spec.ClusterName, v1alpha1.SchemeGroupVersion.Group, base64.StdEncoding.EncodeToString(clusterCA), clusterEndpoint)))),
126128
},
127-
LaunchTemplateName: aws.String(TemplateName(dataplane.Spec.ClusterName)),
129+
LaunchTemplateName: ptr.String(TemplateName(dataplane.Spec.ClusterName)),
128130
TagSpecifications: generateEC2Tags("launch-template", dataplane.Spec.ClusterName),
129131
}
130132
if _, err := c.ec2api.CreateLaunchTemplate(input); err != nil {
@@ -133,6 +135,28 @@ func (c *Controller) createLaunchTemplate(ctx context.Context, dataplane *v1alph
133135
return nil
134136
}
135137

138+
func (c *Controller) amiID(ctx context.Context, dataplane *v1alpha1.DataPlane) (string, error) {
139+
kubeVersion, err := c.desiredKubernetesVersion(ctx, dataplane)
140+
if err != nil {
141+
return "", fmt.Errorf("getting kubernetes version, %w", err)
142+
}
143+
paramOutput, err := c.ssm.GetParameterWithContext(ctx, &ssm.GetParameterInput{
144+
Name: ptr.String(fmt.Sprintf("/aws/service/eks/optimized-ami/%s/amazon-linux-2/recommended/image_id", kubeVersion)),
145+
})
146+
if err != nil {
147+
return "", fmt.Errorf("getting ssm parameter, %w", err)
148+
}
149+
return *paramOutput.Parameter.Value, nil
150+
}
151+
152+
func (c *Controller) desiredKubernetesVersion(ctx context.Context, dataplane *v1alpha1.DataPlane) (string, error) {
153+
cp := &cpv1alpha1.ControlPlane{}
154+
if err := c.kubeclient.Get(ctx, types.NamespacedName{dataplane.GetNamespace(), dataplane.Spec.ClusterName}, cp); err != nil {
155+
return "", fmt.Errorf("getting control plane object, %w", err)
156+
}
157+
return cp.Spec.KubernetesVersion, nil
158+
}
159+
136160
func (c *Controller) getLaunchTemplates(ctx context.Context, clusterName string) ([]*ec2.LaunchTemplate, error) {
137161
output, err := c.ec2api.DescribeLaunchTemplatesWithContext(ctx, &ec2.DescribeLaunchTemplatesInput{
138162
Filters: ec2FilterFor(clusterName),
@@ -157,23 +181,23 @@ func existingTemplateMatchesDesired(templates []*ec2.LaunchTemplate, clusterName
157181

158182
func ec2FilterFor(clusterName string) []*ec2.Filter {
159183
return []*ec2.Filter{{
160-
Name: aws.String(fmt.Sprintf("tag:%s", TagKeyNameForAWSResources)),
161-
Values: []*string{aws.String(clusterName)},
184+
Name: ptr.String(fmt.Sprintf("tag:%s", TagKeyNameForAWSResources)),
185+
Values: []*string{ptr.String(clusterName)},
162186
}}
163187
}
164188

165189
func generateEC2Tags(svcName, clusterName string) []*ec2.TagSpecification {
166190
return []*ec2.TagSpecification{{
167-
ResourceType: aws.String(svcName),
191+
ResourceType: ptr.String(svcName),
168192
Tags: []*ec2.Tag{{
169-
Key: aws.String(TagKeyNameForAWSResources),
170-
Value: aws.String(clusterName),
193+
Key: ptr.String(TagKeyNameForAWSResources),
194+
Value: ptr.String(clusterName),
171195
}, {
172-
Key: aws.String("Name"),
173-
Value: aws.String(fmt.Sprintf("%s-%s", clusterName, svcName)),
196+
Key: ptr.String("Name"),
197+
Value: ptr.String(fmt.Sprintf("%s-%s", clusterName, svcName)),
174198
}, {
175-
Key: aws.String(fmt.Sprintf("kubernetes.io/cluster/%s", clusterName)),
176-
Value: aws.String("owned"),
199+
Key: ptr.String(fmt.Sprintf("kubernetes.io/cluster/%s", clusterName)),
200+
Value: ptr.String("owned"),
177201
}},
178202
}}
179203
}

operator/pkg/controllers/addons/coredns.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919

2020
"github.com/awslabs/kit/operator/pkg/apis/controlplane/v1alpha1"
2121
"github.com/awslabs/kit/operator/pkg/kubeprovider"
22+
"github.com/awslabs/kit/operator/pkg/utils/imageprovider"
2223
appsv1 "k8s.io/api/apps/v1"
2324
v1 "k8s.io/api/core/v1"
2425
rbacv1 "k8s.io/api/rbac/v1"
@@ -29,8 +30,7 @@ import (
2930
)
3031

3132
const (
32-
clusterIP = "10.96.0.10" // TODO hard coded for now fix this
33-
coreDNSImage = "public.ecr.aws/eks-distro/coredns/coredns:v1.8.3-eks-1-20-4"
33+
clusterIP = "10.96.0.10" // TODO hard coded for now fix this
3434
)
3535

3636
type CoreDNS struct {
@@ -193,7 +193,7 @@ func (c *CoreDNS) deployment(ctx context.Context) error {
193193
ServiceAccountName: "coredns",
194194
Containers: []v1.Container{{
195195
Name: "coredns",
196-
Image: coreDNSImage,
196+
Image: imageprovider.CoreDNS(),
197197
ImagePullPolicy: v1.PullIfNotPresent,
198198
Resources: v1.ResourceRequirements{
199199
Requests: map[v1.ResourceName]resource.Quantity{

operator/pkg/controllers/addons/kubeproxy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/awslabs/kit/operator/pkg/apis/controlplane/v1alpha1"
2323
"github.com/awslabs/kit/operator/pkg/controllers/master"
2424
"github.com/awslabs/kit/operator/pkg/kubeprovider"
25+
"github.com/awslabs/kit/operator/pkg/utils/imageprovider"
2526
"github.com/awslabs/kit/operator/pkg/utils/keypairs"
2627
"github.com/awslabs/kit/operator/pkg/utils/kubeconfigs"
2728
"github.com/awslabs/kit/operator/pkg/utils/object"
@@ -39,7 +40,6 @@ import (
3940
const (
4041
kubeSystem = "kube-system"
4142
defaultStr = "default"
42-
kubeProxyImage = "public.ecr.aws/eks-distro/kubernetes/kube-proxy:v1.20.7-eks-1-20-4"
4343
KubeProxyDaemonSetName = "kubeproxy-daemonset"
4444
)
4545

@@ -213,7 +213,7 @@ func kubeProxyPodSpecFor(controlPlane *v1alpha1.ControlPlane) v1.PodSpec {
213213
Containers: []v1.Container{
214214
{
215215
Name: "kubeproxy",
216-
Image: kubeProxyImage,
216+
Image: imageprovider.KubeProxy(controlPlane.Spec.KubernetesVersion),
217217
Resources: v1.ResourceRequirements{
218218
Requests: map[v1.ResourceName]resource.Quantity{
219219
v1.ResourceCPU: resource.MustParse("1"),

operator/pkg/controllers/etcd/pod.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/aws/aws-sdk-go/aws"
2222
"github.com/awslabs/kit/operator/pkg/apis/controlplane/v1alpha1"
2323
"github.com/awslabs/kit/operator/pkg/utils/functional"
24+
"github.com/awslabs/kit/operator/pkg/utils/imageprovider"
2425
"github.com/awslabs/kit/operator/pkg/utils/object"
2526
"github.com/awslabs/kit/operator/pkg/utils/secrets"
2627
v1 "k8s.io/api/core/v1"
@@ -29,7 +30,6 @@ import (
2930

3031
const (
3132
defaultEtcdReplicas = 3
32-
defaultEtcdImage = "public.ecr.aws/eks-distro/etcd-io/etcd:v3.4.14-eks-1-18-1"
3333
)
3434

3535
func podSpecFor(controlPlane *v1alpha1.ControlPlane) *v1.PodSpec {
@@ -55,7 +55,7 @@ func podSpecFor(controlPlane *v1alpha1.ControlPlane) *v1.PodSpec {
5555
}},
5656
Containers: []v1.Container{{
5757
Name: "etcd",
58-
Image: defaultEtcdImage,
58+
Image: imageprovider.ETCD(),
5959
Ports: []v1.ContainerPort{{
6060
ContainerPort: 2379,
6161
Name: "etcd",

operator/pkg/controllers/master/authenticatorconfig.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"html/template"
2222

2323
"github.com/awslabs/kit/operator/pkg/apis/controlplane/v1alpha1"
24+
"github.com/awslabs/kit/operator/pkg/utils/imageprovider"
2425
"knative.dev/pkg/ptr"
2526

2627
appsv1 "k8s.io/api/apps/v1"
@@ -30,11 +31,6 @@ import (
3031
clientsetscheme "k8s.io/client-go/kubernetes/scheme"
3132
)
3233

33-
const (
34-
busyBoxImage = "public.ecr.aws/runecast/busybox:1.33.1"
35-
awsIamAuthenticatorImage = "602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon/aws-iam-authenticator:v0.5.3-amazonlinux-2"
36-
)
37-
3834
// reconcileAuthenticatorConfig creates required configs for aws-iam-authenticator and stores them as secret in api server
3935
func (c *Controller) reconcileAuthenticatorConfig(ctx context.Context, controlPlane *v1alpha1.ControlPlane) error {
4036
awsAccountID, err := c.cloudProvider.ID()
@@ -81,7 +77,7 @@ func (c *Controller) reconcileAuthenticatorDaemonSet(ctx context.Context, contro
8177
Tolerations: []v1.Toleration{{Operator: v1.TolerationOpExists}},
8278
InitContainers: []v1.Container{{
8379
Name: "chown",
84-
Image: busyBoxImage,
80+
Image: imageprovider.BusyBox(),
8581
Command: []string{
8682
"sh",
8783
"-c",
@@ -98,7 +94,7 @@ func (c *Controller) reconcileAuthenticatorDaemonSet(ctx context.Context, contro
9894
}},
9995
Containers: []v1.Container{{
10096
Name: "aws-iam-authenticator",
101-
Image: awsIamAuthenticatorImage,
97+
Image: imageprovider.AWSIamAuthenticator(),
10298
Args: []string{
10399
"server",
104100
"--master=https://localhost/",

operator/pkg/controllers/master/kubeapiserver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/aws/aws-sdk-go/aws"
2222
"github.com/awslabs/kit/operator/pkg/apis/controlplane/v1alpha1"
2323
"github.com/awslabs/kit/operator/pkg/controllers/etcd"
24+
"github.com/awslabs/kit/operator/pkg/utils/imageprovider"
2425
"github.com/awslabs/kit/operator/pkg/utils/object"
2526
"github.com/awslabs/kit/operator/pkg/utils/patch"
2627
appsv1 "k8s.io/api/apps/v1"
@@ -30,7 +31,6 @@ import (
3031
)
3132

3233
const (
33-
apiserverImage = "public.ecr.aws/eks-distro/kubernetes/kube-apiserver:v1.20.7-eks-1-20-4"
3434
serviceClusterIPRange = "10.96.0.0/12"
3535
)
3636

@@ -101,7 +101,7 @@ func apiServerPodSpecFor(controlPlane *v1alpha1.ControlPlane) v1.PodSpec {
101101
Containers: []v1.Container{
102102
{
103103
Name: "apiserver",
104-
Image: apiserverImage,
104+
Image: imageprovider.APIServer(controlPlane.Spec.KubernetesVersion),
105105
Command: []string{"kube-apiserver"},
106106
Resources: v1.ResourceRequirements{
107107
Requests: map[v1.ResourceName]resource.Quantity{

operator/pkg/controllers/master/kubecontrollermanager.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,14 @@ import (
2121
"github.com/aws/aws-sdk-go/aws"
2222
"github.com/awslabs/kit/operator/pkg/apis/controlplane/v1alpha1"
2323
"github.com/awslabs/kit/operator/pkg/utils/functional"
24+
"github.com/awslabs/kit/operator/pkg/utils/imageprovider"
2425
"github.com/awslabs/kit/operator/pkg/utils/object"
2526
appsv1 "k8s.io/api/apps/v1"
2627
v1 "k8s.io/api/core/v1"
2728
"k8s.io/apimachinery/pkg/api/resource"
2829
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2930
)
3031

31-
const (
32-
controllerManagerImage = "public.ecr.aws/eks-distro/kubernetes/kube-controller-manager:v1.20.7-eks-1-20-4"
33-
)
34-
3532
func (c *Controller) reconcileKCM(ctx context.Context, controlPlane *v1alpha1.ControlPlane) error {
3633
return c.kubeClient.EnsurePatch(ctx, &appsv1.Deployment{}, object.WithOwner(controlPlane, kcmDeploymentSpec(controlPlane)))
3734
}
@@ -97,7 +94,7 @@ func kcmPodSpecFor(controlPlane *v1alpha1.ControlPlane) *v1.PodSpec {
9794
}},
9895
Containers: []v1.Container{{
9996
Name: "controller-manager",
100-
Image: controllerManagerImage,
97+
Image: imageprovider.KubeControllerManager(controlPlane.Spec.KubernetesVersion),
10198
Command: []string{"kube-controller-manager"},
10299
Resources: v1.ResourceRequirements{
103100
Requests: map[v1.ResourceName]resource.Quantity{

operator/pkg/controllers/master/kubescheduler.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,14 @@ import (
2020

2121
"github.com/aws/aws-sdk-go/aws"
2222
"github.com/awslabs/kit/operator/pkg/apis/controlplane/v1alpha1"
23+
"github.com/awslabs/kit/operator/pkg/utils/imageprovider"
2324
"github.com/awslabs/kit/operator/pkg/utils/object"
2425
appsv1 "k8s.io/api/apps/v1"
2526
v1 "k8s.io/api/core/v1"
2627
"k8s.io/apimachinery/pkg/api/resource"
2728
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2829
)
2930

30-
const (
31-
schedulerImage = "public.ecr.aws/eks-distro/kubernetes/kube-scheduler:v1.20.7-eks-1-20-4"
32-
)
33-
3431
func (c *Controller) reconcileScheduler(ctx context.Context, controlPlane *v1alpha1.ControlPlane) error {
3532
return c.kubeClient.EnsurePatch(ctx, &appsv1.Deployment{}, object.WithOwner(controlPlane, schedulerDeploymentSpec(controlPlane)))
3633
}
@@ -98,7 +95,7 @@ func schedulerPodSpecFor(controlPlane *v1alpha1.ControlPlane) *v1.PodSpec {
9895
}},
9996
Containers: []v1.Container{{
10097
Name: "scheduler",
101-
Image: schedulerImage,
98+
Image: imageprovider.KubeScheduler(controlPlane.Spec.KubernetesVersion),
10299
Command: []string{"kube-scheduler"},
103100
Resources: v1.ResourceRequirements{
104101
Requests: map[v1.ResourceName]resource.Quantity{

0 commit comments

Comments
 (0)