Sprievodca jarným mrakom Kubernetes

1. Prehľad

Keď vytvárame riešenie mikroslužieb, sú Spring Cloud aj Kubernetes optimálnym riešením, pretože poskytujú komponenty na riešenie najbežnejších výziev. Ak sa však rozhodneme zvoliť Kubernetes ako hlavného správcu kontajnerov a platformu nasadenia pre naše riešenie, stále môžeme využívať zaujímavé funkcie Spring Cloudu hlavne prostredníctvom projektu Spring Cloud Kubernetes.

Tento relatívne nový projekt nepochybne poskytuje ľahkú integráciu s Kubernetes pre aplikácie Spring Boot. Pred začatím môže byť užitočné pozrieť sa na to, ako nasadiť aplikáciu Spring Boot na Minikube, miestne prostredie Kubernetes..

V tomto výučbe budeme:

  • Nainštalujte si Minikube na náš lokálny počítač
  • Vyvinúť príklad architektúry mikroslužieb s dvoma nezávislými aplikáciami Spring Boot komunikujúcimi cez REST
  • Nastavte aplikáciu na klastri s jedným uzlom pomocou aplikácie Minikube
  • Aplikáciu nasaďte pomocou YAML konfiguračné súbory

2. Scenár

V našom príklade používame scenár, keď cestovné kancelárie ponúkajú rôzne ponuky klientom, ktorí sa občas obrátia na službu cestovných kancelárií. Použijeme ho na demonštráciu:

  • objav služby cez Spring Cloud Kubernetes
  • správa konfigurácie a vstrekovanie Kubernetes ConfigMaps a tajomstiev do aplikačných podov pomocou Spring Cloud Kubernetes Config
  • rozdelenie výkonu pomocou pásky Spring Cloud Kubernetes

3. Nastavenie prostredia

V prvom rade musíme nainštalujte si Minikube na náš lokálny počítač a najlepšie ovládač VM, napríklad VirtualBox. Pred vykonaním tohto nastavenia prostredia sa tiež odporúča pozrieť si Kubernetes a jeho hlavné funkcie.

Začnime lokálny klaster jedného uzla Kubernetes:

minikube start --vm-driver = virtualbox

Tento príkaz vytvorí virtuálny stroj, ktorý spúšťa klaster Minikube pomocou ovládača VirtualBox. Predvolený kontext v kubectl teraz bude minikube. Aby sme však mohli prepínať medzi kontextmi, používame:

kubectl config use-context minikube

Po spustení Minikube môžeme pripojiť k palubnej doske Kubernetes pre ľahký prístup k protokolom a ľahkému sledovaniu našich služieb, podov, ConfigMaps a Secrets:

prístrojová doska minikube 

3.1. Nasadenie

Najprv si vezmime náš príklad z GitHubu.

V tomto okamihu môžeme buď spustiť skript „deployment-travel-client.sh“ z nadradeného priečinka, alebo inak vykonať každú inštrukciu jeden po druhom, aby sme dobre pochopili postup:

### zostavte úložisko mvn clean install ### set docker env eval $ (minikube docker-env) ### postavte obrázky ukotvenia na minikube cd travel-agency-service docker build -t travel-agency-service. cd ../client-service docker build -t klientská služba. cd .. ### secret and 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 cestovná agentúra-služba / 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 # Skontrolujte, či sú v podoch spustené kubectl get pods

4. Zistenie služby

Tento projekt nám poskytuje implementáciu pre ServiceDiscovery rozhranie v Kubernetes. V prostredí mikroslužieb zvyčajne existuje viac podov, ktoré používajú rovnakú službu. Kubernetes vystavuje službu ako zbierku koncových bodov ktoré je možné načítať a dosiahnuť z aplikácie Spring Boot bežiacej v podu v rovnakom klastri Kubernetes.

Napríklad v našom príklade máme viac replík služby cestovnej kancelárie, ku ktorej sa pristupuje z našej klientskej služby ako // služba cestovnej kancelárie: 8080. To by sa však vnútorne prejavilo v prístupe k rôznym podom ako napr travel-agency-service-7c9cfff655-4hxnp.

