From f4cb405164727f02a79da494865726962cb00736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Wed, 7 Dec 2016 16:24:21 +0200 Subject: [PATCH] Update the built-in DNS addon of kubeadm to the v1.5 version --- cmd/kubeadm/app/images/images.go | 27 +++--- cmd/kubeadm/app/master/addons.go | 138 +++++++++++++++++++++---------- 2 files changed, 111 insertions(+), 54 deletions(-) diff --git a/cmd/kubeadm/app/images/images.go b/cmd/kubeadm/app/images/images.go index 638d4afc54e..4a6d8bb9b18 100644 --- a/cmd/kubeadm/app/images/images.go +++ b/cmd/kubeadm/app/images/images.go @@ -31,18 +31,20 @@ const ( KubeSchedulerImage = "scheduler" KubeProxyImage = "proxy" - KubeDNSImage = "kube-dns" - KubeDNSmasqImage = "dnsmasq" - KubeExechealthzImage = "exechealthz" - Pause = "pause" + KubeDNSImage = "kubedns" + KubeDNSmasqImage = "kube-dnsmasq" + KubeDNSmasqMetricsImage = "dnsmasq-metrics" + KubeExechealthzImage = "exechealthz" + Pause = "pause" gcrPrefix = "gcr.io/google_containers" etcdVersion = "3.0.14-kubeadm" - kubeDNSVersion = "1.7" - dnsmasqVersion = "1.3" - exechealthzVersion = "1.1" - pauseVersion = "3.0" + kubeDNSVersion = "1.9" + dnsmasqVersion = "1.4" + exechealthzVersion = "1.2" + dnsmasqMetricsVersion = "1.0" + pauseVersion = "3.0" ) func GetCoreImage(image string, cfg *kubeadmapi.MasterConfiguration, overrideImage string) string { @@ -62,9 +64,10 @@ func GetCoreImage(image string, cfg *kubeadmapi.MasterConfiguration, overrideIma func GetAddonImage(image string) string { repoPrefix := kubeadmapi.GlobalEnvParams.RepositoryPrefix return map[string]string{ - KubeDNSImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kubedns", runtime.GOARCH, kubeDNSVersion), - KubeDNSmasqImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-dnsmasq", runtime.GOARCH, dnsmasqVersion), - KubeExechealthzImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "exechealthz", runtime.GOARCH, exechealthzVersion), - Pause: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "pause", runtime.GOARCH, pauseVersion), + KubeDNSImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kubedns", runtime.GOARCH, kubeDNSVersion), + KubeDNSmasqImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-dnsmasq", runtime.GOARCH, dnsmasqVersion), + KubeDNSmasqMetricsImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "dnsmasq-metrics", runtime.GOARCH, dnsmasqMetricsVersion), + KubeExechealthzImage: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "exechealthz", runtime.GOARCH, exechealthzVersion), + Pause: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "pause", runtime.GOARCH, pauseVersion), }[image] } diff --git a/cmd/kubeadm/app/master/addons.go b/cmd/kubeadm/app/master/addons.go index ff165bbd169..c76a1563bcb 100644 --- a/cmd/kubeadm/app/master/addons.go +++ b/cmd/kubeadm/app/master/addons.go @@ -27,7 +27,7 @@ import ( "k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/v1" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" - ipallocator "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" + "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" "k8s.io/kubernetes/pkg/util/intstr" ) @@ -83,26 +83,9 @@ func createKubeProxyPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.PodSpec { func createKubeDNSPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.PodSpec { - dnsPodResources := v1.ResourceList{ - v1.ResourceName(v1.ResourceCPU): resource.MustParse("100m"), - v1.ResourceName(v1.ResourceMemory): resource.MustParse("170Mi"), - } - - healthzPodResources := v1.ResourceList{ - v1.ResourceName(v1.ResourceCPU): resource.MustParse("10m"), - v1.ResourceName(v1.ResourceMemory): resource.MustParse("50Mi"), - } - kubeDNSPort := int32(10053) dnsmasqPort := int32(53) - nslookup := fmt.Sprintf("nslookup kubernetes.default.svc.%s 127.0.0.1", cfg.Networking.DNSDomain) - - nslookup = fmt.Sprintf("-cmd=%s:%d >/dev/null && %s:%d >/dev/null", - nslookup, dnsmasqPort, - nslookup, kubeDNSPort, - ) - return v1.PodSpec{ Containers: []v1.Container{ // DNS server @@ -110,18 +93,18 @@ func createKubeDNSPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.PodSpec { Name: "kube-dns", Image: images.GetAddonImage(images.KubeDNSImage), Resources: v1.ResourceRequirements{ - Limits: dnsPodResources, - Requests: dnsPodResources, - }, - Args: []string{ - fmt.Sprintf("--domain=%s", cfg.Networking.DNSDomain), - fmt.Sprintf("--dns-port=%d", kubeDNSPort), - // TODO __PILLAR__FEDERATIONS__DOMAIN__MAP__ + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceMemory): resource.MustParse("170Mi"), + }, + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("100m"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("70Mi"), + }, }, LivenessProbe: &v1.Probe{ Handler: v1.Handler{ HTTPGet: &v1.HTTPGetAction{ - Path: "/healthz", + Path: "/healthz-kubedns", Port: intstr.FromInt(8080), Scheme: v1.URISchemeHTTP, }, @@ -129,7 +112,7 @@ func createKubeDNSPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.PodSpec { InitialDelaySeconds: 60, TimeoutSeconds: 5, SuccessThreshold: 1, - FailureThreshold: 1, + FailureThreshold: 5, }, // # we poll on pod startup for the Kubernetes master service and // # only setup the /readiness HTTP server once that's available. @@ -141,9 +124,20 @@ func createKubeDNSPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.PodSpec { Scheme: v1.URISchemeHTTP, }, }, - InitialDelaySeconds: 30, + InitialDelaySeconds: 3, TimeoutSeconds: 5, }, + Args: []string{ + fmt.Sprintf("--domain=%s", cfg.Networking.DNSDomain), + fmt.Sprintf("--dns-port=%d", kubeDNSPort), + "--config-map=kube-dns", + }, + Env: []v1.EnvVar{ + { + Name: "PROMETHEUS_PORT", + Value: "10055", + }, + }, Ports: []v1.ContainerPort{ { ContainerPort: kubeDNSPort, @@ -155,20 +149,35 @@ func createKubeDNSPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.PodSpec { Name: "dns-tcp-local", Protocol: v1.ProtocolTCP, }, + { + ContainerPort: 10055, + Name: "metrics", + Protocol: v1.ProtocolTCP, + }, }, }, // dnsmasq { Name: "dnsmasq", Image: images.GetAddonImage(images.KubeDNSmasqImage), - Resources: v1.ResourceRequirements{ - Limits: dnsPodResources, - Requests: dnsPodResources, + LivenessProbe: &v1.Probe{ + Handler: v1.Handler{ + HTTPGet: &v1.HTTPGetAction{ + Path: "/healthz-dnsmasq", + Port: intstr.FromInt(8080), + Scheme: v1.URISchemeHTTP, + }, + }, + InitialDelaySeconds: 60, + TimeoutSeconds: 5, + SuccessThreshold: 1, + FailureThreshold: 5, }, Args: []string{ "--cache-size=1000", "--no-resolv", fmt.Sprintf("--server=127.0.0.1#%d", kubeDNSPort), + "--log-facility=-", }, Ports: []v1.ContainerPort{ { @@ -182,19 +191,66 @@ func createKubeDNSPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.PodSpec { Protocol: v1.ProtocolTCP, }, }, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("150m"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("10Mi"), + }, + }, + }, + { + Name: "dnsmasq-metrics", + Image: images.GetAddonImage(images.KubeDNSmasqMetricsImage), + LivenessProbe: &v1.Probe{ + Handler: v1.Handler{ + HTTPGet: &v1.HTTPGetAction{ + Path: "/metrics", + Port: intstr.FromInt(10054), + Scheme: v1.URISchemeHTTP, + }, + }, + InitialDelaySeconds: 60, + TimeoutSeconds: 5, + SuccessThreshold: 1, + FailureThreshold: 5, + }, + Args: []string{ + "--v=2", + "--logtostderr", + }, + Ports: []v1.ContainerPort{ + { + ContainerPort: 10054, + Name: "metrics", + Protocol: v1.ProtocolTCP, + }, + }, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceMemory): resource.MustParse("10Mi"), + }, + }, }, // healthz { Name: "healthz", Image: images.GetAddonImage(images.KubeExechealthzImage), Resources: v1.ResourceRequirements{ - Limits: healthzPodResources, - Requests: healthzPodResources, + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceMemory): resource.MustParse("50Mi"), + }, + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("10m"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("50Mi"), + }, }, Args: []string{ - nslookup, - "-port=8080", - "-quiet", + fmt.Sprintf("--cmd=nslookup kubernetes.default.svc.%s 127.0.0.1 >/dev/null", cfg.Networking.DNSDomain), + "--url=/healthz-dnsmasq", + fmt.Sprintf("--cmd=nslookup kubernetes.default.svc.%s 127.0.0.1:%d >/dev/null", cfg.Networking.DNSDomain, kubeDNSPort), + "--url=/healthz-kubedns", + "--port=8080", + "--quiet", }, Ports: []v1.ContainerPort{{ ContainerPort: 8080, @@ -204,7 +260,6 @@ func createKubeDNSPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.PodSpec { }, DNSPolicy: v1.DNSDefault, } - } func createKubeDNSServiceSpec(cfg *kubeadmapi.MasterConfiguration) (*v1.ServiceSpec, error) { @@ -217,16 +272,14 @@ func createKubeDNSServiceSpec(cfg *kubeadmapi.MasterConfiguration) (*v1.ServiceS return nil, fmt.Errorf("unable to allocate IP address for kube-dns addon from the given CIDR (%q) [%v]", cfg.Networking.ServiceSubnet, err) } - svc := &v1.ServiceSpec{ + return &v1.ServiceSpec{ Selector: map[string]string{"name": "kube-dns"}, Ports: []v1.ServicePort{ {Name: "dns", Port: 53, Protocol: v1.ProtocolUDP}, {Name: "dns-tcp", Port: 53, Protocol: v1.ProtocolTCP}, }, ClusterIP: ip.String(), - } - - return svc, nil + }, nil } func CreateEssentialAddons(cfg *kubeadmapi.MasterConfiguration, client *clientset.Clientset) error { @@ -250,10 +303,11 @@ func CreateEssentialAddons(cfg *kubeadmapi.MasterConfiguration, client *clientse kubeDNSServiceSpec, err := createKubeDNSServiceSpec(cfg) if err != nil { - return fmt.Errorf(" failed creating essential kube-dns addon - %v", err) + return fmt.Errorf("failed creating essential kube-dns addon [%v]", err) } kubeDNSService := NewService("kube-dns", *kubeDNSServiceSpec) + kubeDNSService.ObjectMeta.Labels["kubernetes.io/name"] = "KubeDNS" if _, err := client.Services(api.NamespaceSystem).Create(kubeDNSService); err != nil { return fmt.Errorf(" failed creating essential kube-dns addon [%v]", err) }