From d626de113f91da2ae82cafc894e1f33e133b2808 Mon Sep 17 00:00:00 2001 From: Dane LeBlanc Date: Tue, 28 Nov 2017 22:52:42 -0500 Subject: [PATCH] Add brackets around IPv6 kube-dns liveness probe addrs When a Kubernetes cluster is instantiated in IPv6-only mode via 'kubeadm init ...', the liveness probes that are configured by kubeadm for kube-dns currently use IP:port strings of "::1:53" and "::1:10053". These IP:port strings should instead include brackets around the ::1 IPv6 loopback address, e.g. "[::1]:53" and "[::1]:10053". This change adds the necessary brackets around the ::1 IPv6 loopback address. Without this change, the kube-dns sidecar container interprets the bracket-less strings as IPv4 IP:port strings that have too many colons, and the kube-dns pod is restarted about once every 2 minutes. fixes #56543 /area ipv6 /sig network --- cmd/kubeadm/app/phases/addons/dns/dns.go | 7 +++++-- cmd/kubeadm/app/phases/addons/dns/dns_test.go | 3 ++- cmd/kubeadm/app/phases/addons/dns/manifests.go | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cmd/kubeadm/app/phases/addons/dns/dns.go b/cmd/kubeadm/app/phases/addons/dns/dns.go index b1866e584f..072359a8e5 100644 --- a/cmd/kubeadm/app/phases/addons/dns/dns.go +++ b/cmd/kubeadm/app/phases/addons/dns/dns.go @@ -63,22 +63,25 @@ func kubeDNSAddon(cfg *kubeadmapi.MasterConfiguration, client clientset.Interfac return err } - var dnsBindAddr string + var dnsBindAddr, dnsProbeAddr string if dnsip.To4() == nil { dnsBindAddr = "::1" + dnsProbeAddr = "[" + dnsBindAddr + "]" } else { dnsBindAddr = "127.0.0.1" + dnsProbeAddr = dnsBindAddr } // Get the YAML manifest conditionally based on the k8s version kubeDNSDeploymentBytes := GetKubeDNSManifest(k8sVersion) dnsDeploymentBytes, err := kubeadmutil.ParseTemplate(kubeDNSDeploymentBytes, - struct{ ImageRepository, Arch, Version, DNSBindAddr, DNSDomain, DNSProbeType, MasterTaintKey string }{ + struct{ ImageRepository, Arch, Version, DNSBindAddr, DNSProbeAddr, DNSDomain, DNSProbeType, MasterTaintKey string }{ ImageRepository: cfg.ImageRepository, Arch: runtime.GOARCH, // Get the kube-dns version conditionally based on the k8s version Version: GetDNSVersion(k8sVersion, kubeadmconstants.KubeDNS), DNSBindAddr: dnsBindAddr, + DNSProbeAddr: dnsProbeAddr, DNSDomain: cfg.Networking.DNSDomain, DNSProbeType: GetKubeDNSProbeType(k8sVersion), MasterTaintKey: kubeadmconstants.LabelNodeRoleMaster, diff --git a/cmd/kubeadm/app/phases/addons/dns/dns_test.go b/cmd/kubeadm/app/phases/addons/dns/dns_test.go index 40c0043436..55967aae3d 100644 --- a/cmd/kubeadm/app/phases/addons/dns/dns_test.go +++ b/cmd/kubeadm/app/phases/addons/dns/dns_test.go @@ -92,11 +92,12 @@ func TestCompileManifests(t *testing.T) { }{ { manifest: v180AndAboveKubeDNSDeployment, - data: struct{ ImageRepository, Arch, Version, DNSBindAddr, DNSDomain, DNSProbeType, MasterTaintKey string }{ + data: struct{ ImageRepository, Arch, Version, DNSBindAddr, DNSProbeAddr, DNSDomain, DNSProbeType, MasterTaintKey string }{ ImageRepository: "foo", Arch: "foo", Version: "foo", DNSBindAddr: "foo", + DNSProbeAddr: "foo", DNSDomain: "foo", DNSProbeType: "foo", MasterTaintKey: "foo", diff --git a/cmd/kubeadm/app/phases/addons/dns/manifests.go b/cmd/kubeadm/app/phases/addons/dns/manifests.go index 4875ddb900..cbf434706d 100644 --- a/cmd/kubeadm/app/phases/addons/dns/manifests.go +++ b/cmd/kubeadm/app/phases/addons/dns/manifests.go @@ -156,8 +156,8 @@ spec: args: - --v=2 - --logtostderr - - --probe=kubedns,{{ .DNSBindAddr }}:10053,kubernetes.default.svc.{{ .DNSDomain }},5,{{ .DNSProbeType }} - - --probe=dnsmasq,{{ .DNSBindAddr }}:53,kubernetes.default.svc.{{ .DNSDomain }},5,{{ .DNSProbeType }} + - --probe=kubedns,{{ .DNSProbeAddr }}:10053,kubernetes.default.svc.{{ .DNSDomain }},5,{{ .DNSProbeType }} + - --probe=dnsmasq,{{ .DNSProbeAddr }}:53,kubernetes.default.svc.{{ .DNSDomain }},5,{{ .DNSProbeType }} ports: - containerPort: 10054 name: metrics