diff --git a/cmd/kubeadm/app/cmd/phases/addons.go b/cmd/kubeadm/app/cmd/phases/addons.go index 9bba400d2889d..604708c18ef65 100644 --- a/cmd/kubeadm/app/cmd/phases/addons.go +++ b/cmd/kubeadm/app/cmd/phases/addons.go @@ -116,6 +116,7 @@ func getAddonsSubCommands() []*cobra.Command { if properties.use == "all" || properties.use == "kube-dns" { cmd.Flags().StringVar(&cfg.Networking.DNSDomain, "service-dns-domain", cfg.Networking.DNSDomain, `Use alternative domain for services, e.g. "myorg.internal.`) + cmd.Flags().StringVar(&cfg.Networking.ServiceSubnet, "service-cidr", cfg.Networking.ServiceSubnet, `Use alternative range of IP address for service VIPs`) } subCmds = append(subCmds, cmd) } diff --git a/cmd/kubeadm/app/cmd/phases/addons_test.go b/cmd/kubeadm/app/cmd/phases/addons_test.go index ca2e614d11379..424e319081ee0 100644 --- a/cmd/kubeadm/app/cmd/phases/addons_test.go +++ b/cmd/kubeadm/app/cmd/phases/addons_test.go @@ -47,6 +47,7 @@ func TestAddonsSubCommandsHasFlags(t *testing.T) { "apiserver-bind-port", "pod-network-cidr", "service-dns-domain", + "service-cidr", }, }, { @@ -61,6 +62,7 @@ func TestAddonsSubCommandsHasFlags(t *testing.T) { command: "kube-dns", additionalFlags: []string{ "service-dns-domain", + "service-cidr", }, }, } diff --git a/cmd/kubeadm/app/phases/addons/dns/BUILD b/cmd/kubeadm/app/phases/addons/dns/BUILD index 28214c1ab5e88..f2c3aadacd807 100644 --- a/cmd/kubeadm/app/phases/addons/dns/BUILD +++ b/cmd/kubeadm/app/phases/addons/dns/BUILD @@ -37,6 +37,7 @@ go_library( "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/apiclient:go_default_library", "//pkg/api:go_default_library", + "//pkg/registry/core/service/ipallocator:go_default_library", "//pkg/util/version:go_default_library", "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/cmd/kubeadm/app/phases/addons/dns/dns.go b/cmd/kubeadm/app/phases/addons/dns/dns.go index 4ca3f70d5ecb1..5ecef9f66a0b7 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/registry/core/service/ipallocator" "k8s.io/kubernetes/pkg/util/version" ) @@ -65,7 +66,7 @@ func EnsureDNSAddon(cfg *kubeadmapi.MasterConfiguration, client clientset.Interf return fmt.Errorf("error when parsing kube-dns deployment template: %v", err) } - dnsip, err := getDNSIP(client) + dnsip, err := getDNSIP(cfg) if err != nil { return err } @@ -127,21 +128,20 @@ func createKubeDNSAddon(deploymentBytes, serviceBytes []byte, client clientset.I return nil } -// getDNSIP fetches the kubernetes service's ClusterIP and appends a "0" to it in order to get the DNS IP -func getDNSIP(client clientset.Interface) (net.IP, error) { - k8ssvc, err := client.CoreV1().Services(metav1.NamespaceDefault).Get("kubernetes", metav1.GetOptions{}) +// getDNSIP returns a dnsIP, which is 10th IP in svcSubnet CIDR range +func getDNSIP(cfg *kubeadmapi.MasterConfiguration) (net.IP, error) { + + // Get the service subnet CIDR + _, svcSubnet, err := net.ParseCIDR(cfg.Networking.ServiceSubnet) if err != nil { - return nil, fmt.Errorf("couldn't fetch information about the kubernetes service: %v", err) + return nil, fmt.Errorf("couldn't parse service subnet CIDR %q: %v", cfg.Networking.ServiceSubnet, err) } - if len(k8ssvc.Spec.ClusterIP) == 0 { - return nil, fmt.Errorf("couldn't fetch a valid clusterIP from the kubernetes service") + // Selects the 10th IP in service subnet CIDR range as dnsIP + dnsIP, err := ipallocator.GetIndexedIP(svcSubnet, 10) + if err != nil { + return nil, fmt.Errorf("unable to get tenth IP address from service subnet CIDR %s: %v", svcSubnet.String(), err) } - // Build an IP by taking the kubernetes service's clusterIP and appending a "0" and checking that it's valid - dnsIP := net.ParseIP(fmt.Sprintf("%s0", k8ssvc.Spec.ClusterIP)) - if dnsIP == nil { - return nil, fmt.Errorf("could not parse dns ip %q: %v", dnsIP, err) - } return dnsIP, nil }