Remove an old proxy arg function, add clustercidr to the proxy manifest and automatically calculate the dns ip
This commit is contained in:
		@@ -424,12 +424,6 @@ func getSchedulerCommand(cfg *kubeadmapi.MasterConfiguration, selfHosted bool) [
 | 
				
			|||||||
	return command
 | 
						return command
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getProxyCommand(cfg *kubeadmapi.MasterConfiguration) []string {
 | 
					 | 
				
			||||||
	return append(getComponentBaseCommand(proxy),
 | 
					 | 
				
			||||||
		"--cluster-cidr="+cfg.Networking.PodSubnet,
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func getProxyEnvVars() []api.EnvVar {
 | 
					func getProxyEnvVars() []api.EnvVar {
 | 
				
			||||||
	envs := []api.EnvVar{}
 | 
						envs := []api.EnvVar{}
 | 
				
			||||||
	for _, env := range os.Environ() {
 | 
						for _, env := range os.Environ() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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],
 | 
					 | 
				
			||||||
				)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,12 +16,12 @@ go_library(
 | 
				
			|||||||
    tags = ["automanaged"],
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
				
			||||||
 | 
					        "//cmd/kubeadm/app/images:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/util:go_default_library",
 | 
					        "//cmd/kubeadm/app/util:go_default_library",
 | 
				
			||||||
        "//pkg/api:go_default_library",
 | 
					        "//pkg/api:go_default_library",
 | 
				
			||||||
        "//pkg/api/v1:go_default_library",
 | 
					        "//pkg/api/v1:go_default_library",
 | 
				
			||||||
        "//pkg/apis/extensions/v1beta1:go_default_library",
 | 
					        "//pkg/apis/extensions/v1beta1:go_default_library",
 | 
				
			||||||
        "//pkg/client/clientset_generated/clientset: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/apis/meta/v1",
 | 
				
			||||||
        "//vendor:k8s.io/apimachinery/pkg/runtime",
 | 
					        "//vendor:k8s.io/apimachinery/pkg/runtime",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,17 +25,16 @@ import (
 | 
				
			|||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	kuberuntime "k8s.io/apimachinery/pkg/runtime"
 | 
						kuberuntime "k8s.io/apimachinery/pkg/runtime"
 | 
				
			||||||
	kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
 | 
						kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/images"
 | 
				
			||||||
	kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
 | 
						kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
						"k8s.io/kubernetes/pkg/api/v1"
 | 
				
			||||||
	extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
 | 
						extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
 | 
						"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
 | 
					// CreateEssentialAddons creates the kube-proxy and kube-dns addons
 | 
				
			||||||
func CreateEssentialAddons(cfg *kubeadmapi.MasterConfiguration, client *clientset.Clientset) error {
 | 
					func CreateEssentialAddons(cfg *kubeadmapi.MasterConfiguration, client *clientset.Clientset) error {
 | 
				
			||||||
 | 
					 | 
				
			||||||
	proxyConfigMapBytes, err := kubeadmutil.ParseTemplate(KubeProxyConfigMap, struct{ MasterEndpoint string }{
 | 
						proxyConfigMapBytes, err := kubeadmutil.ParseTemplate(KubeProxyConfigMap, struct{ MasterEndpoint string }{
 | 
				
			||||||
		// Fetch this value from the kubeconfig file
 | 
							// Fetch this value from the kubeconfig file
 | 
				
			||||||
		MasterEndpoint: fmt.Sprintf("https://%s:%d", cfg.API.AdvertiseAddresses[0], cfg.API.Port),
 | 
							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)
 | 
							return fmt.Errorf("error when parsing kube-proxy configmap template: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	proxyDaemonSetBytes, err := kubeadmutil.ParseTemplate(KubeProxyDaemonSet, struct{ ImageRepository, Arch, Version string }{
 | 
						proxyDaemonSetBytes, err := kubeadmutil.ParseTemplate(KubeProxyDaemonSet, struct{ Image, ClusterCIDR string }{
 | 
				
			||||||
		ImageRepository: kubeadmapi.GlobalEnvParams.RepositoryPrefix,
 | 
							Image:       images.GetCoreImage("proxy", cfg, kubeadmapi.GlobalEnvParams.HyperkubeImage),
 | 
				
			||||||
		Arch:            runtime.GOARCH,
 | 
							ClusterCIDR: getClusterCIDR(cfg.Networking.PodSubnet),
 | 
				
			||||||
		// TODO: Fetch the version from the {API Server IP}/version
 | 
					 | 
				
			||||||
		Version: cfg.KubernetesVersion,
 | 
					 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return fmt.Errorf("error when parsing kube-proxy daemonset template: %v", err)
 | 
							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)
 | 
							return fmt.Errorf("error when parsing kube-dns deployment template: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get the DNS IP
 | 
						dnsip, err := getDNSIP(client)
 | 
				
			||||||
	dnsip, err := getDNSIP(cfg.Networking.ServiceSubnet)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -139,17 +135,28 @@ func CreateKubeDNSAddon(deploymentBytes, serviceBytes []byte, client *clientset.
 | 
				
			|||||||
	return nil
 | 
						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
 | 
					// getDNSIP fetches the kubernetes service's ClusterIP and appends a "0" to it in order to get the DNS IP
 | 
				
			||||||
// 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.
 | 
					func getDNSIP(client *clientset.Clientset) (net.IP, error) {
 | 
				
			||||||
// This way, we don't need the information about the subnet in this phase => good
 | 
						k8ssvc, err := client.CoreV1().Services(metav1.NamespaceDefault).Get("kubernetes", metav1.GetOptions{})
 | 
				
			||||||
func getDNSIP(subnet string) (net.IP, error) {
 | 
					 | 
				
			||||||
	_, n, err := net.ParseCIDR(subnet)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						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 {
 | 
						if len(k8ssvc.Spec.ClusterIP) == 0 {
 | 
				
			||||||
		return nil, fmt.Errorf("unable to allocate IP address for kube-dns addon from the given CIDR %q: [%v]", subnet, err)
 | 
							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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,11 +71,13 @@ spec:
 | 
				
			|||||||
    spec:
 | 
					    spec:
 | 
				
			||||||
      containers:
 | 
					      containers:
 | 
				
			||||||
      - name: kube-proxy
 | 
					      - name: kube-proxy
 | 
				
			||||||
        image: {{ .ImageRepository }}/kube-proxy-{{ .Arch }}:{{ .Version }}
 | 
					        image: {{ .Image }}
 | 
				
			||||||
        imagePullPolicy: IfNotPresent
 | 
					        imagePullPolicy: IfNotPresent
 | 
				
			||||||
 | 
					        # TODO: This is gonna work with hyperkube v1.6.0-alpha.2+: https://github.com/kubernetes/kubernetes/pull/41017
 | 
				
			||||||
        command:
 | 
					        command:
 | 
				
			||||||
        - kube-proxy
 | 
					        - kube-proxy
 | 
				
			||||||
        - --kubeconfig=/var/lib/kube-proxy/kubeconfig.conf
 | 
					        - --kubeconfig=/var/lib/kube-proxy/kubeconfig.conf
 | 
				
			||||||
 | 
					        {{ .ClusterCIDR }}
 | 
				
			||||||
        securityContext:
 | 
					        securityContext:
 | 
				
			||||||
          privileged: true
 | 
					          privileged: true
 | 
				
			||||||
        volumeMounts:
 | 
					        volumeMounts:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
Copyright 2016 The Kubernetes Authors.
 | 
					Copyright 2017 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
you may not use this file except in compliance with the License.
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user