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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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() {
 | 
			
		||||
 
 | 
			
		||||
@@ -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"],
 | 
			
		||||
    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",
 | 
			
		||||
    ],
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user