From 6bc8ab3725f98260f7f47f0e5d3a9e4597de59ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Sun, 20 Aug 2017 11:30:07 +0300 Subject: [PATCH] kubeadm: Use kube-dns manifests based on the kubernetes version --- cmd/kubeadm/app/cmd/init.go | 2 +- cmd/kubeadm/app/phases/addons/dns/BUILD | 8 ++- cmd/kubeadm/app/phases/addons/dns/dns.go | 14 ++-- cmd/kubeadm/app/phases/addons/dns/dns_test.go | 2 +- .../app/phases/addons/dns/manifests.go | 7 +- cmd/kubeadm/app/phases/addons/dns/versions.go | 40 +++++++++++ .../app/phases/addons/dns/versions_test.go | 70 +++++++++++++++++++ 7 files changed, 130 insertions(+), 13 deletions(-) create mode 100644 cmd/kubeadm/app/phases/addons/dns/versions.go create mode 100644 cmd/kubeadm/app/phases/addons/dns/versions_test.go diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index 39f1c8b7adb..ff454a5da46 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -308,7 +308,7 @@ func (i *Init) Run(out io.Writer) error { return err } - if err := dnsaddonphase.EnsureDNSAddon(i.cfg, client); err != nil { + if err := dnsaddonphase.EnsureDNSAddon(i.cfg, client, k8sVersion); err != nil { return err } diff --git a/cmd/kubeadm/app/phases/addons/dns/BUILD b/cmd/kubeadm/app/phases/addons/dns/BUILD index 1d5c808cfab..22622cc9fa4 100644 --- a/cmd/kubeadm/app/phases/addons/dns/BUILD +++ b/cmd/kubeadm/app/phases/addons/dns/BUILD @@ -10,12 +10,16 @@ load( go_test( name = "go_default_test", - srcs = ["dns_test.go"], + srcs = [ + "dns_test.go", + "versions_test.go", + ], library = ":go_default_library", tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/util:go_default_library", "//pkg/api:go_default_library", + "//pkg/util/version:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", @@ -28,6 +32,7 @@ go_library( srcs = [ "dns.go", "manifests.go", + "versions.go", ], tags = ["automanaged"], deps = [ @@ -36,6 +41,7 @@ go_library( "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/apiclient:go_default_library", "//pkg/api:go_default_library", + "//pkg/util/version:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/cmd/kubeadm/app/phases/addons/dns/dns.go b/cmd/kubeadm/app/phases/addons/dns/dns.go index 51e4dae815f..135647d6ac2 100644 --- a/cmd/kubeadm/app/phases/addons/dns/dns.go +++ b/cmd/kubeadm/app/phases/addons/dns/dns.go @@ -32,6 +32,7 @@ import ( kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/util/version" ) const ( @@ -40,17 +41,20 @@ const ( ) // EnsureDNSAddon creates the kube-dns addon -func EnsureDNSAddon(cfg *kubeadmapi.MasterConfiguration, client clientset.Interface) error { +func EnsureDNSAddon(cfg *kubeadmapi.MasterConfiguration, client clientset.Interface, k8sVersion *version.Version) error { if err := CreateServiceAccount(client); err != nil { return err } - dnsDeploymentBytes, err := kubeadmutil.ParseTemplate(KubeDNSDeployment, struct{ ImageRepository, Arch, Version, DNSDomain, MasterTaintKey string }{ + // Get the YAML manifest conditionally based on the k8s version + kubeDNSDeploymentBytes := GetKubeDNSManifest(k8sVersion) + dnsDeploymentBytes, err := kubeadmutil.ParseTemplate(kubeDNSDeploymentBytes, struct{ ImageRepository, Arch, Version, DNSDomain, MasterTaintKey string }{ ImageRepository: cfg.ImageRepository, Arch: runtime.GOARCH, - Version: KubeDNSVersion, - DNSDomain: cfg.Networking.DNSDomain, - MasterTaintKey: kubeadmconstants.LabelNodeRoleMaster, + // Get the kube-dns version conditionally based on the k8s version + Version: GetKubeDNSVersion(k8sVersion), + DNSDomain: cfg.Networking.DNSDomain, + MasterTaintKey: kubeadmconstants.LabelNodeRoleMaster, }) if err != nil { return fmt.Errorf("error when parsing kube-dns deployment template: %v", err) diff --git a/cmd/kubeadm/app/phases/addons/dns/dns_test.go b/cmd/kubeadm/app/phases/addons/dns/dns_test.go index e65a9d983c1..22b1d444ded 100644 --- a/cmd/kubeadm/app/phases/addons/dns/dns_test.go +++ b/cmd/kubeadm/app/phases/addons/dns/dns_test.go @@ -90,7 +90,7 @@ func TestCompileManifests(t *testing.T) { expected bool }{ { - manifest: KubeDNSDeployment, + manifest: v170AndAboveKubeDNSDeployment, data: struct{ ImageRepository, Arch, Version, DNSDomain, MasterTaintKey string }{ ImageRepository: "foo", Arch: "foo", diff --git a/cmd/kubeadm/app/phases/addons/dns/manifests.go b/cmd/kubeadm/app/phases/addons/dns/manifests.go index 866bd474647..4aedb03b9f0 100644 --- a/cmd/kubeadm/app/phases/addons/dns/manifests.go +++ b/cmd/kubeadm/app/phases/addons/dns/manifests.go @@ -17,11 +17,8 @@ limitations under the License. package dns const ( - // KubeDNSVersion is the version of kube-dns to run - KubeDNSVersion = "1.14.4" - - // KubeDNSDeployment is the kube-dns Deployemnt manifest - KubeDNSDeployment = ` + // v170AndAboveKubeDNSDeployment is the kube-dns Deployment manifest for the kube-dns manifest for v1.7+ + v170AndAboveKubeDNSDeployment = ` apiVersion: extensions/v1beta1 kind: Deployment metadata: diff --git a/cmd/kubeadm/app/phases/addons/dns/versions.go b/cmd/kubeadm/app/phases/addons/dns/versions.go new file mode 100644 index 00000000000..bd03155573a --- /dev/null +++ b/cmd/kubeadm/app/phases/addons/dns/versions.go @@ -0,0 +1,40 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package dns + +import ( + "k8s.io/kubernetes/pkg/util/version" +) + +const ( + kubeDNSv170AndAboveVersion = "1.14.4" +) + +// GetKubeDNSVersion returns the right kube-dns version for a specific k8s version +func GetKubeDNSVersion(kubeVersion *version.Version) string { + // v1.7.0+ uses 1.14.4, just return that here + // In the future when the kube-dns version is bumped at HEAD; add conditional logic to return the right versions + // Also, the version might be bumped for different k8s releases on the same branch + return kubeDNSv170AndAboveVersion +} + +// GetKubeDNSManifest returns the right kube-dns YAML manifest for a specific k8s version +func GetKubeDNSManifest(kubeVersion *version.Version) string { + // v1.7.0+ has only one known YAML manifest spec, just return that here + // In the future when the kube-dns version is bumped at HEAD; add conditional logic to return the right manifest + return v170AndAboveKubeDNSDeployment +} diff --git a/cmd/kubeadm/app/phases/addons/dns/versions_test.go b/cmd/kubeadm/app/phases/addons/dns/versions_test.go new file mode 100644 index 00000000000..1b87fb45108 --- /dev/null +++ b/cmd/kubeadm/app/phases/addons/dns/versions_test.go @@ -0,0 +1,70 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package dns + +import ( + "testing" + + "k8s.io/kubernetes/pkg/util/version" +) + +func TestGetKubeDNSVersion(t *testing.T) { + var tests = []struct { + k8sVersion, expected string + }{ + { + k8sVersion: "v1.7.0", + expected: "1.14.4", + }, + { + k8sVersion: "v1.7.1", + expected: "1.14.4", + }, + { + k8sVersion: "v1.7.2", + expected: "1.14.4", + }, + { + k8sVersion: "v1.7.3", + expected: "1.14.4", + }, + { + k8sVersion: "v1.8.0-alpha.2", + expected: "1.14.4", + }, + { + k8sVersion: "v1.8.0", + expected: "1.14.4", + }, + } + for _, rt := range tests { + + k8sVersion, err := version.ParseSemantic(rt.k8sVersion) + if err != nil { + t.Fatalf("couldn't parse kubernetes version %q: %v", rt.k8sVersion, err) + } + + actualDNSVersion := GetKubeDNSVersion(k8sVersion) + if actualDNSVersion != rt.expected { + t.Errorf( + "failed GetKubeDNSVersion:\n\texpected: %s\n\t actual: %s", + rt.expected, + actualDNSVersion, + ) + } + } +}