Vodič za proljetni oblak Kubernetes

1. Pregled

Kada gradimo rješenje za mikro usluge, Spring Cloud i Kubernetes su optimalna rješenja jer pružaju komponente za rješavanje najčešćih izazova. Međutim, ako odlučimo odabrati Kubernetes kao glavnog upravitelja spremnika i platformu za implementaciju našeg rješenja, još uvijek možemo koristiti zanimljive značajke Spring Cloud-a uglavnom kroz projekt Spring Cloud Kubernetes.

Ovaj relativno novi projekt nesumnjivo omogućuje jednostavnu integraciju s Kubernetesom za Spring Boot aplikacije. Prije početka može biti korisno pogledati kako rasporediti aplikaciju Spring Boot na Minikube, lokalnom Kubernetesovom okruženju.

U ovom uputstvu ćemo:

  • Instalirajte Minikube na naš lokalni stroj
  • Razviti primjer arhitekture mikrousluga s dvije neovisne Spring Boot aplikacije koje komuniciraju putem REST-a
  • Postavite aplikaciju na klasteru s jednim čvorom pomoću Minikubea
  • Postavite aplikaciju pomoću YAML konfiguracijske datoteke

2. Scenarij

U našem primjeru koristimo scenarij putničkih agencija koje nude razne ponude klijentima koji će s vremena na vrijeme pitati uslugu putničkih agencija. Upotrijebit ćemo ga za pokazivanje:

  • otkrivanje usluge kroz proljetni oblak Kubernetes
  • upravljanje konfiguracijom i ubrizgavanje Kubernetes ConfigMaps i tajni u aplikacijske mahune pomoću Spring Cloud Kubernetes Config-a
  • uravnoteženje opterećenja koristeći vrpcu Kubernetes Spring Cloud

3. Postavljanje okoliša

Prvo i najvažnije, trebamo instalirajte Minikube na naš lokalni stroj i po mogućnosti VM upravljački program kao što je VirtualBox. Također je preporučljivo pogledati Kubernetes i njegove glavne značajke prije nego što slijedite ovu postavku okruženja.

Pokrenimo lokalni Kubernetesov klaster s jednim čvorom:

minikube start --vm-driver = virtualbox

Ova naredba stvara virtualni stroj koji pokreće klaster Minikube pomoću upravljačkog programa VirtualBox. Zadani kontekst u kubectl sad će biti minikube. Međutim, da bismo se mogli prebacivati ​​između konteksta, koristimo:

kubectl config upotreba-kontekst minikube

Nakon pokretanja Minikubea možemo spojite na Kubernetesovu nadzornu ploču da biste lako pristupili zapisnicima i nadzirali naše usluge, pods, ConfigMaps i Secrets:

minikube nadzorna ploča 

3.1. Raspoređivanje

Prvo, uzmimo naš primjer iz GitHub-a.

U ovom trenutku možemo ili pokrenuti skriptu “deployment-travel-client.sh” iz roditeljske mape, ili pak izvršavati svaku uputu jednu po jednu kako bismo dobro razumjeli postupak:

### izgraditi spremište mvn clean install ### set docker env eval $ (minikube docker-env) ### izgraditi docker slike na minikube cd travel-agency-service docker build -t travel-agency-service. cd ../client-service docker build -t client-service. cd .. ### secret i mongodb kubectl delete -f travel-agency-service / secret.yaml kubectl delete -f travel-agency-service / mongo-deployment.yaml kubectl create -f travel-agency-service / secret.yaml kubectl create -f travel-agency-service / mongo-deployment.yaml ### travel-agency-service kubectl delete -f travel-agency-service / travel-agency-deployment.yaml kubectl create -f travel-agency-service / travel-agency-deployment.yaml ### client-service kubectl delete configmap client-service kubectl delete -f client-service / client-service-deployment.yaml kubectl create -f client-service / client-config.yaml kubectl create - f client-service / client-service-deployment.yaml # Provjerite rade li mahune kubectl get pods

4. Otkrivanje usluge

Ovaj nam projekt pruža implementaciju za Otkrivanje usluga sučelje u Kubernetesu. U okruženju mikrousluga obično postoji više mahuna koje pokreću istu uslugu. Kubernetes izlaže uslugu kao zbirku krajnjih točaka koji se može dohvatiti i doći do njega iz aplikacije Spring Boot koja se izvodi u podu u istoj Kubernetes grupi.

