func BuildClusterConfig(c *federation_v1beta1.Cluster) (*restclient.Config, error) { var serverAddress string var clusterConfig *restclient.Config hostIP, err := utilnet.ChooseHostInterface() if err != nil { return nil, err } for _, item := range c.Spec.ServerAddressByClientCIDRs { _, cidrnet, err := net.ParseCIDR(item.ClientCIDR) if err != nil { return nil, err } myaddr := net.ParseIP(hostIP.String()) if cidrnet.Contains(myaddr) == true { serverAddress = item.ServerAddress break } } if serverAddress != "" { if c.Spec.SecretRef == nil { glog.Infof("didn't find secretRef for cluster %s. Trying insecure access", c.Name) clusterConfig, err = clientcmd.BuildConfigFromFlags(serverAddress, "") } else { kubeconfigGetter := KubeconfigGetterForCluster(c) clusterConfig, err = clientcmd.BuildConfigFromKubeconfigGetter(serverAddress, kubeconfigGetter) } if err != nil { return nil, err } clusterConfig.QPS = KubeAPIQPS clusterConfig.Burst = KubeAPIBurst } return clusterConfig, nil }
func setInitDynamicDefaults(cfg *kubeadmapi.MasterConfiguration) error { // Auto-detect the IP if len(cfg.API.AdvertiseAddresses) == 0 { ip, err := netutil.ChooseHostInterface() if err != nil { return err } cfg.API.AdvertiseAddresses = []string{ip.String()} } // Validate version argument ver, err := kubeadmutil.KubernetesReleaseVersion(cfg.KubernetesVersion) if err != nil { if cfg.KubernetesVersion != kubeadmapiext.DefaultKubernetesVersion { return err } else { ver = kubeadmapiext.DefaultKubernetesFallbackVersion } } cfg.KubernetesVersion = ver fmt.Println("[init] Using Kubernetes version:", ver) // Omit the "v" in the beginning, otherwise semver will fail // If the version is newer than the specified version, RBAC v1beta1 support is enabled in the apiserver so we can default to RBAC k8sVersion, err := semver.Parse(cfg.KubernetesVersion[1:]) if k8sVersion.GT(allowAllMaxVersion) { cfg.AuthorizationMode = "RBAC" } fmt.Println("[init] Using Authorization mode:", cfg.AuthorizationMode) // Warn about the limitations with the current cloudprovider solution. if cfg.CloudProvider != "" { fmt.Println("[init] WARNING: For cloudprovider integrations to work --cloud-provider must be set for all kubelets in the cluster.") fmt.Println("\t(/etc/systemd/system/kubelet.service.d/10-kubeadm.conf should be edited for this purpose)") } // Validate token if any, otherwise generate if cfg.Discovery.Token != nil { if cfg.Discovery.Token.ID != "" && cfg.Discovery.Token.Secret != "" { fmt.Printf("[init] A token has been provided, validating [%s]\n", kubeadmutil.BearerToken(cfg.Discovery.Token)) if valid, err := kubeadmutil.ValidateToken(cfg.Discovery.Token); valid == false { return err } } else { fmt.Println("[init] A token has not been provided, generating one") if err := kubeadmutil.GenerateToken(cfg.Discovery.Token); err != nil { return err } } // If there aren't any addresses specified, default to the first advertised address which can be user-provided or the default network interface's IP address if len(cfg.Discovery.Token.Addresses) == 0 { cfg.Discovery.Token.Addresses = []string{cfg.API.AdvertiseAddresses[0] + ":" + strconv.Itoa(kubeadmapiext.DefaultDiscoveryBindPort)} } } return nil }
// NewProxier returns a new Proxier given a LoadBalancer and an address on // which to listen. Because of the iptables logic, It is assumed that there // is only a single Proxier active on a machine. An error will be returned if // the proxier cannot be started due to an invalid ListenIP (loopback) or // if iptables fails to update or acquire the initial lock. Once a proxier is // created, it will keep iptables up to date in the background and will not // terminate if a particular iptables call fails. func NewProxier(loadBalancer LoadBalancer, listenIP net.IP, netsh netsh.Interface, pr utilnet.PortRange, syncPeriod, udpIdleTimeout time.Duration) (*Proxier, error) { if listenIP.Equal(localhostIPv4) || listenIP.Equal(localhostIPv6) { return nil, ErrProxyOnLocalhost } hostIP, err := utilnet.ChooseHostInterface() if err != nil { return nil, fmt.Errorf("failed to select a host interface: %v", err) } proxyPorts := newPortAllocator(pr) glog.V(2).Infof("Setting proxy IP to %v and initializing iptables", hostIP) return createProxier(loadBalancer, listenIP, netsh, hostIP, proxyPorts, syncPeriod, udpIdleTimeout) }
// Set IP and hostname addresses for the node. func (kl *Kubelet) setNodeAddress(node *v1.Node) error { if kl.nodeIP != nil { if err := kl.validateNodeIP(); err != nil { return fmt.Errorf("failed to validate nodeIP: %v", err) } glog.V(2).Infof("Using node IP: %q", kl.nodeIP.String()) } if kl.cloud != nil { instances, ok := kl.cloud.Instances() if !ok { return fmt.Errorf("failed to get instances from cloud provider") } // TODO(roberthbailey): Can we do this without having credentials to talk // to the cloud provider? // TODO(justinsb): We can if CurrentNodeName() was actually CurrentNode() and returned an interface // TODO: If IP addresses couldn't be fetched from the cloud provider, should kubelet fallback on the other methods for getting the IP below? nodeAddresses, err := instances.NodeAddresses(kl.nodeName) if err != nil { return fmt.Errorf("failed to get node address from cloud provider: %v", err) } if kl.nodeIP != nil { for _, nodeAddress := range nodeAddresses { if nodeAddress.Address == kl.nodeIP.String() { node.Status.Addresses = []v1.NodeAddress{ {Type: nodeAddress.Type, Address: nodeAddress.Address}, {Type: v1.NodeHostName, Address: kl.GetHostname()}, } return nil } } return fmt.Errorf("failed to get node address from cloud provider that matches ip: %v", kl.nodeIP) } // Only add a NodeHostName address if the cloudprovider did not specify one // (we assume the cloudprovider knows best) var addressNodeHostName *v1.NodeAddress for i := range nodeAddresses { if nodeAddresses[i].Type == v1.NodeHostName { addressNodeHostName = &nodeAddresses[i] break } } if addressNodeHostName == nil { hostnameAddress := v1.NodeAddress{Type: v1.NodeHostName, Address: kl.GetHostname()} nodeAddresses = append(nodeAddresses, hostnameAddress) } else { glog.V(2).Infof("Using Node Hostname from cloudprovider: %q", addressNodeHostName.Address) } node.Status.Addresses = nodeAddresses } else { var ipAddr net.IP var err error // 1) Use nodeIP if set // 2) If the user has specified an IP to HostnameOverride, use it // 3) Lookup the IP from node name by DNS and use the first non-loopback ipv4 address // 4) Try to get the IP from the network interface used as default gateway if kl.nodeIP != nil { ipAddr = kl.nodeIP } else if addr := net.ParseIP(kl.hostname); addr != nil { ipAddr = addr } else { var addrs []net.IP addrs, err = net.LookupIP(node.Name) for _, addr := range addrs { if !addr.IsLoopback() && addr.To4() != nil { ipAddr = addr break } } if ipAddr == nil { ipAddr, err = utilnet.ChooseHostInterface() } } if ipAddr == nil { // We tried everything we could, but the IP address wasn't fetchable; error out return fmt.Errorf("can't get ip address of node %s. error: %v", node.Name, err) } else { node.Status.Addresses = []v1.NodeAddress{ {Type: v1.NodeLegacyHostIP, Address: ipAddr.String()}, {Type: v1.NodeInternalIP, Address: ipAddr.String()}, {Type: v1.NodeHostName, Address: kl.GetHostname()}, } } } return nil }