From 407722b378f6a10e34657e4cdf0a03f547a79d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Mon, 6 Feb 2017 23:09:27 +0200 Subject: [PATCH] Remove an old proxy arg function, add clustercidr to the proxy manifest and automatically calculate the dns ip --- cmd/kubeadm/app/master/manifests.go | 6 --- cmd/kubeadm/app/master/manifests_test.go | 32 --------------- cmd/kubeadm/app/phases/addons/BUILD | 2 +- cmd/kubeadm/app/phases/addons/addons.go | 45 +++++++++++++--------- cmd/kubeadm/app/phases/addons/manifests.go | 4 +- cmd/kubeadm/app/util/template.go | 2 +- 6 files changed, 31 insertions(+), 60 deletions(-) diff --git a/cmd/kubeadm/app/master/manifests.go b/cmd/kubeadm/app/master/manifests.go index 0c3a993e2ae..e831277f2ea 100644 --- a/cmd/kubeadm/app/master/manifests.go +++ b/cmd/kubeadm/app/master/manifests.go @@ -424,12 +424,6 @@ func getSchedulerCommand(cfg *kubeadmapi.MasterConfiguration, selfHosted bool) [ return command } -func getProxyCommand(cfg *kubeadmapi.MasterConfiguration) []string { - return append(getComponentBaseCommand(proxy), - "--cluster-cidr="+cfg.Networking.PodSubnet, - ) -} - func getProxyEnvVars() []api.EnvVar { envs := []api.EnvVar{} for _, env := range os.Environ() { diff --git a/cmd/kubeadm/app/master/manifests_test.go b/cmd/kubeadm/app/master/manifests_test.go index 181246b3b88..df04770f42b 100644 --- a/cmd/kubeadm/app/master/manifests_test.go +++ b/cmd/kubeadm/app/master/manifests_test.go @@ -552,35 +552,3 @@ func TestGetSchedulerCommand(t *testing.T) { } } } - -func TestGetProxyCommand(t *testing.T) { - var tests = []struct { - cfg *kubeadmapi.MasterConfiguration - expected []string - }{ - { - cfg: &kubeadmapi.MasterConfiguration{ - Networking: kubeadm.Networking{ - PodSubnet: "bar", - }, - }, - expected: []string{ - "kube-proxy", - "--cluster-cidr=bar", - }, - }, - } - - for _, rt := range tests { - actual := getProxyCommand(rt.cfg) - for i := range actual { - if actual[i] != rt.expected[i] { - t.Errorf( - "failed getProxyCommand:\n\texpected: %s\n\t actual: %s", - rt.expected[i], - actual[i], - ) - } - } - } -} diff --git a/cmd/kubeadm/app/phases/addons/BUILD b/cmd/kubeadm/app/phases/addons/BUILD index 293c8d873e9..0600c3e52ac 100644 --- a/cmd/kubeadm/app/phases/addons/BUILD +++ b/cmd/kubeadm/app/phases/addons/BUILD @@ -16,12 +16,12 @@ go_library( tags = ["automanaged"], deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", + "//cmd/kubeadm/app/images:go_default_library", "//cmd/kubeadm/app/util:go_default_library", "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/apis/extensions/v1beta1:go_default_library", "//pkg/client/clientset_generated/clientset:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/runtime", ], diff --git a/cmd/kubeadm/app/phases/addons/addons.go b/cmd/kubeadm/app/phases/addons/addons.go index b968106f7c9..9c4ec4ddd16 100644 --- a/cmd/kubeadm/app/phases/addons/addons.go +++ b/cmd/kubeadm/app/phases/addons/addons.go @@ -25,17 +25,16 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kuberuntime "k8s.io/apimachinery/pkg/runtime" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/cmd/kubeadm/app/images" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1" extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" - "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" ) // CreateEssentialAddons creates the kube-proxy and kube-dns addons func CreateEssentialAddons(cfg *kubeadmapi.MasterConfiguration, client *clientset.Clientset) error { - proxyConfigMapBytes, err := kubeadmutil.ParseTemplate(KubeProxyConfigMap, struct{ MasterEndpoint string }{ // Fetch this value from the kubeconfig file MasterEndpoint: fmt.Sprintf("https://%s:%d", cfg.API.AdvertiseAddresses[0], cfg.API.Port), @@ -44,11 +43,9 @@ func CreateEssentialAddons(cfg *kubeadmapi.MasterConfiguration, client *clientse return fmt.Errorf("error when parsing kube-proxy configmap template: %v", err) } - proxyDaemonSetBytes, err := kubeadmutil.ParseTemplate(KubeProxyDaemonSet, struct{ ImageRepository, Arch, Version string }{ - ImageRepository: kubeadmapi.GlobalEnvParams.RepositoryPrefix, - Arch: runtime.GOARCH, - // TODO: Fetch the version from the {API Server IP}/version - Version: cfg.KubernetesVersion, + proxyDaemonSetBytes, err := kubeadmutil.ParseTemplate(KubeProxyDaemonSet, struct{ Image, ClusterCIDR string }{ + Image: images.GetCoreImage("proxy", cfg, kubeadmapi.GlobalEnvParams.HyperkubeImage), + ClusterCIDR: getClusterCIDR(cfg.Networking.PodSubnet), }) if err != nil { return fmt.Errorf("error when parsing kube-proxy daemonset template: %v", err) @@ -69,8 +66,7 @@ func CreateEssentialAddons(cfg *kubeadmapi.MasterConfiguration, client *clientse return fmt.Errorf("error when parsing kube-dns deployment template: %v", err) } - // Get the DNS IP - dnsip, err := getDNSIP(cfg.Networking.ServiceSubnet) + dnsip, err := getDNSIP(client) if err != nil { return err } @@ -139,17 +135,28 @@ func CreateKubeDNSAddon(deploymentBytes, serviceBytes []byte, client *clientset. return nil } -// TODO: Instead of looking at the subnet given to kubeadm, it should be possible to only use /28 or larger subnets and then -// kubeadm should look at the kubernetes service (e.g. 10.96.0.1 or 10.0.0.1) and just append a "0" at the end. -// This way, we don't need the information about the subnet in this phase => good -func getDNSIP(subnet string) (net.IP, error) { - _, n, err := net.ParseCIDR(subnet) +// getDNSIP fetches the kubernetes service's ClusterIP and appends a "0" to it in order to get the DNS IP +func getDNSIP(client *clientset.Clientset) (net.IP, error) { + k8ssvc, err := client.CoreV1().Services(metav1.NamespaceDefault).Get("kubernetes", metav1.GetOptions{}) if err != nil { - return nil, fmt.Errorf("could not parse %q: %v", subnet, err) + return nil, fmt.Errorf("couldn't fetch information about the kubernetes service: %v", err) } - ip, err := ipallocator.GetIndexedIP(n, 10) - if err != nil { - return nil, fmt.Errorf("unable to allocate IP address for kube-dns addon from the given CIDR %q: [%v]", subnet, err) + + if len(k8ssvc.Spec.ClusterIP) == 0 { + return nil, fmt.Errorf("couldn't fetch a valid clusterIP from the kubernetes service") } - return ip, nil + + // 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 +} + +func getClusterCIDR(podsubnet string) string { + if len(podsubnet) == 0 { + return "" + } + return "--cluster-cidr" + podsubnet } diff --git a/cmd/kubeadm/app/phases/addons/manifests.go b/cmd/kubeadm/app/phases/addons/manifests.go index f79b7e111a7..661a8f31bfd 100644 --- a/cmd/kubeadm/app/phases/addons/manifests.go +++ b/cmd/kubeadm/app/phases/addons/manifests.go @@ -71,11 +71,13 @@ spec: spec: containers: - name: kube-proxy - image: {{ .ImageRepository }}/kube-proxy-{{ .Arch }}:{{ .Version }} + image: {{ .Image }} imagePullPolicy: IfNotPresent + # TODO: This is gonna work with hyperkube v1.6.0-alpha.2+: https://github.com/kubernetes/kubernetes/pull/41017 command: - kube-proxy - --kubeconfig=/var/lib/kube-proxy/kubeconfig.conf + {{ .ClusterCIDR }} securityContext: privileged: true volumeMounts: diff --git a/cmd/kubeadm/app/util/template.go b/cmd/kubeadm/app/util/template.go index 7e1e8702c5f..164362c5551 100644 --- a/cmd/kubeadm/app/util/template.go +++ b/cmd/kubeadm/app/util/template.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright 2017 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.