Skip to content

Commit

Permalink
Merge branch 'refs/heads/release-0.26' into merge-6a2279490933ac455ed…
Browse files Browse the repository at this point in the history
…7f0a2cbb71db25aca7e58
  • Loading branch information
weaveworksbot committed Aug 13, 2020
2 parents c287d6f + 6a22794 commit 6d27613
Show file tree
Hide file tree
Showing 29 changed files with 451 additions and 81 deletions.
54 changes: 54 additions & 0 deletions pkg/addons/default/addons.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package defaultaddons

import (
"github.com/pkg/errors"

"github.com/weaveworks/eksctl/pkg/kubernetes"
)

// EnsureAllAddonsUpToDate checks the default addons (aws-node, kube-proxy and coredns) are up to date
// and if they are not it will update them to the latest version for the given control plane version
// TODO Delete this function when the multi architecture images are used by default when a new cluster is created. When
// that happens eksctl won't need to update them before creating ARM nodegroups anymore.
func EnsureAddonsUpToDate(clientSet kubernetes.Interface, rawClient kubernetes.RawClientInterface, controlPlaneVersion string, region string) error {
_, err := UpdateKubeProxyImageTag(clientSet, controlPlaneVersion, false)
if err != nil {
return errors.Wrapf(err, "error updating kube-proxy")
}

_, err = UpdateAWSNode(rawClient, region, false)
if err != nil {
return errors.Wrapf(err, "error updating aws-node")
}

_, err = UpdateCoreDNS(rawClient, region, controlPlaneVersion, false)
if err != nil {
return errors.Wrapf(err, "error updating coredns")
}

return nil
}

