Kubernetes dla .NET Developerów w przykładach dla .NET Core – część 3
W obecnej ostatniej już części uruchomimy prosty klaster w chmurze AWS dokonamy wdrożenia tej samej aplikacji w wielu replikach oraz sprawdzimy działanie LoadBalancera.
W poprzedniej części skupiliśmy się na uruchomieniu lokalnego klastra Kubernetesa oraz dokonaliśmy prostego wdrożenia aplikacji napisanej w .ASP NET 6.0. Teraz pora na wdrożenie!
Klaster Kubernetesa w AWS
Do uruchomienia klastra w AWS wymagane jest konto w tej platformie oraz narzędzi takich jak:
- AWS Client v2.0 (aws.amazon.com/cli/)
- Kubectl (kubernetes.io/docs/tasks/tools/)
- CDK AWS v2.0 (docs.aws.amazon.com/cdk/v2/guide/home.html)
Dodatkowo podczas pracy będziemy używać takich programów jak:
- Curl (curl.se)
- Jq (stedolan.github.io/jq)
W celu uruchomienia klastra w AWS pobieramy przygotowany projekt CDK z definicją takiego klastra:
github.com/mrozim78/aws-cdk-eks-cluster
Jeżeli jest to nasze pierwsze uruchomienie CDK w danym regionie AWS. Powinniśmy zainicjować go w AWS. W tym celu uruchomiamy następujące komendy
cdk bootstrap aws://{NAZWA_KONTA_AWS}/{NAZWA_REGIONU}
W celu utworzenia naszego klastra powinniśmy wykonać najpierw operacje syntezy projektu CDK
cdk synth
Następnie wykonać wdrożenia go w chmurze AWS
cdk deploy EksID-eks
Po 15 – 30 minutach powinniśmy uzyskać informację o utworzeniu klastra. Następnie wykonujemy komendę pobrania pliku config dla naszego klastra
`aws cloudformation describe-stacks --stack-name GravitonID-eks --query "Stacks[0].Outputs[1].OutputValue" --output text`
Sprawdzamy, czy nasz klaster funkcjonuje prawidłowo komendą:
kubectl get nodes
Powinniśmy uzyskać następujący rezultat:
Wdrożenie aplikacji
Aplikacja , którą będziemy wdrażać ulegała małym modyfikacjom od poprzedniego odcinka
github.com/mrozim78/example-microservice-net
Po krótce opiszę co zostało zmienione. Dodano nową strukturę WeatherForecastHeader nagłówka w której przechowywane są atrybuty związane z parametrami maszyny, która serwuje nasz serwis.
Zmieniony został także Controller , który serwuje tą strukturę zamiast poprzedniej listy:
Zmieniony zbudowany na nowo obraz został również podmieniony w DockerHub:
hub.docker.com/r/mrozim78/example-microservice-net
Do katalogu k8s w projekcie został dodany nowy plik example-microservice-net-nlb.yaml wdrożenia naszego projektu na klaster Kubernetesa. Dokonajmy analizy jego zawartości:
Na początku tworzymy nowy namespace o nazwie aspnet. Następne wdrażamy serwis LoadBalancera. Zwróćmy uwagę na adnotacje:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
Informuje ona AWS, że dla LoadBalancera będziemy używać usługi Elastic Load Balancera (ELB) Ostatnią część pliku stanowi definicja wdrożenia naszego obrazu mrozim78/example-microservice-net w liczbie replik 3. W celu wykonania wdrożenia wykonujemy komendę:
kubectl apply -f example-microservice-net-nlb.yaml
Testy wdrożonej aplikacji
Po określonym czasie sprawdzamy czy nasza aplikacja została wdrożona, czyli wykonujemy komendę do pozyskania listy podów:
kubectl get pods --namespace=aspnet
Powinniśmy uzyskać następujący rezultat
Sprawdźmy również czy utworzono dla nas LoadBalancera z zewnętrznym adresem. W tym celu wykonujemy następującą komendę:
kubectl get svc --namespace=aspnet
W jej wyniku powinniśmy uzyskać informację o utworzonym LB
Dokonajmy testu tak utworzonego wdrożenia. Na samym początku zapiszmy naszą długa nazwę literową naszego zewnętrznego LB do zmiennej ELB za pomocą następującej komendy:
ELB=$(kubectl get service aspnet-service -n aspnet -o json | jq -r '.status.loadBalancer.ingress[].hostname')
Wykonajmy następujący skrypt by sprawdzić czy nasz serwis odpowiada oraz by wyświetlić jaki pod nam odpowiada i z jakiego ip oraz nazwy hosta (operacja powtarzamy w pętli 9 krotnie)
for i in {1..9}; do curl -s $ELB/WeatherForecast | jq '.ip , .hostName' ; echo; done
Powinniśmy otrzymać następujący rezultat:
Jak widzimy LB działa prawidłowo i przekierowuje zapytania do losowo wybranego poda repliki.
Podsumowując zauważmy iż praca z Kubernetesem w chmurze AWS jest równie prosta jak na lokalnym klastrze. W celu automatyzacji uruchomienia takiego rozwiązania możemy użyć narzędzia CDK AWS.
To już koniec naszej serii o Kubernetesie w przykładach dla .NET Core. Zachęcam was do samodzielnej pracy z tym rozwiązaniem :)