Pás kariet Spring Cloud Kubernetes používa túto funkciu na načítanie rovnováhy medzi rôznymi koncovými bodmi služby.

Service Discovery môžeme ľahko použiť pridaním závislosti spring-cloud-starter-kubernetes na našej klientskej aplikácii:

 org.springframework.cloud spring-cloud-starter-kubernetes 

Mali by sme tiež pridať @EnableDiscoveryClient a vstreknite DiscoveryClient do ClientController používaním @Autowired v našej triede:

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

5. ConfigMaps

Typicky mikroslužby vyžadujú určitý druh riadenia konfigurácie. Napríklad v aplikáciách Spring Cloud by sme použili server Spring Cloud Config.

To však môžeme dosiahnuť použitím nástroja ConfigMaps poskytnutého spoločnosťou Kubernetes - za predpokladu, že ho chceme použiť iba na necitlivé a nezašifrované informácie. Prípadne, ak sú informácie, ktoré chceme zdieľať, citlivé, mali by sme sa rozhodnúť namiesto toho použiť funkciu Secrets.

V našom príklade používame ConfigMaps na serveri služba klientovi Aplikácia Spring Boot. Vytvorme a konfigurácia klienta.yaml súbor na definovanie ConfigMap súboru klient-servis:

apiVersion: v1 by d kind: ConfigMap metadata: name: údaje klientskej služby: application.properties: | - bean.message = Testujem opätovné načítanie! Správa z backendu je:% s

Služby:% s

Je dôležité, aby sa názov ConfigMap zhodoval s názvom aplikácie ako je uvedené v našom súbore „application.properties“. V tomto prípade je to tak klient-servis. Ďalej by sme mali vytvoriť ConfigMap pre klient-servis na Kubernetes:

kubectl create -f client-config.yaml

Teraz vytvorme konfiguračnú triedu ClientConfig s @ Konfigurácia a @ConfigurationProperties a vstreknite do ClientController:

