2017-05-25 1 views
3

J'essaye de développer un exemple d'application en utilisant le spring spring et le minikube qui consistent en 3 applications de démarrage à ressort.Java - Kubernetes trouve des services par étiquette

Les deux premiers sont deux applications différentes (serveurs) qui ont le même point d'extrémité mais des fonctionnalités différentes, et le troisième est un client utilisé pour intégrer les deux autres applications dans une seule API exposée.

J'ai réussi à déployer les trois applications dans minikube et réussi à développer la pile complète et les faire communiquer entre eux, mais maintenant je veux aller plus loin et faire la découverte des deux serveurs automatiquement, sans codage dur les noms de service.

J'ai déployé les deux serveurs dans minikube en utilisant la même étiquette et je voudrais trouver quelque chose pour que le client puisse trouver automatiquement les services liés aux deux applications serveur. Cela permettra d'étendre l'application facilement, de sorte que lorsque j'ajouterai un nouveau serveur à la pile, le client le trouvera et l'exposera sans aucune modification.

En utilisant Netflix Eureka cela peut être facile à réaliser en utilisant quelque chose comme

discoveryClient.getInstances("service-name").forEach((ServiceInstance s) 

Mais je ne pas besoin d'ajouter un serveur eureka supplémentaire à la liste des microservices puisque nous allons utiliser Kubernetes.

Y a-t-il une bibliothèque qui offre cette fonctionnalité pour les kubernetes?

Répondre

1

Vous pouvez utiliser:

CLI: kubectl get services --selector=YOUR-LABEL-NAME.

API: GET /api/v1/namespaces/{namespace}/services avec le paramètre labelSelector voir API docs.

+0

Je connaissais le cli et l'API, mais existe-t-il une bibliothèque java qui le fait et qui se convertit en sevice cloud? – Sebb77

+1

Le plus simple est l'appel d'API de votre service de cloud de printemps? Pourquoi avez-vous besoin d'une bibliothèque Java? –

1

J'ai trouvé la bibliothèque fabric8 qui m'a aidé à atteindre cet objectif. Je ne sais toujours pas si cela est la bonne réponse, mais il fonctionne: D

https://github.com/fabric8io/kubernetes-client/tree/master/kubernetes-client

@RequestMapping("/") 
private String getResponse() { 
    String ret = "hello from Client L0L!!!\n"; 

    //Config config = new ConfigBuilder().withMasterUrl("https://mymaster.com").build(); 
    //KubernetesClient client = new DefaultKubernetesClient(config); 
    KubernetesClient client = new DefaultKubernetesClient(); 


    ServiceList services = client.services().withLabel("APIService").list(); 
    Service server = null; 
    log.warn("---------------------------------------------->"); 
    for (Service s : services.getItems()) { 
     log.warn(s.getMetadata().getName()); 
     log.warn(s.toString()); 
     if (s.getMetadata().getLabels().containsKey("ServiceType") && s.getMetadata().getLabels().get("ServiceType").equals("server")) 
      server = s; 
    } 

    log.warn("---------------------------------------------->"); 

    String s = ""; 
    if (server != null) { 
     RestTemplate t = new RestTemplate(); 
     String url = "http://" + server.getMetadata().getName() + ":" + server.getSpec().getPorts().get(0).getPort() + "/"; 
     log.warn("Contacting server service on: " + url); 
     s = t.getForObject(url, String.class); 
     log.warn("Response: " + s); 
    } else { 
     log.warn("Didn't find service with label ServiceType=server!!!"); 
    } 

    return ret + " - " + s; 
} 

Je crée les deux services et a ajouté les deux étiquettes utilisées dans le code.