Na primjer, u našem primjeru imamo višestruke replike usluge putničke agencije, kojoj se iz naše službe za klijente pristupa kao // putnička agencija-usluga: 8080. Međutim, to bi se interno pretvorilo u pristup različitim mahunama poput putnička agencija-usluga-7c9cfff655-4hxnp.

Vrpca Spring Cloud Kubernetes koristi ovu značajku za učitavanje ravnoteže između različitih krajnjih točaka usluge.

Uslugu Discovery možemo lako koristiti dodavanjem ovisnosti spring-cloud-starter-kubernetes o našoj klijentskoj aplikaciji:

 org.springframework.cloud proljeće-oblak-starter-kubernetes 

Također, trebali bismo dodati @EnableDiscoveryClient i ubrizgajte DiscoveryClient u ClientController pomoću @Autowired u našem razredu:

@SpringBootApplication @EnableDiscoveryClient javna klasa Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}
@RestController javna klasa ClientController {@Autowired private DiscoveryClient discoveryClient; }

5. ConfigMaps

Tipično, mikroservisi zahtijevaju neku vrstu upravljanja konfiguracijom. Na primjer, u aplikacijama Spring Cloud koristili bismo Spring Cloud Config Server.

Međutim, to možemo postići korištenjem ConfigMaps koje pruža Kubernetes - pod uvjetom da ih namjeravamo koristiti samo za neosjetljive, nešifrirane informacije. Alternativno, ako su informacije koje želimo podijeliti osjetljive, tada bismo se trebali odlučiti za upotrebu Tajni.

U našem primjeru koristimo ConfigMaps na klijent-usluga Primjena Spring Boot. Stvorimo a client-config.yaml datoteku za definiranje ConfigMap datoteke klijent-usluga:

apiVersion: v1 po d vrsti: metapodaci ConfigMap: ime: podaci usluge klijenta: application.properties: | - bean.message = Ponovno učitavanje testiranja! Poruka iz pozadine je:% s

Usluge:% s

Važno je da se naziv programa ConfigMap podudara s nazivom aplikacije kako je navedeno u našoj datoteci "application.properties". U ovom slučaju je klijent-usluga. Dalje, trebali bismo stvoriti ConfigMap za klijent-usluga na Kubernetesu:

kubectl create -f client-config.yaml

Sada, kreirajmo klasu konfiguracije ClientConfig s @Konfiguracija i @ConfigurationProperties i ubrizgajte u ClientController:

