// runningAddresess returns a list of IP addresses and/or FQDN where the // ingress controller is currently running func (s *statusSync) runningAddresess() ([]string, error) { if s.PublishService != "" { ns, name, _ := k8s.ParseNameNS(s.PublishService) svc, err := s.Client.Core().Services(ns).Get(name) if err != nil { return nil, err } addrs := []string{} for _, ip := range svc.Status.LoadBalancer.Ingress { if ip.IP == "" { addrs = append(addrs, ip.Hostname) } else { addrs = append(addrs, ip.IP) } } return addrs, nil } // get information about all the pods running the ingress controller pods, err := s.Client.Core().Pods(s.pod.Namespace).List(api.ListOptions{ LabelSelector: labels.SelectorFromSet(s.pod.Labels), }) if err != nil { return nil, err } addrs := []string{} for _, pod := range pods.Items { name := k8s.GetNodeIP(s.Client, pod.Spec.NodeName) if !strings.StringInSlice(name, addrs) { addrs = append(addrs, name) } } return addrs, nil }
func (ic *GenericController) getStreamServices(data map[string]string, proto api.Protocol) []*ingress.Location { var svcs []*ingress.Location // k -> port to expose // v -> <namespace>/<service name>:<port from service to be used> for k, v := range data { port, err := strconv.Atoi(k) if err != nil { glog.Warningf("%v is not valid as a TCP port", k) continue } // this ports used by the backend if local_strings.StringInSlice(k, reservedPorts) { glog.Warningf("port %v cannot be used for TCP or UDP services. It is reserved for the Ingress controller", k) continue } nsSvcPort := strings.Split(v, ":") if len(nsSvcPort) != 2 { glog.Warningf("invalid format (namespace/name:port) '%v'", k) continue } nsName := nsSvcPort[0] svcPort := nsSvcPort[1] svcNs, svcName, err := k8s.ParseNameNS(nsName) if err != nil { glog.Warningf("%v", err) continue } svcObj, svcExists, err := ic.svcLister.Indexer.GetByKey(nsName) if err != nil { glog.Warningf("error getting service %v: %v", nsName, err) continue } if !svcExists { glog.Warningf("service %v was not found", nsName) continue } svc := svcObj.(*api.Service) var endps []ingress.Endpoint targetPort, err := strconv.Atoi(svcPort) if err != nil { for _, sp := range svc.Spec.Ports { if sp.Name == svcPort { endps = ic.getEndpoints(svc, sp.TargetPort, proto, &healthcheck.Upstream{}) break } } } else { // we need to use the TargetPort (where the endpoints are running) for _, sp := range svc.Spec.Ports { if sp.Port == int32(targetPort) { endps = ic.getEndpoints(svc, sp.TargetPort, proto, &healthcheck.Upstream{}) break } } } sort.Sort(ingress.EndpointByAddrPort(endps)) // tcp upstreams cannot contain empty upstreams and there is no // default backend equivalent for TCP if len(endps) == 0 { glog.Warningf("service %v/%v does not have any active endpoints", svcNs, svcName) continue } svcs = append(svcs, &ingress.Location{ Path: k, Backend: fmt.Sprintf("%v-%v-%v", svcNs, svcName, port), }) } return svcs }