@Configuration @ConfigurationProperties (prefix = "bean") verejná trieda ClientConfig {private String message = "Správa z backendu je:% s

Služby:% s "; // getters and setters}

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

Ak neurčíme ConfigMap, mali by sme očakávať, že sa nám zobrazí predvolená správa, ktorá je nastavená v triede. Keď však vytvoríme ConfigMap, táto predvolená správa bude prepísaná touto vlastnosťou.

Zakaždým, keď sa rozhodneme aktualizovať ConfigMap, správa na stránke sa príslušne zmení:

kubectl upraviť konfiguračnú mapu klient-služba

6. Tajomstvá

Pozrime sa na to, ako fungujú tajomstvá, a to tak, že sa pozrieme na špecifikáciu nastavení spojenia MongoDB v našom príklade. Chystáme sa vytvoriť premenné prostredia na Kubernetes, ktoré sa potom vložia do aplikácie Spring Boot.

6.1. Vytvorte tajomstvo

Prvým krokom je vytvorenie a tajný.yaml súbor, kódujúci používateľské meno a heslo do Základňa 64:

apiVersion: v1 kind: Secret metadata: name: db-secret data: username: dXNlcg == password: cDQ1NXcwcmQ =

Použime konfiguráciu Secret na klastri Kubernetes:

kubectl použiť -f tajomstvo.yaml

6.2. Vytvorte službu MongoDB

Teraz by sme mali vytvoriť službu MongoDB a nasadenie travel-agency-deployment.yaml spis. Najmä v časti nasadenia použijeme Secret používateľské meno a heslo ktoré sme definovali predtým:

apiVersion: extensions / v1beta1 kind: Deployment metadata: name: mongo spec: replicas: 1 template: metadata: labels: service: mongo name: mongodb-service spec: containers: - args: - mongod - --smallfiles image: mongo: latest 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

V predvolenom nastavení je mongo: najnovšie obrázok vytvorí používateľa s používateľské meno a heslo v databáze s názvom admin.

6.3. Nastavte MongoDB v službe cestovnej kancelárie

Je dôležité aktualizovať vlastnosti aplikácie a pridať informácie súvisiace s databázou. Aj keď môžeme ľubovoľne určiť názov databázy admin, tu skrývame najcitlivejšie informácie, ako napríklad používateľské meno a heslo:

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. database = admin spring.data.mongodb.username = $ {MONGO_USERNAME} spring.data.mongodb.password = $ {MONGO_PASSWORD}

Poďme sa teraz pozrieť na našu nasadenie cestovnej agentúry súbor vlastností na aktualizáciu služieb a nasadení pomocou informácií o používateľskom mene a hesle potrebných na pripojenie k mongodb-service.

Tu je príslušná časť súboru s časťou súvisiacou s pripojením MongoDB:

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

7. Komunikácia so stužkou

V prostredí mikroslužieb všeobecne potrebujeme zoznam podov, kde je naša služba replikovaná, aby sme mohli vykonať vyvažovanie záťaže. To sa dá dosiahnuť pomocou mechanizmu poskytnutého páskou Spring Cloud Kubernetes. Tento mechanizmus môže automaticky objaviť a dosiahnuť všetky koncové body konkrétnej službya následne vyplní stužku Zoznam serverov s informáciami o koncových bodoch.

Začnime pridaním jar-oblak-štartér-kubernetes-stuha závislosť na našom služba klientovi súbor pom.xml:

 org.springframework.cloud spring-cloud-starter-kubernetes-ribbon 

Ďalším krokom je pridanie anotácie @RibbonClient k nášmu klient-servis prihláška:

@RibbonClient (name = "cestovná kancelária-služba")

Keď sa vyplní zoznam koncových bodov, klient Kubernetes prehľadá zaregistrované koncové body žijúce v aktuálnom mennom priestore / projekte zodpovedajúcom názvu služby definovanému pomocou @RibbonClient anotácia.

Vo vlastnostiach aplikácie tiež musíme povoliť klienta s nástrojmi:

ribbon.http.client.enabled = true

8. Ďalšie funkcie

8.1. Hystrix

Hystrix pomáha pri vytváraní odolných a odolných aplikácií. Jeho hlavným cieľom je rýchle zlyhanie a rýchle zotavenie.

Najmä v našom príklade používame program Hystrix na implementáciu schémy prerušenia obvodu na Klientsky server anotáciou triedy aplikácií Spring Boot pomocou @EnableCircuitBreaker.

Ďalej používame záložnú funkcionalitu anotáciou metódy TravelAgencyService.getDeals () s @HystrixCommand (). To znamená, že v prípade núdzovej situácie getFallBackName () bude zavolané a správa „Záložné“ vrátená:

@HystrixCommand (fallbackMethod = "getFallbackName", commandProperties = {@HystrixProperty (name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")}) verejný reťazec getDeals () {return this.restTemplate.getForObject ("/ / travel-agency-service: 8080 / Deals ", String.class); } private String getFallbackName () {return "Fallback"; }

8.2. Indikátor zdravia podložky

Môžeme využiť Spring Boot HealthIndicator a Spring Boot Actuator na sprístupnenie informácií týkajúcich sa zdravia používateľa.

Indikátor zdravia Kubernetes poskytuje najmä:

  • názov podu
  • IP adresa
  • menný priestor
  • účet služby
  • názov uzla
  • príznak, ktorý označuje, či je aplikácia Spring Boot interná alebo externá voči Kubernetes

9. Záver

V tomto článku poskytujeme podrobný prehľad o projekte Spring Cloud Kubernetes.

Prečo by sme to teda mali používať? Ak sa zameriavame na Kubernetes ako platformu mikroslužieb, ale stále oceňujeme vlastnosti Spring Cloud, potom Spring Cloud Kubernetes nám dáva to najlepšie z oboch svetov.

Celý zdrojový kód príkladu je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found