func AreAddonsUpToDate(clientSet kubernetes.Interface, rawClient kubernetes.RawClientInterface, controlPlaneVersion string, region string) (bool, error) {
kubeProxyUpToDate, err := IsKubeProxyUpToDate(clientSet, controlPlaneVersion)
if err != nil {
return true, err
}
if !kubeProxyUpToDate {
return false, nil
}

awsNodeUpToDate, err := IsAWSNodeUpToDate(rawClient, region)
if err != nil {
return true, err
}
if !awsNodeUpToDate {
return false, nil
}

coreDNSUpToDate, err := IsCoreDNSUpToDate(rawClient, region, controlPlaneVersion)
if err != nil {
return true, err
}
return coreDNSUpToDate, nil
}
24 changes: 12 additions & 12 deletions pkg/addons/default/assets.go

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions pkg/addons/default/assets/aws-node.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ spec:
operator: In
values:
- amd64
- arm64
- key: "eks.amazonaws.com/compute-type"
operator: NotIn
values:
Expand All @@ -90,6 +91,7 @@ spec:
operator: In
values:
- amd64
- arm64
- key: "eks.amazonaws.com/compute-type"
operator: NotIn
values:
Expand Down
5 changes: 3 additions & 2 deletions pkg/addons/default/assets/coredns-1.15.json
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@
"key": "beta.kubernetes.io/arch",
"operator": "In",
"values": [
"amd64"
"amd64",
"arm64"
]
}
]
Expand Down Expand Up @@ -164,7 +165,7 @@
"-conf",
"/etc/coredns/Corefile"
],
"image": "%s.dkr.ecr.%s.%s/eks/coredns:v1.6.6",
"image": "%s.dkr.ecr.%s.%s/eks/coredns:v1.6.6-eksbuild.1",
"imagePullPolicy": "IfNotPresent",
"livenessProbe": {
"failureThreshold": 5,
Expand Down
5 changes: 3 additions & 2 deletions pkg/addons/default/assets/coredns-1.16.json
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@
"key": "beta.kubernetes.io/arch",
"operator": "In",
"values": [
"amd64"
"amd64",
"arm64"
]
}
]
Expand Down Expand Up @@ -164,7 +165,7 @@
"-conf",
"/etc/coredns/Corefile"
],
"image": "%s.dkr.ecr.%s.%s/eks/coredns:v1.6.6",
"image": "%s.dkr.ecr.%s.%s/eks/coredns:v1.6.6-eksbuild.1",
"imagePullPolicy": "IfNotPresent",
"livenessProbe": {
"failureThreshold": 5,
Expand Down
5 changes: 3 additions & 2 deletions pkg/addons/default/assets/coredns-1.17.json
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@
"key": "beta.kubernetes.io/arch",
"operator": "In",
"values": [
"amd64"
"amd64",
"arm64"
]
}
]
Expand Down Expand Up @@ -164,7 +165,7 @@
"-conf",
"/etc/coredns/Corefile"
],
"image": "%s.dkr.ecr.%s.%s/eks/coredns:v1.6.6",
"image": "%s.dkr.ecr.%s.%s/eks/coredns:v1.6.6-eksbuild.1",
"imagePullPolicy": "IfNotPresent",
"livenessProbe": {
"failureThreshold": 5,
Expand Down
63 changes: 62 additions & 1 deletion pkg/addons/default/aws_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import (

"github.com/kris-nova/logger"
"github.com/pkg/errors"
"github.com/weaveworks/eksctl/pkg/addons"
appsv1 "k8s.io/api/apps/v1"
apierrs "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/weaveworks/eksctl/pkg/addons"
"github.com/weaveworks/eksctl/pkg/kubernetes"
)

Expand All @@ -21,6 +21,63 @@ const (
awsNodeImageFormatPrefix = "%s.dkr.ecr.%s.%s/amazon-k8s-cni"
)

// IsAWSNodeUpToDate will update the `aws-node` add-on and returns true
// if an update is available.
func IsAWSNodeUpToDate(rawClient kubernetes.RawClientInterface, region string) (bool, error) {
clusterDaemonSet, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(AWSNode, metav1.GetOptions{})
if err != nil {
if apierrs.IsNotFound(err) {
logger.Warning("%q was not found", AWSNode)
return false, nil
}
return false, errors.Wrapf(err, "getting %q", AWSNode)
}

// if DaemonSets is present, go through our list of assets
list, err := LoadAsset(AWSNode, "yaml")
if err != nil {
return false, err
}

for _, rawObj := range list.Items {
resource, err := rawClient.NewRawResource(rawObj.Object)
if err != nil {
return false, err
}
if resource.GVK.Kind != "DaemonSet" {
continue
}

daemonSet, ok := resource.Info.Object.(*appsv1.DaemonSet)
if !ok {
return false, fmt.Errorf("expected type %T; got %T", &appsv1.Deployment{}, resource.Info.Object)
}
container := &daemonSet.Spec.Template.Spec.Containers[0]
imageParts := strings.Split(container.Image, ":")
if len(imageParts) != 2 {
return false, fmt.Errorf("invalid container image: %s", container.Image)
}

if !strings.HasSuffix(imageParts[1], "-eksbuild.1") {
imageParts[1] = imageParts[1] + "-eksbuild.1"
}

container.Image = awsNodeImageFormatPrefix + ":" + imageParts[1]
if err := addons.UseRegionalImage(&daemonSet.Spec.Template, region); err != nil {
return false, err
}
tagMismatch, err := addons.ImageTagsDiffer(
container.Image,
clusterDaemonSet.Spec.Template.Spec.Containers[0].Image,
)
if err != nil {
return false, err
}
return !tagMismatch, nil
}
return true, nil
}

// UpdateAWSNode will update the `aws-node` add-on and returns true
// if an update is available.
func UpdateAWSNode(rawClient kubernetes.RawClientInterface, region string, plan bool) (bool, error) {
Expand Down Expand Up @@ -57,6 +114,10 @@ func UpdateAWSNode(rawClient kubernetes.RawClientInterface, region string, plan
return false, fmt.Errorf("invalid container image: %s", container.Image)
}

if !strings.HasSuffix(imageParts[1], "-eksbuild.1") {
imageParts[1] = imageParts[1] + "-eksbuild.1"
}

container.Image = awsNodeImageFormatPrefix + ":" + imageParts[1]
if err := addons.UseRegionalImage(&daemonSet.Spec.Template, region); err != nil {
return false, err
Expand Down
14 changes: 7 additions & 7 deletions pkg/addons/default/aws_node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
)

var _ = Describe("default addons - aws-node", func() {
Describe("can update aws-node add-on", func() {
Describe("can update aws-node add-on to multi-architecture images", func() {
var (
rawClient *testutils.FakeRawClient
ct *testutils.CollectionTracker
Expand Down Expand Up @@ -52,7 +52,7 @@ var _ = Describe("default addons - aws-node", func() {

})

It("can update 1.14 sample to latest", func() {
It("can update 1.14 sample to latest multi-architecture image", func() {
rawClient.AssumeObjectsMissing = false

_, err := UpdateAWSNode(rawClient, "eu-west-1", false)
Expand All @@ -69,13 +69,13 @@ var _ = Describe("default addons - aws-node", func() {
Expect(err).ToNot(HaveOccurred())
Expect(awsNode.Spec.Template.Spec.Containers).To(HaveLen(1))
Expect(awsNode.Spec.Template.Spec.Containers[0].Image).To(
Equal("602401143452.dkr.ecr.eu-west-1.amazonaws.com/amazon-k8s-cni:v1.6.3"),
Equal("602401143452.dkr.ecr.eu-west-1.amazonaws.com/amazon-k8s-cni:v1.6.3-eksbuild.1"),
)

rawClient.ClearUpdated()
})

It("can update 1.14 sample for different region", func() {
It("can update 1.14 sample for different region to multi-architecture image", func() {
rawClient.ClientSetUseUpdatedObjects = false // must be set for subsequent UpdateAWSNode

_, err := UpdateAWSNode(rawClient, "us-east-1", false)
Expand All @@ -87,11 +87,11 @@ var _ = Describe("default addons - aws-node", func() {
Expect(err).ToNot(HaveOccurred())
Expect(awsNode.Spec.Template.Spec.Containers).To(HaveLen(1))
Expect(awsNode.Spec.Template.Spec.Containers[0].Image).To(
Equal("602401143452.dkr.ecr.us-east-1.amazonaws.com/amazon-k8s-cni:v1.6.3"),
Equal("602401143452.dkr.ecr.us-east-1.amazonaws.com/amazon-k8s-cni:v1.6.3-eksbuild.1"),
)
})

It("can update 1.14 sample for china region", func() {
It("can update 1.14 sample for china region to multi-architecture image", func() {
rawClient.ClientSetUseUpdatedObjects = false // must be set for subsequent UpdateAWSNode

_, err := UpdateAWSNode(rawClient, "cn-northwest-1", false)
Expand All @@ -103,7 +103,7 @@ var _ = Describe("default addons - aws-node", func() {
Expect(err).ToNot(HaveOccurred())
Expect(awsNode.Spec.Template.Spec.Containers).To(HaveLen(1))
Expect(awsNode.Spec.Template.Spec.Containers[0].Image).To(
Equal("961992271922.dkr.ecr.cn-northwest-1.amazonaws.com.cn/amazon-k8s-cni:v1.6.3"),
Equal("961992271922.dkr.ecr.cn-northwest-1.amazonaws.com.cn/amazon-k8s-cni:v1.6.3-eksbuild.1"),
)
})

Expand Down
49 changes: 49 additions & 0 deletions pkg/addons/default/coredns.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,55 @@ const (
KubeDNS = "kube-dns"
)

func IsCoreDNSUpToDate(rawClient kubernetes.RawClientInterface, region, controlPlaneVersion string) (bool, error) {
kubeDNSDeployment, err := rawClient.ClientSet().AppsV1().Deployments(metav1.NamespaceSystem).Get(CoreDNS, metav1.GetOptions{})
if err != nil {
if apierrs.IsNotFound(err) {
logger.Warning("%q was not found", CoreDNS)
return false, nil
}
return false, errors.Wrapf(err, "getting %q", CoreDNS)
}

// if Deployment is present, go through our list of assets
list, err := loadAssetCoreDNS(controlPlaneVersion)
if err != nil {
return false, err
}

for _, rawObj := range list.Items {
resource, err := rawClient.NewRawResource(rawObj.Object)
if err != nil {
return false, err
}
if resource.GVK.Kind != "Deployment" {
continue
}
if resource.Info.Name != "coredns" {
continue
}
deployment, ok := resource.Info.Object.(*appsv1.Deployment)
if !ok {
return false, fmt.Errorf("expected type %T; got %T", &appsv1.Deployment{}, resource.Info.Object)
}
if err := addons.UseRegionalImage(&deployment.Spec.Template, region); err != nil {
return false, err
}
if computeType, ok := kubeDNSDeployment.Spec.Template.Annotations[coredns.ComputeTypeAnnotationKey]; ok {
deployment.Spec.Template.Annotations[coredns.ComputeTypeAnnotationKey] = computeType
}
tagMismatch, err := addons.ImageTagsDiffer(
deployment.Spec.Template.Spec.Containers[0].Image,
kubeDNSDeployment.Spec.Template.Spec.Containers[0].Image,
)
if err != nil {
return false, err
}
return !tagMismatch, err
}
return true, nil
}

// UpdateCoreDNS will update the `coredns` add-on and returns true
// if an update is available
func UpdateCoreDNS(rawClient kubernetes.RawClientInterface, region, controlPlaneVersion string, plan bool) (bool, error) {
Expand Down
12 changes: 6 additions & 6 deletions pkg/addons/default/coredns_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ var _ = Describe("default addons - coredns", func() {

loadSampleAndCheck("1.14", "1.6.0")

Context("[1.14 –> 1.15] can update coredns", func() {
Context("[1.14 –> 1.15] can update coredns to multi-architecture images", func() {

loadSample("1.14", 10)

Expand All @@ -86,7 +86,7 @@ var _ = Describe("default addons - coredns", func() {
It("can update to correct version", func() {
_, err := UpdateCoreDNS(rawClient, "eu-west-2", "1.15.x", false)
Expect(err).ToNot(HaveOccurred())
checkCoreDNSImage(rawClient, "eu-west-2", "v1.6.6", false)
checkCoreDNSImage(rawClient, "eu-west-2", "v1.6.6-eksbuild.1", false)

createReqs := []string{
"POST [/clusterrolebindings] (aws-node)",
Expand Down Expand Up @@ -124,7 +124,7 @@ var _ = Describe("default addons - coredns", func() {

loadSampleAndCheck("1.14", "1.6.0")

Context("[1.14 –> 1.15] can update coredns", func() {
Context("[1.14 –> 1.15] can update coredns to multi-architecture image", func() {

loadSample("1.14", 10)

Expand All @@ -135,7 +135,7 @@ var _ = Describe("default addons - coredns", func() {
It("can update to correct version", func() {
_, err := UpdateCoreDNS(rawClient, "eu-west-2", "1.15.x", false)
Expect(err).ToNot(HaveOccurred())
checkCoreDNSImage(rawClient, "eu-west-2", "v1.6.6", false)
checkCoreDNSImage(rawClient, "eu-west-2", "v1.6.6-eksbuild.1", false)

createReqs := []string{
"POST [/clusterrolebindings] (aws-node)",
Expand Down Expand Up @@ -173,7 +173,7 @@ var _ = Describe("default addons - coredns", func() {

loadSampleAndCheck("1.15", "1.6.6")

Context("[1.15 –> 1.16] can update coredns", func() {
Context("[1.15 –> 1.16] can update coredns to a multi-architecture image", func() {

loadSample("1.15", 10)

Expand All @@ -184,7 +184,7 @@ var _ = Describe("default addons - coredns", func() {
It("can update to correct version", func() {
_, err := UpdateCoreDNS(rawClient, "eu-west-2", "1.16.x", false)
Expect(err).ToNot(HaveOccurred())
checkCoreDNSImage(rawClient, "eu-west-2", "v1.6.6", false)
checkCoreDNSImage(rawClient, "eu-west-2", "v1.6.6-eksbuild.1", false)

createReqs := []string{
"POST [/clusterrolebindings] (aws-node)",
Expand Down
Loading

0 comments on commit 6d27613

Please sign in to comment.