func main() { var ingClient client.IngressInterface if kubeClient, err := client.NewInCluster(); err != nil { log.Fatalf("Failed to create client: %v.", err) } else { ingClient = kubeClient.Extensions().Ingress(api.NamespaceAll) } tmpl, _ := template.New("nginx").Parse(nginxConf) rateLimiter := util.NewTokenBucketRateLimiter(0.1, 1) known := &extensions.IngressList{} // Controller loop shellOut("nginx") for { rateLimiter.Accept() ingresses, err := ingClient.List(labels.Everything(), fields.Everything()) if err != nil || reflect.DeepEqual(ingresses.Items, known.Items) { continue } known = ingresses if w, err := os.Create("/etc/nginx/nginx.conf"); err != nil { log.Fatalf("Failed to open %v: %v", nginxConf, err) } else if err := tmpl.Execute(w, ingresses); err != nil { log.Fatalf("Failed to write template %v", err) } shellOut("nginx -s reload") } }
// updateLbIp updates the loadbalancer status ip if required. func updateLbIp( ingClient client.IngressInterface, ing extensions.Ingress, ip string) error { lbIPs := ing.Status.LoadBalancer.Ingress if len(lbIPs) > 0 && lbIPs[0].IP == ip { glog.Infof("Ingress %v/%v: %v doesn't require status update", ing.Namespace, ing.Name, lbIPs) return nil } glog.Infof("Updating Ingress %v/%v with ip %v", ing.Namespace, ing.Name, ip) currIng, err := ingClient.Get(ing.Name) if err != nil { return err } currIng.Status = extensions.IngressStatus{ LoadBalancer: api.LoadBalancerStatus{ Ingress: []api.LoadBalancerIngress{ {IP: ip}, }, }, } // TODO: If this update fails it's probably resource version related, // which means it's advantageous to retry right away vs requeuing, // which will lead to a full sync. if _, err := ingClient.UpdateStatus(currIng); err != nil { return err } return nil }
func main() { var ingClient client.IngressInterface if kubeClient, err := client.NewInCluster(); err != nil { log.Fatalf("Failed to create client: %v.", err) } else { ingClient = kubeClient.Extensions().Ingress("devops-test") } tmpl, _ := template.New("nginx").Parse(nginxConf) rateLimiter := util.NewTokenBucketRateLimiter(0.1, 1) known := &extensions.IngressList{} // Controller loop shellOut("nginx") for { rateLimiter.Accept() ingresses, err := ingClient.List(api.ListOptions{}) if err != nil { log.Printf("Error retrieving ingresses: %v", err) continue } if reflect.DeepEqual(ingresses.Items, known.Items) { continue } known = ingresses if w, err := os.Create("/etc/nginx/nginx.conf"); err != nil { log.Fatalf("Failed to open %v: %v", nginxConf, err) } else if err := tmpl.Execute(w, ingresses); err != nil { log.Fatalf("Failed to write template %v", err) } restartNginx("nginx -t") } }
func main() { var ingClient client.IngressInterface if kubeClient, err := client.NewInCluster(); err != nil { log.Fatalf("Failed to create client: %v.", err) } else { ingClient = kubeClient.Extensions().Ingress(os.Getenv("INGRESS_NAMESPACE")) } tmpl, _ := template.New("haproxy").Parse(haproxyConf) rateLimiter := util.NewTokenBucketRateLimiter(0.1, 1) known := &extensions.IngressList{} // Controller loop shellOut("haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy-private.pid") for { rateLimiter.Accept() ingresses, err := ingClient.List(api.ListOptions{}) if err != nil { log.Printf("Error retrieving ingresses: %v", err) continue } if reflect.DeepEqual(ingresses.Items, known.Items) { log.Printf("Nothing Has Changed") continue } known = ingresses if w, err := os.Create("/etc/haproxy/haproxy.cfg"); err != nil { log.Fatalf("Failed to open %v: %v", haproxyConf, err) defer w.Close() } else if err := tmpl.Execute(w, ingresses); err != nil { log.Fatalf("Failed to write template %v", err) } restartHaproxy("haproxy_reload") } }
func main() { var ingClient client.IngressInterface var secretsClient client.SecretsInterface /* Anon http client config := client.Config{ Host: "http://localhost:8080", Username: "******", Password: "******", } kubeClient, err := client.New(&config) */ kubeClient, err := client.NewInCluster() if err != nil { log.Fatalf("Failed to create client: %v.", err) } else { ingClient = kubeClient.Extensions().Ingress(api.NamespaceAll) secretsClient = kubeClient.Secrets(api.NamespaceAll) } tmpl := template.New("nginx.tmpl").Funcs(template.FuncMap{"hasprefix": hasPrefix, "hassuffix": hasSuffix}) if _, err := tmpl.ParseFiles("./nginx.tmpl"); err != nil { log.Fatalf("Failed to parse template %v", err) } rateLimiter := util.NewTokenBucketRateLimiter(0.1, 1) known := &extensions.IngressList{} known_secrets := &api.SecretList{} // Controller loop shellOut("nginx") for { rateLimiter.Accept() ingresses, err := ingClient.List(api.ListOptions{}) if err != nil { log.Printf("Error retrieving ingresses: %v", err) continue } secrets, err := secretsClient.List(api.ListOptions{}) if err != nil { log.Printf("Error retrieving secrets: %v", err) continue } if reflect.DeepEqual(ingresses.Items, known.Items) && reflect.DeepEqual(secrets.Items, known_secrets.Items) { continue } // Process SSL context // old values known = ingresses known_secrets = secrets // context variable context := &Context{Ingress: ingresses, Secrets: secrets} if w, err := os.Create("/etc/nginx/nginx.conf"); err != nil { log.Fatalf("Failed to open %v: %v", err) } else if err := tmpl.Execute(w, context); err != nil { log.Fatalf("Failed to write template %v", err) } shellOut("nginx -s reload") } }
func main() { var ingClient client.IngressInterface if kubeClient, err := client.NewInCluster(); err != nil { log.Fatalf("Failed to create client: %v.", err) } else { ingClient = kubeClient.Extensions().Ingress(api.NamespaceAll) } tmpl, _ := template.New("nginx").Parse(nginxConf) tmplSSL, _ := template.New("nginx").Parse(nginxSSLConf) rateLimiter := util.NewTokenBucketRateLimiter(0.1, 1) known := &extensions.IngressList{} // Controller loop //shellOut("nginx") for { rateLimiter.Accept() ingresses, err := ingClient.List(api.ListOptions{}) fmt.Printf("Port %+v\n", ingresses.Items[0].Spec.Rules[0].HTTP.Paths[0].Backend.ServicePort.IntValue()) fmt.Printf("Path %+v\n", ingresses.Items[0].Spec.Rules[0].HTTP.Paths[0].Path) var httpIngressList extensions.IngressList var httpsIngressList extensions.IngressList for _, v := range ingresses.Items { fmt.Printf("%#v\n", v) if v.Spec.Rules[0].HTTP.Paths[0].Backend.ServicePort.IntVal == 80 { httpIngressList.Items = append(httpIngressList.Items, v) } else if v.Spec.Rules[0].HTTP.Paths[0].Backend.ServicePort.IntVal == 443 { httpsIngressList.Items = append(httpsIngressList.Items, v) } } if err != nil { log.Printf("Error retrieving ingresses: %v", err) continue } if reflect.DeepEqual(ingresses.Items, known.Items) { continue } known = ingresses if w, err := os.Create("/etc/nginx/conf.d/appcloud.conf"); err != nil { log.Fatalf("Failed to open %v: %v", nginxConf, err) } else if err := tmpl.Execute(w, httpIngressList); err != nil { log.Fatalf("Failed to write template %v", err) } if w, err := os.Create("/etc/nginx/conf.d/appcloud-ssl.conf"); err != nil { log.Fatalf("Failed to open %v: %v", nginxSSLConf, err) } else if err := tmplSSL.Execute(w, httpsIngressList); err != nil { log.Fatalf("Failed to write template %v", err) } // shellOut("nginx -s reload") } }