@Configuration @ConfigurationProperties (prefix = "bean") javna klasa ClientConfig {private String message = "Poruka iz pozadine je:% s

Usluge:% s "; // dobivači i postavljači}

@RestController javna klasa ClientController {@Autowired private ClientConfig config; @GetMapping public String load () {return String.format (config.getMessage (), "", ""); }}

Ako ne odredimo ConfigMap, trebali bismo očekivati ​​da ćemo vidjeti zadanu poruku koja je postavljena u klasi. Međutim, kada kreiramo ConfigMap, ovu zadanu poruku nadjača to svojstvo.

Uz to, svaki put kada odlučimo ažurirati ConfigMap, poruka na stranici mijenja se u skladu s tim:

kubectl uredi configmap client-service

6. Tajne

Pogledajmo kako Secrets rade gledajući specifikaciju postavki veze MongoDB u našem primjeru. Stvorit ćemo varijable okruženja na Kubernetesu, koje će se zatim ubrizgati u aplikaciju Spring Boot.

6.1. Stvori tajnu

Prvi korak je stvaranje a tajna.yaml datoteka koja kodira Korisničko ime i zaporka do Baza 64:

apiVersion: v1 vrsta: Tajni metapodaci: ime: db-tajni podaci: korisničko ime: dXNlcg == lozinka: cDQ1NXcwcmQ =

Primijenimo tajnu konfiguraciju na Kubernetesovom klasteru:

kubectl primijeniti -f tajno.yaml

6.2. Stvorite MongoDB uslugu

Sada bismo trebali stvoriti uslugu MongoDB i implementaciju putnička agencija-raspoređivanje.yaml datoteka. Konkretno, u dijelu implementacije koristit ćemo tajnu Korisničko ime i zaporka koje smo prethodno definirali:

apiVersion: extensions / v1beta1 vrsta: Metapodaci implementacije: ime: mongo specifikacija: replike: 1 predložak: metapodaci: oznake: usluga: mongo ime: mongodb-servisne specifikacije: spremnici: - args: - mongod - --smallfiles slika: mongo: najnovije name: mongo env: - name: MONGO_INITDB_ROOT_USERNAME valueFrom: secretKeyRef: name: db-secret key: username - name: MONGO_INITDB_ROOT_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password

Prema zadanim postavkama mongo: najnovije slika će stvoriti korisnika sa Korisničko ime i zaporka na bazi podataka s imenom admin.

6.3. Postavite MongoDB na usluzi putničke agencije

Važno je ažurirati svojstva aplikacije da biste dodali informacije povezane s bazom podataka. Iako možemo slobodno navesti ime baze podataka admin, ovdje skrivamo najosjetljivije informacije poput Korisničko ime i zaporka:

spring.cloud.kubernetes.reload.enabled = true spring.cloud.kubernetes.secrets.name = db-secret spring.data.mongodb.host = mongodb-service spring.data.mongodb.port = 27017 spring.data.mongodb. baza podataka = admin spring.data.mongodb.username = $ {MONGO_USERNAME} spring.data.mongodb.password = $ {MONGO_PASSWORD}

Sada, pogledajmo našu raspoređivanje putničke agencije datoteku svojstava za ažuriranje usluga i implementacija informacijama o korisničkom imenu i lozinci potrebnim za povezivanje na mongodb-usluga.

Evo relevantnog odjeljka datoteke, s dijelom koji se odnosi na MongoDB vezu:

env: - name: MONGO_USERNAME valueFrom: secretKeyRef: name: db-secret key: username - name: MONGO_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password

7. Komunikacija s vrpcom

U okruženju mikrousluga, općenito nam je potreban popis mahuna na kojima se naša usluga replicira kako bismo izvršili uravnoteženje opterećenja. To se postiže korištenjem mehanizma koji pruža Spring Cloud Kubernetes Ribbon. Ovaj mehanizam može automatski otkrijte i dosegnite sve krajnje točke određene usluge, a nakon toga naseljava vrpcu Popis poslužitelja s informacijama o krajnjim točkama.

Krenimo dodavanjem proljeće-oblak-starter-kubernetes-vrpca ovisnost o našoj klijent-usluga datoteka pom.xml:

 org.springframework.cloud proljeće-oblak-starter-kubernetes-vrpca 

Sljedeći je korak dodavanje napomene @RibbonClient našem klijent-usluga primjena:

@RibbonClient (name = "putnička agencija-usluga")

Kada se popuni popis krajnjih točaka, Kubernetesov će klijent pretraživati ​​registrirane krajnje točke koje žive u trenutnom prostoru imena / projektu koji odgovara nazivu usluge definiranom pomoću @RibbonClient bilješka.

Također moramo omogućiti klijenta vrpce u svojstvima aplikacije:

vrpca.http.client.enabled = true

8. Dodatne značajke

8.1. Hystrix

Hystrix pomaže u izradi otporne i otporne aplikacije. Glavni su joj ciljevi brzi i brzi oporavak.

Konkretno, u našem primjeru koristimo Hystrix za implementaciju uzorka prekidača na klijent-poslužitelj označavanjem klase aplikacije Spring Boot sa @EnableCircuitBreaker.

Pored toga, koristimo zamjensku funkcionalnost označavanjem metode TravelAgencyService.getDeals () s @HystrixCommand (). To znači da u slučaju rezervnog programa getFallBackName () bit će pozvan i vraćena poruka "Rezervna":

@HystrixCommand (fallbackMethod = "getFallbackName", commandProperties = {@HystrixProperty (name = "execu.isolation.thread.timeoutInMilliseconds", value = "1000")}) javni String getDeals () {return this.restTemplate.getForObject ("/ / putnička agencija-usluga: 8080 / ponude ", String.class); } private String getFallbackName () {return "Fallback"; }

8.2. Pokazatelj zdravlja mahuna

Možemo iskoristiti Spring Boot HealthIndicator i Spring Boot Actuator kako bi korisniku izložili zdravstvene informacije.

Kubernetesov zdravstveni pokazatelj posebno pruža:

  • ime mahune
  • IP adresa
  • prostor imena
  • račun usluge
  • naziv čvora
  • zastava koja pokazuje je li aplikacija Spring Boot unutarnja ili vanjska za Kubernetes

9. Zaključak

U ovom članku pružamo temeljit pregled projekta Spring Cloud Kubernetes.

Pa zašto bismo ga trebali koristiti? Ako navijamo za Kubernetes kao platformu za mikroservise, ali još uvijek cijenimo značajke Spring Cloud-a, tada Spring Cloud Kubernetes daje najbolje od oba svijeta.

Puni izvorni kod primjera dostupan je na GitHubu.